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

PDP-11

Farba Research PDP-11 Assembly Language Example

UNIX PROGRMMER'S MANUAL (7th)

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と言うなかれ。楽しければそれでいいのだ。


This year's Index

Home