uv6
買うか、買わないか、それが問題だ
2年ぶりにウブのLTSが出て、日経LinuxはDVDが付属になってる。過去に2度程、ご祝儀でこのDVD目当てに雑誌を購入してたんだ。今年もそうする?
前回の20.04LTSの賞味期限は、2025まであるからなあ。手元に1枚あれば十分と言う気分が蔓延してますよ。んでもって、 Linux は使うのに Ubuntu は使わない人の 6 つの理由 こんなのをみてる。ウブ独自色強過ぎじゃなかろうか。
独自色なら、 Arch インストールガイド こういうのが楽しそうだ。 Arch Linuxのインストール こういう人も居るし、泣きながら5回ぐらい、インストールの練習をすれば、上手くなるだろう。 ISOファイルでの供給しかないようだけど、ddを使ってUSBに焼き込めば済むみたいだしね。
これ、今使ってるWindows10なマシンがクラッシュして、それを機会にリナを入れる亊を想定してます。今のうちに一つ作っておくかな。ついでに、VirtualBOXあたりを舞台にして訓練かな。
ついでにSoftware Designも見ておく。第一特集は、Vimの基本大全 ですか。繰り返される特集だな。その言い訳は
Vim(vi)は,Linuxはもちろんのこと,macOSにも,Windows(Windows Subsystem for Linux)にも 標準で備わっているエディタです。つまり,基本的な操作さえ習得しておけば, どんな環境でもターミナル上でVimを起動するだけで簡単に作業を行えます。
vimって肥大化してて、もしもの時にちゃんと使えるのか?
vbox$ ldd /bin/ed
/bin/ed:
Start End Type Open Ref GrpRef Name
08adb000 28ae4000 dlib 1 0 0 /bin/ed
vbox$ ldd /usr/bin/vi
/usr/bin/vi:
Start End Type Open Ref GrpRef Name
1982c000 3982f000 exe 1 0 0 /usr/bin/vi
0df54000 2df58000 rlib 0 1 0 /usr/lib/libcurses.so.14.0
052d3000 252d5000 rlib 0 1 0 /usr/lib/libutil.so.16.0
065f2000 26603000 rlib 0 1 0 /usr/lib/libc.so.96.1
03f62000 03f62000 ld.so 0 1 0 /usr/libexec/ld.so
OpenBSDのもしもの為のeditorはedさ。依存無しのすっきり版です。
sakae@atom:~$ ls -l /usr/bin/vi
lrwxrwxrwx 1 root root 20 Mar 1 2018 /usr/bin/vi -> /etc/alternatives/vi*
sakae@atom:~$ ls -l /etc/alternatives/vi
lrwxrwxrwx 1 root root 17 Jul 13 2019 /etc/alternatives/vi -> /usr/bin/vim.tiny*
sakae@atom:~$ ldd /usr/bin/vim.tiny
linux-vdso.so.1 (0x00007fffdafe5000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f7c529e0000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f7c529b0000)
libacl.so.1 => /usr/lib/x86_64-linux-gnu/libacl.so.1 (0x00007f7c52a10000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7c527e0000)
libpcre2-8.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f7c52740000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7c52730000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7c52b82000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7c526fe000)
Windows10に入ってるWSLなデビアンバージョン。viの正体はvim.tinyって奴だった。なんか怖いんですけど。。。
gdbでリンクを追う
リンクリストの確認方法
(gdb) p token
$20 = (Token *) 0x5555555592a0
(gdb) p *$
$21 = {
kind = TK_NUM,
next = 0x5555555592d0,
val = 2,
str = 0x7fffffffe69d "2+4+6",
len = 1
}
(gdb) p *$.next
$22 = {
kind = TK_RESERVED,
next = 0x555555559300,
val = 0,
str = 0x7fffffffe69e "+4+6",
len = 1
}
(gdb) p *$.next
$23 = {
kind = TK_NUM,
next = 0x555555559330,
val = 4,
str = 0x7fffffffe69f "4+6",
len = 1
}
データの検査 値履歴 に出てた。
これ、前回やったコンパイラーの卵を観察してた時に、どうすればよいか疑問に思ったのだ。 問題をたてて、自分で解決って、こんな楽しい亊はないぞ。
低レイヤを知りたい人のためのCコンパイラ作成入門 何度も載せるけど、良ページだ。
pick source
これまた、前回からの引っ張りで、uv6に触ってみてます。ええ、世間的には、カーネルの探検が流行みたいだけど、オイラーはへそ曲がりなんで、ユーザーランド側の観光です。
で、手始めに、 uv6のデータを吸い出す方法。下記の例では、ファイルの在処をカタログ化し、それを表示。
vbox$ ./oboot
PDP-11 simulator V3.9-0
./oboot> #!/usr/local/bin/simh-pdp11
Unknown command
Disabling XQ
@unix
login: root
#
# find / -print > /usr2/CATLOG
# cat /usr2/CATLOG
:
# ;; <-- CTL-E
Simulation stopped, PC: 021630 (MOV (SP)+,177776)
sim> ;; <-- CTL-Z
sim> [1] + Suspended ./oboot
vbox$ tlog
vbox$ fg
./oboot
;; <-- RET
sim> c
;; <-- RET
# pwd
/
#
pdp11なエミュレータはCPUを非常に消費する。よって、uv6上にずっと居座るのはよくない。そこで、uv6上のソースをOpenBSDに取り出してゆっくり鑑賞すれば良い。
catでお目当てのソースを垂れ流し。CTL-Eでエミュレータを停止。CTL-Zでエミュレータを裏にまわず。これでOpenBSDのshellに戻るので、tlogでuv6のコンソールログ(=ソースの表示結果)を作成。fgでエミュレータを表に持ってくる。そこでc(ont)すれば、再びuv6が使える。後はこのサイクルを繰り返す。
alias tlog='tmux capture-pane -p -S -1500 > TMUX.log'
tlogは、こんなエイリアスだ。単にtmuxのコンソール・ログをファイルに落しているだけ。大体1500行ぐらいログすればuv6の場合、十分だろう。
man
man原稿はあるのに肝心のmanコマンドがない。まだ、ページャーになるmoreが開発されていないんで、躊躇したのかな? そんな時は
Unix Seventh Edition manual なんて所で、引けばいいのかな。時代的に近いでしょうからね。
これ、FreeBSDからの提供。リナのマニュアルも豊富に取り揃えていて、心が広いなあ。
因みにmoreが現れたのは
HISTORY
A more command appeared in 3.0BSD. The present implementation is
actually less(1) in disguise.
時代がずっと新しくなってからなのね。
bsd-family-tree
前回はUNIXの年表を出したけど、FreeBSDの資料としても掲載されてた。あくまでBSD系とその祖先に注目したものね。世間を席巻してるリナは蚊帳の外です。これぞBSDの心意気! /usr/share/misc/bsd-family-tree
Multics 1965
UNIX Summer 1969
DEC PDP-7
First Edition 1971-11-03 [QCU]
DEC PDP-11/20, Assembler
Second Edition 1972-06-12 [QCU]
10 UNIX installations
Third Edition 1973-02-xx [QCU]
Pipes, 16 installations
Fourth Edition 1973-11-xx [QCU]
rewriting in C effected,
above 30 installations
Fifth Edition 1974-06-xx [QCU]
above 50 installations
Sixth Edition 1975-05-xx [QCU]
port to DEC Vax
:
こちらに全貌が掲載されている。 freebsd-src/share/misc/bsd-family-tree
ed
訓練、訓練、edを思い出せ!
edは難しいので、初心者と上級者用の資料が提供されてる。 /tmp/ed/USD.doc/09.edtut
vbox$ cat Makefile
# $OpenBSD: Makefile,v 1.2 2004/02/01 15:21:55 jmc Exp $
DIR= usd/09.edtut
SRCS= e.mac e0 e1 e2 e3 e4 e5 e6 e7
MACROS= -ms
paper.txt: ${SRCS}
mandoc -Tascii ${SRCS} > ${.TARGET}
# ${ROFF} -Tascii ${SRCS} > ${.TARGET}
#.include <bsd.doc.mk>
roff用の原稿なのでコンパイルして使えとな。bsd.doc.mkはOpenBSDでは削除されてるけど、FreeBSDだと/usr/share/mk/内に用意されてる。持ってくるのは面倒なのでなしでやる。
vbox$ make mandoc -Tascii e.mac e0 e1 e2 e3 e4 e5 e6 e7 > paper.txt
A Tutorial Introduction to the UNIX Text Editor Brian W.
Kernighan Murray Hill, NJ
Creating Text - the Append command ``a''
As your first problem, suppose you want to create some text
starting from scratch. Perhaps you are typing the very first
draft of a paper; clearly it will have to start somewhere, and
undergo modifications later. This section will show how to get
some text in, just to get started. Later we'll talk about how
to change it.
著者はあの有名な方。ちょいと一節を採り上げてみた。これをDeepLとかの翻訳機にかければいいんだけど、変な所に改行が入っているので、不都合な真実になってしまう。
そこでJコマンドですよ。Asの所にカーソルを移動して、5J すれば、5行分連結してくれる。後は、それを貼り付ければよい。
use ed
簡単な使いかた
vbox$ ed a ;; command append first line ;; text in 2nd line ;; text in . ;; end of command a w sample ;; write to file 20 ;; 20 char writed q ;; quit
修整方法
vbox$ ed sample 20 ;; pointer is EOF 1 ;; so goto line 1 first line ;; echo line 1 s/first/1st/ ;; change, like sed p ;; check line 1st line w 18 q
GNU/ed
リナにも勿論edは用意されている。但し今更感が有るので、普通は入っていないだろう。 で、ソースをお取り寄せ。んが、見たこと無いサフィックスが付いていた。ファイルの正体を白状させてみる。
[sakae@fb /tmp]$ file ed-1.18.tar.lz ed-1.18.tar.lz: lzip compressed data, version: 1
知らないアプリだなあ。オイラーに通知しないで勝手に採用しないでくれるかな。アーカイバーのセクションで聞いてみる。
Lzip is a lossless data compressor with a user interface similar to the one
of gzip or bzip2. Lzip decompresses almost as fast as gzip and compresses
more than bzip2, which makes it well suited for software distribution and
data archiving. Lzip is a clean implementation of the LZMA algorithm.
To extract all the files from archive 'foo.tar.lz', use the commands
'tar -xf foo.tar.lz' or 'lzip -cd foo.tar.lz | tar -xf -'.
リナのtarは賢いので勝手に判断してくれる。BSD系はそこまで手が回らないので、パイプを経由して展開とな。
pdp11 Assembler
Farba Research PDP-11 Assembly Language Example
483ページぐらいからasの説明があるけど、いまいちピンとこない。こういう時はソースにあたるのが一番だな。
目標は、pdp11のアセンブラーで、言わずと知れたハロワって表示する亊。何せどこを見ても汚ないX86がのさばっていますから。
from bas は、printをどうやって実現してるかの参考。
mov $1f,r0
jsr pc,print
br loop
1:
<Cannot open file\n\0>; .even
print:
mov r0,wbuf
jsr pc,size
mov r0,wlen
mov prfile,r0
sys indir; syswrit
rts pc
syswrit: sys write; wbuf: 0; wlen: 0
from cat は、一文字表示をどうやってるかの参考。
movb (r3)+,r0
jsr pc,putc
dec r4
bne 4b
br 3b
putc:
movb r0,(r2)+
cmp r2,$obuf+512.
blo 1f
mov $1,r0
sys write; obuf; 512.
mov $obuf,r2
1:
rts pc
.bss
ibuf: .=.+512.
obuf: .=.+512.
fin: .=.+2
.text
from chown
.globl fopen, getc, mesg
mov sp,r5
mov (r5),r4
cmp r4,$3
bge 1f
jsr r5,mesg; <chown uid f1 ...\n\0>; .even
1:
add $4,r5
mov (r5),r3
cmpb (r3),$'0
blt 1f
cmpb (r3),$'9
bgt 1f
jsr r5,cvnum; geta
br do
1:
mov $uids,r0
jsr r5,fopen; ubuf
bec 1f
jsr r5,mesg; <Can't open /etc/uids\n\0>; .even
sys exit
ここに出て来るmesgっての使えそう。でも、グローバル宣言してるよ。まさかアセンブラーが良きに計らってくれる訳ではないだろう。chgrpコマンドをどうやって作成してるか、Makefileもどきなrunを確認してみる。
as chgrp.s ld -s a.out -l cmp a.out /bin/chgrp cp a.out /bin/chgrp
何と、リンカーで、ライブラリィーをリンクしてるよ。ここまで分れば、ライブラリィー探索だな。
# cat /usr/source/s3/mesg.s
.globl mesg
/ usage:
/ jsr r5,mesg
/ <string ending in \0>
/ .even
/ ...
/
/ string is output onto $1
/
mesg:
mov r0,-(sp)
mov r5,r0
mov r5,0f
1:
tstb (r5)+
bne 1b
sub r5,r0
com r0
mov r0,0f+2
mov $1,r0
sys 0; 9f
.data
9:
sys write; 0:..; ..
.text
inc r5
bic $1,r5
mov (sp)+,r0
rts r5
注釈に出てる、$1 って、今で言う stdout になるのかな。いや普通に考えたら、ただの数値だろう。それをunixでは、ある場面に於てstdoutって解釈してるだけ。コンピュータは、何でも数値で表すからね。
[sakae@fb ~/uv6]$ egrep '(getc|putc).s' CATLOG /usr/source/s4/getc.s /usr/source/s5/putc.s
これらを見れば、はっきりするな。何か探偵物語っぽい。
超簡単な例
vbox$ cat hw.s
/ pdp11 Assembler
.globl mesg
jsr r5,mesg; <Hello World\n\0>; .even
sys exit
/ as hw.s
/ ld -s a.out -l
/ chmod 755 a.out
セミコロン区切は、複文になる。
JULIAN::MOV R0,-(SP) ;SAVE R0
MOV R1,-(SP) ;SAVE R1
:
MOV (SP)+,R1 ;RESTORE R1
MOV (SP)+,R0 ;RESTORE R0
こんな例が有るから、mv src,destって並びなのかな。これ何時も悩むのよ。取って置きの覚えかた。unixの生まれ故郷はベル研。親会社はAT&T。だから、AT&T記法なのさ。素直に左から右に読む。from to式ね。
インテルは臍曲がりだから、to from の順番。作っている石も、元々は電卓用なんで、極少数の人間がかかわるだけだった。だから設計上の都合で、色々な制限があっても気にしなかった。でも、悪貨が良貨を駆逐するのたとえのごとし、世の中に広まってしまった。みんな大迷惑ですよ。
だから、アセンブラをやるなら綺麗な設計のPDP11ね。今更16Bitと言うなかれ。楽しければそれでいいのだ。