Here are typos in japanese translation of Minix 3 book.
これは、私、および、一緒に本を読んでいる方々が気がついた、「オペレーティングシステム 設計と実装 第3版」タネンバウム他 著、吉澤康文、木村信二他 訳、の、誤植、誤訳のおぼえがきです。
出版社、訳者のお目にとまり、次の印刷に反映されれば、うれしいです。
2007年12月25日発行の、第1刷に関します。
おわび: このページは、昔、googlepages.com にありましたが、sites.google.com に移りました。私は、 Google 社が、自動的に内容を移行してくれるオプションを選んだつもりでしたが、本日、そうなっていないことに気がつきました。おそれいりますが、リンクをはりなおしてください。2010年1月 神田
30ページ renaem => rename, unmask => umask
35ページ
誤
SIGINT のシグナルを ignore するのは、好ましくない、と訳されているが、
正
キーボードからの DEL シグナルが、バックグラウンドプロセスに影響するのは好ましくないために、
シェルは、 DEL と quit シグナルを無効にするために、 signal(SIGINT, SIG_IGN); を実行する。
SIG_ING => SIG_IGN
41ページ
誤
その他の操作コードには、。。。指示する機能がある。
正
その他の操作コードには、すべての出力が完了するまでシステムの変更を先に延ばす機能、未読文字の入力を捨てる機能、現在の値を返す機能、がある。
(360ページに出てくる、 TCSETSW, TCSETSF, TCGETS のことですが、第1章に書くには細かすぎる話ですね。)
58ページ 問題18。
誤
Windows は新しいプロセスを生成する fork のようなシステムコールをまだもっていない。
正
Windows は、fork システムコールを持っていないが、新しいプロセスを生成することができる。(どういうしかけなのだろう、と続く。)
120ページ 上から11行目。メモリマップの変更、とあり、原文でもそうですが、スレッドの切り替えは、同一アドレス空間の中なので、メモリマップは同じでないですか。
120ページ 上から16行目。2番目のプロセス => スレッド
124ページ 12行目。PMは、プロセス実行とシグナルに関するすべてのシステムコールを処理する。(大意)
154ページ 18行目。四つマクロ => 四つのマクロ
154ページ 下から13行目。とう解釈 => という解釈
171ページ 下から15行目。
誤
最古のPC互換のコンピュータを除いた典型例である。
正
最古のPC互換のコンピュータ以外では典型的にみられる。
173ページ 21行目。
誤
例外割り込み処理から始めよう。
正
コードの説明の仕方についての方針を示したが、その例外から始めることにする。
176ページ
これは誤植でもなんでもないのですが、ソースコードの7205行で、 text_base を e_hdr.a_syms から得ています。
これは、本来 a.out オブジェクトヘッダの、シンボルテーブルのサイズを入れてあるフィールドなのですが、 ブートモニタ、 boot/bootimage.c が、MINIX をメモリにロードするときに、使ってないこのフィールドに、ロードされる物理アドレスを入れておいてくれているのです。
ここは、プロセスごとのメモリマップと、セグメントレジスタが決まる、カーネル初期化処理の核心部ですから、ひとこと、説明がほしいところです。
219ページ 20行目。まる2日であふれて => 2年
259ページ 7行目。
誤
自動的にOS自身を停止させる。
正
自動的にデッドロックを解決することもない。
277ページ 上から6行目。ユーザプロセスが閉塞 => ブロック
279ページ 4行目。一緒にコンパイルされるため => されるならば(MINIX3 では実際は、されない)
281ページ 上から5行目。仕様が書かれていれば => いなければ
284ページ 15行目。ごくわずかである => 昔のこんせきである
306ページ 下から13行目。
誤
I/Oポートのプローブは、制御を支配する他のデバイスを活性化し、
正
I/Oポートのプローブは、他のデバイスを活性化し、それが制御を奪って、
312ページ 10行目。
原文にないですが、以下を補足したいです。
本では述べられていませんが、 sys_irqsetpolicy の大きな役割は、割り込みと、メッセージを対応付けることです。
この関数は、本にはのっていない、 kernel/system/do_irqctl.c で実装され、引数で指定された割り込み番号と、コール元プロセスIDの組を記録します。
ATディスクの場合、CPUにとっての割り込みハンドラは、6607行の hwint14 です。そこから、8221行の intr_handle が呼ばれ、さらに、前記 do_irqctl.c の、 generic_handler が呼ばれます。
generic_handler は、割り込み番号14に対応したATドライバプロセスに、 HARD_INT notify メッセージを送ります。
これが、ATドライバのメインループで、 receive されるわけです。
200ページに、generic_handler の説明がありました。ここでは、 sys_irqctl と書いてありますが、 sys_irqsetpolicy は、 include/minix/syslib.h で定義される、sys_irqctl を呼ぶマクロです。
331ページ 下から8行目。ラインフィードを付加えた => 加えた
362ページ 1行目。
デーモンはエラーメッセージを書くことが出来なくてはいけない。もしその出力がファイルにリダイレクトされていないなら、それはクローズされることのないディスプレイに行くべきである。
( /dev/log は、このための、制御ターミナルにならない特殊なディスプレイである、と続く。)
427ページ 下から4行目。
誤
(大意)行を n ビットのバイナリ値として見て、もっとも小さな値のものを
正
(大意)原文でもそうですが、ここでは、立っているビットの数だけが重要のはずです。
バイナリ値として見るべきなのは、次のエージングの話で、右シフトしてゆくからです。
437ページ 6行目。-se/p2 => -se/p の2乗
438ページ 9行目。
誤
このアイデアは、。。。技術的には可能だが必然性はない。
正
このアイデアは、ネットワーク上の複数プロセスでページの集合を共用しようというものである。ページは単一の共用されたアドレス空間として見えることになる。ただし、これ、単一アドレス空間、は必須ではない。
443ページ 5行目。
誤
コンパクションの議論で扱うことができる。
正
コンパクション(403ページを参照)で対策できる。
458ページ 8088ハードウエアには のパラグラフ
(大意)
8088ハードウエアには、スタック領域上限割り込みがなかったので、昔のMINIXは、スタックがデータセグメントを侵食しても何も出来なかった。
次の brk システムコールで、OSがSPを読んで気が付いた。
インテル32ビットプロセッサでは、前記割り込みがあるので、スタックオーバーフローしたときに、セグメントを更新することができるが、
MINIX3ではそうしなかった。理由を、以下に説明する。
458ページ 最終行のパラグラフ
(大意)
スタックとデータのセグメントを共用し、MINIX3がこのギャップを再割当するという、昔からの方法をやめる、という案もある。
その代わりに、ハードウエア機能でスタックとデータセグメントを分ける管理方式は、安全であるが、メモリを食う(なぜ?)。
(472ページの脚注に、 brk の実装の話がありますが、どうもこのあたりのスタックとデータセグメントの話、よくわかりません。)
463ページ 13行目。
誤
オープンしなければならない。
正
オープンする。
470ページ 6行目。
誤
PM,ファイルシステム。。。が同時に消滅する。
一般的にいうなら、。。。プロセスグループに対して送信されることになるので
正
PM,ファイルシステム。。。に影響する。
一般的にいうなら、。。。送信されることがあるので
470ページ 下から9行目。よて管理される => よって
472ページ 19行目。
誤
sigaction システムコールを実行して完了
正
シグナルハンドラが終了するとき sigreturn システムコールが実行されるようにする。
474ページ 図4-43の、 (c) の ret addr2 の下のローカル変数に、(sigreturn) が必要。
477ページ 5行目。
正
PC BIOSへのコールは、多くの割り込みを見逃すおそれがあるので、うめあわせるための特別の仕掛けを用意している。
477ページ 11行目。
誤
カーネル空間に対してアラーム設定の要求を
正
カーネル空間でのアラーム設定を要求される
480ページ 18行目。スタック作られて => スタックが作られて
484ページ 下から6行目。
誤
588KB以下の領域に制限されていて
正
588KB以下の領域には十分なメモリがあり、いくつかのコンポーネントを入れることが出来る。(しかし、使ってない、と続く。)
486ページ 下から12行目。初期化中にある => 初期化が終わった
488ページ 9行目。
正
get_free_pid は、その名前どおりの事をする。
490ページ 下から3行目。
正
問題の可能性があるとワーニングを出すフラグ類
496ページ 下から3行目。
正
POSIXはプロセスが自身のシグナル処理を変更することを許しており、(シグナルハンドラから、アクションを設定したり、デフォルトに戻すことができる、と続く。)
497ページ 17行目。
正
1回の kill コールは、複数のプロセスからなるプロセスグループにシグナルを配信することを要求することもあり、
505ページ 16行目。
正
ファイルシステムは、このプロセスを、コントロール端末を持たないセッションリーダーにするという作業を完了する。
506ページ 15行目。
誤
(たぶん彼自身から見て)
正
(もしかすると彼自身のプロセスも含めた)他のプロセスに、と続く。
506ページ 下から4行のパラグラフ
(大意)
このスケジューリングは、カーネルで行われるので、PMが関与する必要はない。
しかし、 nice システムコールはPMを経由して、 sys_nice カーネルコールとなってシステムタスクに行く。PMは、メッセージの中継をするだけである。
511ページ 問題8。
MMUの物理的な位置=>論理的
518ページ 21行目。
誤
現行のOSでは
正
現行のすべてのOSでは
519ページ 下から2行目。
誤
file.doc を編集できる最初のファイルとして、 Microsoft Word が
正
file.doc を最初に編集するべきファイルとして、 Microsoft Word が
529ページ 下から4行目。
誤
その特徴を理解しないのとは特に違いはないだろう。
正
その使いみちがわからなくても、気にすることはない。(複数ディレクトリサポートに、どうせ、コストはかからないのだから、と続く。)
534ページ 13行目。
誤
格納されていパーティション
正
格納されていない
535ページ 10行目。
誤
サブパーティションを増やすことが出来ないのは問題である。
正
このようにすれば、1つのサブパーティションの問題(満杯、など)は別のサブパーティションに伝わらない。
536ページ 11行目。
誤
スペシャルファイルが発生
正
回転待ち
543ページ 13行目。
誤
多くの場合
正
ファイル名を格納するのに必要なだけの数の(図5-14のような、と、続く。)
550ページ 22行目。
誤
原因になどで
正
原因などで
551ページ 3行目。
誤
1セクタ以上存在している。
正
トラックは以下の目的のために、1セクタ以上の余分の領域を持つ。
551ページ 11行目。
誤
本メッセージをユーザ出始めたら
正
本メッセージが出始めたら
551ページ 14行目。
誤
不良ブロックを注意深く構成する。
利用ない
正
不良ブロックをすべて使うファイルを作る。(302ページを参照。)
利用されない
552ページ 11行目。
誤
ススペシャルファイル
正
スペシャルファイル
552ページ 下から2行目。
正
ファイルとディレクトリの将来の変更は、現物をその場で書き換えるのではなく、該当のブロックをコピーするように要求する。
558ページ 11行目。
誤
ディスクから削除された後
正
ディスクが廃棄された後
558ページ 下から5行目。
誤
ため果
正
ためか
567ページ 2行目。
誤
ビジネスに関係なく
正
関係のない場所をかぎまわる人々を
576ページ 下から4行目。
正
簡単に気が付く、OSあるいは類似のシステムのバグ、これは、侵入者を現行犯で捕まえるためのものである。
601ページ 17行目。
誤
ヒープの名前を
正
ヒープ上の名前を(可変長文字列が、最後にまとめられている、という実装)
605ページ 9行目。
誤
OSはロックを共用しないが
正
OSはロックを強制しない。プロセスは、行儀よくふるまい、何か他のプロセスと競合する可能性のある事をする前に、ファイルにロックがかかっているか調べることが求められる。(アドバイザリであることの説明)
609ページ 下から1行目。
誤
inode は1つの構造体で
正
inode は、 MINIX 3 で変わらなかった構造体の1つで
617ページ 8行目。
誤
手続きを補助する
正
補助手続きが必要な
629ページ 下から8行目。
誤
大く
正
多く
633ページ 下から11行目。
誤
ブロックを突然消去する
正
突然ファイルの途中にあるブロックをクリアする
637ページ 下から13行目。
誤
これから削除されるファイルが
正
これから削除されるファイルシステム上のファイルを開いていたり、ワーキングディレクトリを持っているプロセスがないのを確認することである。
645ページ 17行目。
誤
通知は偽造することが可能
正
通知は、誤りのこともある( bogus の訳ですが、 notification の空振り、の意味と思います。)
645ページ 下から5行目。
誤
以下の一文が欠落。
正
dev_io がドライバからの応答を待っている間、ファイルシステムは待つ。(ここでは内部マルチプログラミングは、と続く。)
650ページ 19行目。
誤
従来通りのOS設計であるモノリシックカーネル
正
従来通りのOS設計であれば、( MINIX 3 は、違う)
653ページ 問題24。
誤
inode のコピーを、 inode テーブルとしてメモリ上にフェッチして検索
正
テーブル全体を検索して、inode がすでにあるか確認するよりも、新しい inode のコピーを inode テーブルに読み込む方が簡単で高速である。
(オープンのたびに、 inode テーブルに、重複を許してエントリを増やすという主張でしょうか。)
739ページ ソースコード4606、4607行
_POSIX_SOURCE, _MINIX に、余分な空白があります。
742ページ ソースコード4849行。
誤
プログラムスタック語
正
プログラムステータス語
(原文でも program stack word ですが、変です。)
759ページ ソースコード6422行。モニタでは、メモリの粒度を => モニタのため
760ページ ソースコード6429行。欠落 => ディスアセンブラを同期させるための( nop )
760ページ ソースコード6444行。欠落 => カーネルのアドレス空間に、モニタの global descriptor table をコピーして、そこに移る。 prot_init が、さらに、それ、 gdt を更新して、(直後の6487行の lgdt で)有効になる。
761ページ ソースコード6484行。ディスクリプタテーブルの集合 => prot_init によりセットアップされた gdt を、指すように、gdtr, idtr and the segment registers を再ロードする。
761ページ ソースコード6498行。TSS以外は => 他のTSSは使わない。
(補足すると、TSSは、タスクに1つでなくて、グローバル変数 tss 8358行、に1つだけあり、割り込み時のスタックポインタを、6693行でタスクスイッチのときに差し替えながら動く。)
761ページ ソースコード6500行。良好な状態を知るために => flags を既知の良好な状態にする。
761ページ ソースコード6529行。マクロの拡張 => マクロの展開
777ページ ソースコード7605行。dst を相互に送り => dst が、相互に送りあっている
782ページ ソースコード7878行。
誤
中にあっても無限ループを得られる。
正
(高い優先度プロセス)の、無限ループを捕捉することが出来る。
784ページ ソースコード8038行。閉められていない => (ページフォルトと、 SEGV は)ちょっと違う
816ページ ソースコード10342行。mark 完了 => 終端にしるしをつける
903ページ ソースコード15903行。
6845までは => 6845にとっては
969ページ ソースコード20466行。不成立 => フォールスルー(適切な訳語はなんでしょうね。)
1009ページ ソースコード23740行。ディスクリプタ画 => ディスクリプタ
1023ページ ソースコード24587行。filp スロットが有効か => 空きがあるか
24596行。
今、ファイルを作成した。
EEXIST 以外のエラー。
24611行。ファイルを作成したのでなければ、通常のオープンのコードを実行する。
24638行。特別処理のドライバ => スペシャルファイルの処理のため、ドライバを呼ぶ。
1028ページ ソースコード24893行。特別処理 => スペシャルファイルのデバイスクローズ処理をする。
1034ページ ソースコード25263行。コピーする => コピーされた
1035ページ ソースコード25290行。inode を作成 => ブロックを作成して、inode に入れる
1052ページ ソースコード26358行。fs アドレス空間から検索 => fs アドレス空間にある引数 'path' を(最終ディレクトリまで、と続く。)
1059ページ ソースコード26791行。
r が OK でないときも、これ、 root_ip が設定されていることを保証する。
1061ページ ソースコード27001行。解除も
ファイルに最後の unlink が実行されたら
1064ページ ソースコード27185行。終了 => 存在
27197行。
ファイルシステム内をループして、ハングするかもしれない。
1065ページ ソースコード27256行。1ブロックずつ成長が => 1ブロック増えなくてはいけないが
1066ページ ソースコード27274行。開放しする => 開放する
27282行。間違わないはず => 失敗しないはず
27291行。
ctime と mtime は、(直前の) search_dir で、更新が必要と印がついている
1074ページ ソースコード27849行。etgid => setgid
1077ページ ソースコード28121行。まず、エントリ => 最初のエントリ
1078ページ ソースコード28186行。真ドライバ => 新ドライバ
1085ページ ソースコード28595行。より早い要求のために => 先ほどの(デッドロックで失敗した)要求に対応する
オペレーティングシステムのことをよくご存知の方に、 Minix 3 と、他のオペレーティングシステムの違いや、おや、と思われるだろうところを説明します。
本の、最初の版 3.1.0 に関する記述です。
以下は、やってない。
仮想記憶。 mmap(2)。 共有ライブラリ。マルチプロセッササポート。スレッド。SCSI, USB。
デバイスドライバも、TCP/IP スタックも、ユーザモードで動くプロセスである。なので、
I/Oポートを in/out で読み書きするシステムコールがある。
malloc, printf だって使える。
getdents(2) はなく、 readdir(3) ライブラリが、ディレクトリを read(2) して、 MINIX FS の構造を知った上で解析する。最近の版では、 getdents(2) をする実装になりました。
バイナリは、 a.out 形式。
プロセスは、 exec されたときに、使えるメモリが割り当てられて、以降、増減、移動しない。
スタックやヒープを大量に使うプログラムは、必要量を chmem(1) で a.out ヘッダに書いておく必要がある。
理解するファイルシステムは、 MINIX だけ。FAT は、 mtools(1) で、 CD は、 isodir(1) でアクセスできる。
open, fork などは、メッセージを作って、 PM, FS に投げるだけ。 lib/posix/_open.c, lib/other/syscall.c を参照。そういう意味では、システムコールは、 send, receive, sendrec だけ。
カーネルには、int 33 命令で入る。
init は、 /etc/rc を実行し、それが、 /usr/etc/rc を実行する。ネットワークの設定は、後者を参照。
カーネルスタックは、1KBで、グローバル変数に1つだけ。 Linux などと違って、カーネルはタスクディスパッチャだけで、スリープしないで走りきるから、これですむ。
ブートローダは、 boot/rawfs.c で、 MINIX FS を理解する。
プロテクトモードへの切り替えをやってくれて、mpx386.s のエントリポイント MINIX に飛んでくる。
未サポートのディスクのために、BIOSコールを使うデバイスドライバがある。
カーネルは、シャットダウンすると、ブートローダ、モニタとも呼ぶ、に return する。
そんなこんなで、 MINIX, BIOS,ブートローダのコンテキストは、共存しているらしいです。 GDT の使い方がごちゃごちゃしている原因のようです。
質問 Windows では、 fork と exec でなく、 CreateProcess で、別プログラムを実行します。標準入出力のリダイレクトは、どうやっているのでしょう。
答え 引数の STARTUPINFO に、hStdInput, hStdOutput, hStdError があります。親が、ファイルを開いて、このハンドルに設定しておくと、子の標準入出力はそのファイルになります。
質問 シグナルはありますか。
答え SetConsoleCtrlHandler で、 Ctrl-C へのふるまいを設定できる。プロセスグループ、CreateProcess の CREATE_NEW_PROCESS_GROUP フラグを参照、もある。
けど、互換性のために、似たものがある程度に思うのがよいでしょう。
非同期の通知なら、 SetEvent を WaitForMultipleObjects で待つのが正しい作法です。
質問 setuid 実行ファイルのしかけがないけど、プロセスの実行権限を上げるにはどうするのですか。
答え ImpersonateLoggedOnUser, RevertToSelf で行うらしいです。私は使ったことがないです。
私の書いた、これらのページも見てね。
Google App Engine で動く、 Linux kernel function trace のブラウザ
Linux kernel function trace の実行例
作成
Kanda.Motohiro@gmail.com
Last update Jan. 5 2009
Moved to sites.google.com on Jan. 2010.