もっと minix
夕刻、暑いのを我慢して女房と散歩していると、老婆に呼びとめられた。お年寄りだから 熱中症で調子が悪くなって助けを求めてきたんかいなと、一瞬緊張したよ。
そしたら、『あんたら、ナスや枝豆いらんかね』なんて言うでは無いか。新種の押し売り? かと思っちゃったぞ。でも、その老婆は続けて、『畑でいっぱい出来てしまって、家じゃ食べ切れんから、良かったら持ってって』 と言う。
そうなんだよな。実家で家庭菜園もどきをやってるけど、時期になると本当に食べきれない程 取れ、近所におすそわけしてたっけ。この地では、そういう近所付き合いは無いのかな。 畑に入って、老婆の指導の下、熟れごろのナスと枝豆を採集させて頂きました。
現代でもこんな経験が出来るなんて。。ふと、わらしべ長者の話を思い出してしまったぞ。 ナスと枝豆を持って散歩してると、飲み屋の親父に呼び止められ、丁度、飲み屋で出す つまみが切れてしまったので、そのナスと枝豆を譲ってくれまいか。小銭を切らしてしまった ので、1000円でいいよ。
信心深いおいらは、翌日、霊験あらたな神社によってお祈りして、みずほの窓口へ。 サマージャンボを一点買い。これで、3億円当たる(予感)。
再コンパイル
やっぱり目が行くのは、/usr/src。他に/usr/bigsrcもあるけど、こちらは取り合えず無視ね。 Makefileが有ったので、見てみる。
# cd /usr/src # make Master Makefile for MINIX commands and utilities. Root privileges are required for some actions. Usage: make world # Compile everything (libraries & commands) make includes # Install include files from src/ make libraries # Compile and install libraries make commands # Compile all, commands, but don't install make install # Compile and install commands make depend # Generate required .depend files make gnu-includes # Install include files for GCC make gnu-libraries # Compile and install libraries for GCC make clean # Remove all compiler results Run 'make' in tools/ to create a new MINIX configuration.
worldを用意してるあたり、なかなかリキが入ってますなあ。
# cd tools # make Master Makefile to create new MINIX configuration. Root privileges are required. Usage: make includes # Install include files make depend # Generate dependency files make libraries # Make system libraries make services # Compile and install all services make image # Make needed services and create boot image make install # Make image, and install to hard disk make hdboot # Make image, and install to hard disk make fdboot # Make image, and install to floppy disk make bootable # Make hard disk bootable make clean # Remove all compiler results, except libs To create a fresh MINIX configuration, try: make clean install # new boot image make fresh install # new everything
こちらは、カーネルを作る時だな。ああ、カーネルと言うより、カーネルとその仲間達を 含めて、image と言うのか。言葉は難しい。
# make clean install : install ===> rtl8139 create rtl8139/liveupdate.d create rtl8139/rtl8139.d create rtl8139/.depend compile rtl8139/rtl8139.o compile rtl8139/liveupdate.o link rtl8139/rtl8139 install /usr/sbin/rtl8139 : depend ===> tty/keymaps all ===> tty/keymaps all ===> ramdisk all ===> memory installboot -image image ../kernel/kernel ../servers/ds/ds ../servers/rs/rs ../servers/pm/pm ../servers/sched/sched ../servers/vfs/vfs ../drivers/memory/memory ../drivers/log/log ../drivers/tty/tty ../servers/mfs/mfs ../servers/vm/vm ../servers/pfs/pfs ../servers/init/init text data bss size 79408 27204 348040 454652 ../kernel/kernel 46608 14848 58104 119560 ../servers/ds/ds 47232 20648 192604 260484 ../servers/rs/rs 44496 14064 381524 440084 ../servers/pm/pm 21072 7824 9396 38292 ../servers/sched/sched 68928 19684 392516 481128 ../servers/vfs/vfs 28544 973364 16224 1018132 ../drivers/memory/memory 29296 10896 96332 136524 ../drivers/log/log 57472 20508 146692 224672 ../drivers/tty/tty 50512 14356 35132 100000 ../servers/mfs/mfs 68480 39380 1406708 1514568 ../servers/vm/vm 23360 7856 17940 49156 ../servers/pfs/pfs 24816 9568 3420 37804 ../servers/init/init ------ ------ ------ ------- 590224 1180200 3104632 4875056 total exec sh mkboot hdboot install image /dev/c0d0p0s0:/boot/image/3.1.7r0 Done.
6分ぐらいかかって集合体をコンパイルし、インストールしてくれた。 そして、再起動。Web載ってた案内では、monitor(boot)のsetコマンドを使って、新しい imageを指定するようになってたけど、それをしなくてもいいみたい。
$ cat /var/log/messages : Jul 26 14:01:35 192 kernel: MINIX is open source software, see http://www.minix3.org : Jul 26 14:33:04 192 kernel: MINIX is open source software,(BSD license) :
新しいimageで起動したか分かるように、kernel/main.c にある、announce(void)内を ちょいと変更しておいたけど、ちゃんと変更されたバナーが出てきたよ。
$ cd /boot $ ls -l total 1776 -rwxr-xr-x 1 root operator 32000 Jun 11 11:52 boot drwxr-xr-x 2 root operator 256 Jul 26 14:22 image -rw------- 1 root operator 1784832 Jun 11 11:52 image_big $ ls -l image total 3486 -rw------- 1 root operator 1784832 Jun 11 11:52 3.1.7 -rw------- 1 root operator 1784832 Jul 26 14:22 3.1.7r0
これ、/bootの下の状況です。出来上がったイメージは、レビジョンが付くのか。某VMSみたいだな。 これら全体をどうやってまとめているかは、レシピが、tools/にあった。
$ cat chrootmake.sh #!/bin/sh set -e export SHELL=/bin/sh cd /usr/src make etcfiles make world cd tools rm revision rm /boot/image/* make install cp /boot/image/* /boot/image_big # Make big image accessible by this name cp ../boot/boot /boot/boot cd /usr/src if [ $MAKEMAP -ne 0 ]; then find . -type f -perm 755 | xargs nm -n 2> /dev/null > symbols.txt fi make clean make cleandepend find . -name obj-ack -type d|xargs rm -rf # Let man find the manpages makewhatis /usr/man makewhatis /usr/local/man binsizes normal
先ほどimageを作っている時、xx.dと言う見慣れないサフィクスのファイルが出来て いたけど、こやつは何物ぞ。かにさんドライバーの所を覗いてみた。そして中身は?と言うと、
$ cd /usr/src/drivers/rtl8139 $ ls Makefile liveupdate.d rtl8139 rtl8139.d rtl8139.o liveupdate.c liveupdate.o rtl8139.c rtl8139.h
$ cat rtl8139.d rtl8139.o: /usr/include/ansi.h rtl8139.o: /usr/include/assert.h rtl8139.o: /usr/include/errno.h : rtl8139.o: /usr/src/kernel/type.h rtl8139.o: rtl8139.c rtl8139.o: rtl8139.h
どうやら、makeが使う依存データベースっぽい。曰く、コロンの右側に列挙されてるのに 依存しているとな。これを抽出するのに結構時間がかかっていたぞ。 Makefileを調べると、.includeがあって、そいつを追いかけて行くと、/etc/mkに行き着く。 適当に覗いてみると
# $NetBSD: bsd.prog.mk,v 1.244 2009/12/08 15:18:42 uebayasi Exp $ # @(#)bsd.prog.mk 8.2 (Berkeley) 4/2/94
何やら、NetBSDの上林 さんから借りてきてるみたいで、面白い。
そんじゃ、突然だけど、メモリー割り当てがどうなっているか、見てみる。その現場は、 /usr/src/servers/vm/alloc.c
/*===========================================================================* * alloc_mem * *===========================================================================*/ PUBLIC phys_clicks alloc_mem(phys_clicks clicks, u32_t memflags) { /* Allocate a block of memory from the free list using first fit. The block * consists of a sequence of contiguous bytes, whose length in clicks is * given by 'clicks'. A pointer to the block is returned. The block is * always on a click boundary. This procedure is called when memory is * needed for FORK or EXEC. */
MINIX本と同じだな。clicksってのは、minix専用の単位かどうか知らないけれど、16byteの 事だ。これも例の糞CPU由来なのだろうか?(セグメントは、4bitシフトしてるんで、16byte 単位でのメモリー割付になるというやつ)まあ、このあたりは、mallocと同じアルゴリズムかな。そして GCと言うか、返却されたメモリーは、未使用リスト(minix用語では、穴リスト)をスキャンして 、大きなブロックに結合出来れば、結合してしまう。GCとかを勉強した身からすれば、やけに 簡単に済ませているけど、スピード命って観点からすれば、そうせざるを得ないのだろうな。
Macではまる
minix3に進化して、ソースも大分増え、機能も充実してきたけど、基本はminix1.xの頃と 何も変わっていないな。よって、勉強するなら、minix本を元にするのがよさそう。 minix1.xのソースを、すいすいと飛びまわれるようにしておくかな。えっと古いソースは?
古いやつ と、お思いでしょうが、そんなに 変わるもんじゃありません。intel-1.1 あたりを取ってくるか、Macintoshを取ってくるか? Macだと、ひょっとして、68000な石なんだろうか?
悩んでるより、手を動かせ。Macintosh.tar.gzを取ってきたのはいいんだけど、展開すると MacMinix_1.5.10.7.sea.hqxなんてのが出てきた。えっと、どうするんだったけな? ports/archivers/macutilsを入れれば、取り合えず何とかなるんでないかいな。
[sakae@cdr ~/mac/Macintosh]$ hexbin MacMinix_1.5.10.7.sea.hqx [sakae@cdr ~/mac/Macintosh]$ macunpack MacMinix_1.5.10.7.sea.bin
hexbinって、unixで言うuudecodeね。macunpackって、Mac界のunzip。すっかり記憶が 飛んでるなあ。
[sakae@cdr ~/mac/Macintosh]$ ls -l total 20128 drwxr-xr-x 2 sakae kuma 1024 7 27 11:37 1.5.10.7_patches__/ -rw-r--r-- 1 sakae kuma 192512 7 27 11:40 MacBoot.bin -rw-r--r-- 1 sakae kuma 3975680 7 27 11:41 MacMinix_1.5.10.7.sea.bin -rw-r--r-- 1 sakae kuma 5403977 7 23 2005 MacMinix_1.5.10.7.sea.hqx -rw-r--r-- 1 sakae kuma 524416 7 27 11:40 ROOT.bin -rw-r--r-- 1 sakae kuma 163968 7 27 11:40 ROOT.small.bin -rw-r--r-- 1 sakae kuma 10240128 7 27 11:41 USR.bin
出来たのはいいけど、FreeBSD上じゃ、mount出来ないし、、、minix3へ持って行っても、mdcoonfig みたいな便利なのは無いし、これはもう諦めるしか。(Macのエミュレータないかな? ジョブス さんよ。iPadに軸足を移しちゃったから、昔のMACOSは、オープンソースで公開してね。 MacPaintのソース公開ぐらいでは、 騙されないもんね。 そしたら、iPadぐらいは、買ってやるよ。)
md
まてよ、諦めるのは早いかも知れないな。取り合えず mountがどうなっているか調べてみる。 mountって普通のコマンドだよな。
$ cd /usr/src/commands/mount $ emacs mount.c : device = argv[1]; if (!strcmp(device, "none")) device = NULL; if (mount(device, argv[2], mountflags, type, args) < 0) { err = strerror(errno); fprintf(stderr, "mount: Can't mount %s on %s: %s\n", argv[1], argv[2], err); exit(1); } /* The mount has completed successfully. Tell the user. */ printf("%s is read-%s mounted on %s\n", argv[1], mountflags & MS_RDONLY ? "only" : "write", argv[2]); /* Update /etc/mtab. */
はあ、mountを呼んで、結果を報告し、/etc/mtabを更新してるんだ。そうすると、肝はmount(2)だな。
$ cd /usr/src/servers/vfs $ emacs mount.c : /*===========================================================================* * do_mount * *===========================================================================*/ PUBLIC int do_mount() { endpoint_t fs_e; int r, proc_nr; /* Only the super-user may do MOUNT. */ if (!super_user) return(EPERM);
このあたりだな。ちらちらと見て行くと、rootじゃなきゃ駄目よとかブロックデバイス じゃなきゃ駄目よとか厳しくチェックしてる。でも、minix3とminix1では、様変わりしてるなあ。 ここに、mdconfigを紛れこませようとしたら超大変。そもそも、FreeBSDのmdconfigって何よ?
MD(4) FreeBSD Kernel Interfaces Manual MD(4) NAME md -- memory disk SYNOPSIS device md DESCRIPTION The md driver provides support for four kinds of memory backed virtual disks:
そっか、minixならramdiskへ紛れこませるって手があるな。それより、Mac-minixに、68000 のコードが含まれているのだろうか? 先にちょいと調べておく。
$ strings -20 USR.bin | more : _SetCTitle: link a6,#0 movem.l d2/a5,-(sp) pea 0xc(a6) jsr __cstringtopstring add.l #0x4,sp tst.l savedsp beq LL36 move.l a7,a0 move.l savedsp,a7 move.l a0,-(sp) LL36: move.l 0x8(a6),-(sp) move.l 0xc(a6),-(sp) move.l saveda5,a5 .data2 0xa95f tst.l savedsp beq LL37 move.l (sp)+,a7 :
おお、懐かしの68kアセンブラーだ。