連載 /FreeBSD のブートプロセスをみる 図 17 fork-exit() と fork-return 0727 : 0728 : 0729 : 0730 : 0739 : 0740 : 0741 : 0742 : 0767 : 0786 0795 : 0796 : 0797 : 0798 : 0799 : 0800 : 0806 . fork—exit (callout , arg, frame) void (*callout) (void * , struct trapframe void *arg; struct trapframe *frame; td = curthread ; p = td—>td—proc ; td—>td—oncpu = PCPU_GET (cpuid) ; p—>p—state = PRS-NORMAL ; callout (arg, frame) ; fork—return(td, frame) struct thread *td; struct trapframe *frame; userret(td, frame, 0 ) ; cpu-set-fork handler() ふたたび ところが、 init プロセスを生成するときは、ユーザープ cpu-set-fork-handler() は、 PCB の ESI と EBX を を書き換える必要があります。 成するときは、適切なところにジャンプするようにどこか そこで、カーネルが forkl ( ) を呼び出してプロセスを生 理も停止してしまいます。 セスの起動に失敗します。その結果、カーネルのプート処 0000H ) にジャンプしようとして例外が発生し、 init プロ 不正なアドレス ( セグメント・セレクタ 0 、アドレス 0000 の状態で fork-trampoline() が IRET 命令を実行すると、 ため、 trapframe の内容はすべて 0 でクリアされます。 レジスタの内容を保存する処理はおこなわれません。この ロセスがソフトウェア割込みを発行したわけではないので、 書き換えて fork-exit() カ鮃び出すサプルーチンを変更し ます。 0231 : 0232 : 0233 : 0234 : 0235 0240 : 0241 : cpu—set—fork—handler (td, struct thread *td; void (*func) (void * ) ; void *arg; td—>td—pcb—>pcb—esi = td—>td—pcb—>pcb—ebx = f unc (int) (int) , arg) func ; arg; UNIX MAGAZINE 2004. 12 0242 : } こでの処理はいたって簡単で、 fork-exit() の引数に渡 す callout と arg に対応する ESI と EBX を書き換えて いるだけです。たとえば、前回紹介した create_init() で は、 init プロセスが start-init() を実行するように cpu—set—fork-handler ( FIRST_THREAD_IN_PROC (initproc) , start—init , NULL) ; と設定しています。 「 EIP を書き換えてもええんちゃうの ? 」 EIP を書き換えれば、わざわざ fork-trampoline() を 経由せずに、 cpu-switch() が目的のサプルーチンを直 接実行してくれます。ところが、 fork-trampoline() が fork-exit() を呼び出すまでの部分 ( 誌面では省略していま す ) と、 fork-exit() が callout() を呼び出すまでの処理は 重要なので、これを省略するとプロセスカ働かなくなって しまいそうです。 「ほな、 fork-return() と userret() は実行せんでもええ んかいな ? 」 という心配は不要なようです。 fork-return() と user- ret() はユーザープロセスに必要な処理をおこないます が、この時点での init プロセスはまだューザープロセスで はありません。また、 cpu-set-fork-handler() で PCB を書き換えるのは、 init プロセスとカーネルスレッドを 生成するときだけです。もちろん、カーネルスレッドも fork-return() と userret ( ) の対象にはなりません。 今回は、イ反想アドレス空間を作る vm_forkproc() につい て説明しました。ちょっと、 ・・いや、かなり難しい内容 だったかもしれません。前回の create-init() と今回説明 した部分は一連のものなので、続けて読めばプロセスが生 成されるところが、、みえてくる " のではないかと思います。 次回は、アイドルスレッドを作成する idle-setup() 、タ イマー割込みと RTC 割込みの初期化をおこなう init- clocks() について説明します。 ☆ 115 ( しらさき・ひろお IIJ)
インワン・サー PROSIDE T 0 な f ・ 0 、 0 ⅱ 09 BI N 社 BIueNet 100 / 200 / 300 ターポリナックス社の「 Tu 「 bo ⅱ nux Appliance Server 1.0 」をバンドル ・「 SUN CobaItTM 」シリーズ互換の機能を搭載 ・奧行きわすか 385mm の IU ミニ・ラック型ケース ・前面 LCD コントロール / ヾネルを装備 ・ 10 / IOOBASE - TX ィーサネット X2 装備 BlueNet 50 ・ターポリナックス社の 「 Tu 「 bolinux Appliance Serve 「 1.0 」をバンドル ・「 SUN CobaItTM 」シリーズ互換の機能を搭載 ・イーサーネットは 10 / IOOBASE - TXX2 ・ 35dB 以下の騒音レベルを実現した静音設計 0 ) ー lue 、 BlueNet 300 BlueNet 200 BlueNet 100 ■ CPU : インテル@C 引 e 「 on ・プロセッサ ■ CPU : インテル・ C 引 e 「 on ・プロセッサ ・ CPU : インテル・ Ce 厄「 on ・プロセッサ 2.60GHz 2.60GHz 2.60GHz ・メモリ : 256MB SDRAM DDR266 ECC ・メモリ : 256MB SDRAM DDR266 ECC ・メモリ : 256MB SDRAM DDR266 ECC •HDD:120GB UltraATA 100 7200 「 pm •HDD:120GB UltraATA 100 7200 「 pm •HDD: 80GB UltraATA 100 7200 「 pm x2(RAlD1) •OS:Tu 「 bolinux Appliance Server 1 .0 •OS:Tu 「 bolinux Appliance Serve 「 1 .0 •OS:Turb01inux Appliance Server 1.0 Hosting Edition WO 「 kg roup Ed ition Hosting Edition BlueNet 50 •CPU:VIA C3 1000MHZ ・メモリ : 256MB SDRAM DDR266 •HDD:80GB UltraATA 100 7200rPm •OS:Turb01inux Appliance Se 「 ver 1.0 Workg roup Ed ition h t t p : l/www. p 「 0 s i d e. c 0. j p / 最新情報・価格、見積り・ご注文は、 プロサイド w e b ヘアクセス ・価格、写真、仕様等は予告なく変更する場合があります。■記載されている会社名及び製品名は、各社の商標または登録商標です。・送料は別途いただきます。
連載 /FreeBSD のブートプロセスをみる 175 ~ 197 行目では、 ( タスクスイッチをおこなって ) 子 スイッチ先が生まれたてのプロセスの場合、上記の 182 プロセスに初めて CPU が割り当てられたときに実行する 行目で設疋した fork-trampoline のアドレスが EIP にロ サプルーチンや引数などを設定しています。つまり、子プ ードされます。子プロセスは、ここで初めて、、おぎゃー " と 産声を上げ、 fork-trampoline() から歩み始めます。 ロセスの、、最初の一歩 " を言定しているわけです。 182 行目の fork-trampoline は、タスクスイッチ直後 fork-trampoline() は、 i386/i386/exception. s で定 に CPU が実行を開始するサプルーチンのアドレスです。 義されています。 178 行目の fork-return は、 fork-trampoline から呼 0215 : ENTRY(fork_tramp01ine) び出されるサプルーチンのアドレスで、 180 ~ 181 行目が %esp 0216 : pushl その引数です。 %ebx 0217 : pushl 0218 : pushl あとで、子プロセスがユーザーモードに戻っていく処理 を説明するので、このあたりは、、ふーん " と思っておくだけ 0221 : sti 0222 : call でかまいません。 0223 : addl 183 行目は EFLAGS レジスタにロードする内容で、す 0302 : popl べてのフラグをクリアします ( 割込みカ噤止されます ) 。 0305 : popl 0308 : popl mtx—lock—spin(&sched-lock) ; 0309 : pop al 0200 : 0310 : addl if (mdp2—>md—1dt ! = 0 ) { 0201 : 0313 : if (flags & RFMEM) { iret 0202 : 0203 : mdp2—>md-1dt—>1dt—refcnt + + ; } else { 0204 : mdp2—>md-1dt=user—1dt—a110c (mdp2 , 0205 : mdp2—>md-1dt—>1dt—1en) ; 0206 if (mdp2—>md—1dt = = NULL) 0207 panic("could not copy LDT") ; 0208 : 0209 : 0210 : 0211 : 0222 : fork_exit $12,%esp %fs %es %ds $8,%esp / / skip dummy fork-trampoline() は、 ESI 、 EBX 、 ESP の内容を引 数にして fork-exit() を呼び出します。 ふたたび 178 ~ 181 行目を参照すると、 fork—exit (fork—return , td2 , td2—>td—frame) ; のように呼び出されることが分かります。 180 行目で引い ている sizeof(void * ) がここで消えてなくなっているの 最後に LDT の内容をコピーし、処理カ鮗ります。 は、 cpu-switch() のなかで調節されるからです。 init プロセスを生成するときは、 201 行目のメンバー変 fork-exit() の一部を図 17 に示します。 fork-exit() は、 数 md 」 dt の内容が NULL なので、 201 ~ 209 行目は実 プロセスが実行中であることを表すパラメータとフラグを 行されません。 誌定し、第 1 引数で指定されたサプルーチン、すなわち、 よちょち歩きの子プロセス fork—return (td2 , td2—>td—frame) ; 「ハイ、これで子プロセスができました」 を呼び出します。 fork-return() はさらに userret() を呼 び出し、プロセス・スケジュールのパラメータを調整して だけで終るのはおもしろくないので、子プロセスカ黝き始 呼出し元に戻ります。 めるところをみてみましよう。 カーネルは、適当なタイミングで cpu-switch() を呼び fork-exit() から戻ってきた fork-trampoline() は、ス 出してタスクスイッチを実行します。 cpu-switch() は、ス タックに積まれているレジスタの内容を POP 命令で読み イッチ元とスイッチ先の thread 構造体を引数にとります。 戻します。最後に、 IRET 命令を実行してユーザー空間に cpu-switch() カ鮃び出されると、現在のレジスタの内容 彳帚し、 fork システムコールを実行した直後の命令からユ をスイッチ元の PCB に保存し、反対にスイッチ先の PCB ーザープロセスの実行を開始して一人前のプロセスになり からレジスタの内容を読み戻します。 mtx-unlock-spin (&sched—lock) ; 0 114 UNIX MAGAZINE 2004. 12
e WS ・ 12 / 2004 ・旧 M POWER5 使用の UNIX サーバー は最大 1.17TB 。仮想化機能 LPAR に対 日本アイ・ピー・エム (Tel 0120 ー 応し、イ瓦想サーバー数は最大 254 。 HD べ 041992 ) は、 POWER5 をイ用した UNIX イ数は 16 、拡張スロットは PCI—Xx200 、、 IBM e server p5 〃、統合ビジ I/O ドロワー数 ( 590 / 595 ) は最大 8 / 12 台。 ネスサーノヾー、、同 i5 クの新モデルの販売 旧 M e server p5 595 I/F (I/O ドロワー 1 台あたり ) は、 Ultra を開始した。 320 SCSI ( 内部用 ) X2 、シリアル x2 ( 595 対応 OS は、いすれも AIX 5L V5.2 / 8 , 400 円から。 のみ ) 、 HMC ポート x2 、 RIO—2 x20 5.3 、 Red Hat Enterprise Linux AS 3 、 ◆ IBM e server i5 外形ー去 ( H XWXD) は 202.5X78.5x SUSE LINUX Enterprise Server 9 、 i 同社の xSeries を接続することによ 168. lcm 、重量は 1 , 310kg ( いすれも防音 5/OS V5R30 り、 Windows サーバーの統合が可能な ドア付きの場合 ) 。 アプリケーション・サーバー。 CPU は ◆ IBM e server p5 価格は、 IBM e server p5 590 (8CPU 、 CPU は POWER5(1.65GHz または 1.9 POWER5 ( 1.65GHz ) 、 CPU 数は最大 主記憶 8GB 、 HD 36.4GB >< 2 ) が 8 090 GHz) で、最大 32way の「 IBM e server 64 、主記憶は最大 2 , 048GB 、 HD は最大 万 4 , 600 円から、同 595 (16CPU 、主記憶 P5590 」、 64way の「同 595 」がある。主記 190TB 。イ反想化機能 LPAR に対応し、仮 16GB 、 HD 36.4GB x 2 ) が 1 億 5 , 414 万 憶 ( 590 / 595 ) は 1 , 024GB / 2 , 048GB 、 HD 想サーバー数は最大 254 。ネットワーク I/F 数は最大 160 。内蔵 CD/DVD/ 磁気 ◆旧 M e server p5 / i5 のおもな仕様 テーブドライプ数は最大 60 。 VirtuaIiza- CPU tion Engine System Service ツーノレの クロック IBM Director MultipIatform 、 EWLM CPU 数 主記憶 ( 最大 ) (Enterprise Workload Managero i5/ LPAR 数 ( 最大 ) OS V5R3 に伺属 ) に対応。 拡張スロット IXS/IXA ( 最大 ) 価格は、「 IBM e server i5 595 」 ( 1.65 GHzx 8 、主記憶 8GB 、 HD 36.4 x2 、 i5/ OS4 ライセンス ) が 2 億 2 , 400 万円から。 , 1 = 1 p5 590 1.65GHz 8 / 16 / 32 1 , 024GB p5 595 P OWER5 1.65GHz / 1.9GHz 16 / 32 / 48 / 64 254 i5 595 1.65GHz 8 / 16 / 32 / 64 2 , 048GB PCI-Xx20 60 / 57 シリアル x 2 Ultra320 SCSI x 2 Ultra320 SCSI x 2 HMC ポート x2 HMC ポート x2 RIO-2 x 2 RIO-2 x 2 202.5X78.5X168. lcm / 1 , 310kg I/F* 外形寸法 (HxWxD)/ 重量 本ドロワー 1 台あたり •Apple シングル・フロセッサの Power Mac G5 600MHz 、主記憶は 256MB ( 最大 4GB ) 、 アップルコンピュータ (TeI 0120 ー 277531 ) は、デスクトップ型 Macintosh HD ( シリアル ATA) は 80GB 、グラフ 「 Power Mac G5 」のシングルプロセッ ィックスは NVIDIA GeForce FX 5200 UItra (VRAM 64MB 、 DVI/ADC ポー サ・モデルの販売を開始した。 X5 ( 3 ポートは USB 2.0 ) など。無線通信 ト ) 、光学ドライプは SuperDrive (DVD— 既存のデュアルプロセッサ・モデル 3 機 R/CD-RW 両用 ) 、拡張スロットは、 PCI 機能 ( IEEE802.11b / g 、 Bluetooth) はオ 種 (PowerPC G5 1.8 / 2 / 2.5GHz ) のはか x3 、 AGP 8X Pro ( 使用済み ) 。 I/F は、 フ。ション。 に、シングルプロセッサ・モデル (Power PC G5 1.8GHz) を追加した。筐体は既存 プレインストール OS は Mac OS X 10 / 100 / 1000Ba 記 T 、モデム、 FireWire X3 ( 1 ポートは FireWire 800 ) 、 USB 2.0 モデルと同等。フロントサイド・バスは V10.3 。 iLife ' 04 (iTunes 、 iPhoto 、 i UNIX MAGAZINE 2004. 12 17
NEWS Movie 、 iDVD 、 GarageBand) が付属。 47.5cm 、重量は 16.4kg 。 外形寸法 (HXWXD) は 51.1X20.6x 価格は 188 , 790 円。 ・ Sun UItraSPARC ー V 使用のサーバー サン・マイクロシステムズ (Tel 03 ー Threading) 技術を用いた UltraSPARC 5717 ー 5033 ) は、 SPARC アーキテクチャ IV で、 1 プロセッサあたり 2 つのスレッド 「 Sun Fire V490 」「同 890 」 を同時に処理できる。システム・インター のサーノヾー の販売を開始した。 コネクトは Sun FirepIane(9.6GB/s)0 動 CPU はいすれも CMT (Chip Multi 作周波数 ( 490 / 890 ) は 1.05GHz / 1.2GHz 、 ◆ Sun Fire V490 / 890 のおもな仕様 V490 UltraSPARC IV ( 1.05GHz ) CPU CPU 数・ 実行スレッド数・ 2 次キャッシュ システム・インターコネクト 主記憶第 HD* 光学ドライプ 拡張スロット 標準 I/F 管理 I/F 外形寸法 (HxWxD)/ff 量・ ・最大値 **ICPU あたり Sun Fire V890 CPU 数は 2 ~ 4 / 2 ~ 8 、主記憶は最大 32 GB/64GB 、 HD は 73.4GB ><2 / 6 、拡張 スロットは PCI x 6 / 9 。 対応 OS は Solaris 8 ( 2 / 04 ) / 9 ( 4 / 04 ) 価格 ( 不娚リ ) は、 Sun Fire V490 が 446 万 3 , 000 円から、同 890 が 575 万 9 , 000 円から ( いすれも 2CPU 、主記憶 8GB 、 HD 73.4GB >< 2 ( 490 ) / 6 ( 890 ) 、 Sun Java Enterprise System 評価版、 S01aris 9 ( 4 / 04 ) ) 。 V890 UltraSPARC IV (1.2GHz) 8 16 4 8 16MB** Sun FirepIane (9.6GB/s) 32GB 64GB 73.4GBx2 73.4GB x 12 8 倍速 IDE DVD-ROM ドライプ 16 倍速 IDE DVD-ROM ドライプ PCIx6 PCI x 9 10 / 1 囲 / 1000B e T x 2 、 Fibre Channel 10B e T/ 100B e TX 、 1000B e SX シリアル、 USB 1.0X2 シリアル、 USB 1.0X2 10B e T 、 シリアル 22.2 ( 5U ) X44.6X62.2cm / 44kg 71.4 ( 17U ) X48X78.5cm / 131kg •Turb01inux SELinux に対応し、導入 / 運用を支援す ターポリナックス (Tel 03 ー 5766 ー 1660 ) ヨ u 市ⅶ る SELinux/Aid 、トレンドマイクロの は、サーバーシステム用の Linux ディ ウイルス対策ソフトウェア ServerPro- ストリビューション、、 Turbolinux 10 tect for Linux 1.3 ( 90 日試用版 ) 、リコー Server" の販売を開始した。 TrueType フォント 5 書体、国内メー 主要コンポーネントは、カーネル 2.6.8 カー製プリンタのドライバなどが付属。 (NPTL (Native Posix Threading Li- 価格は基本バッケージが 41 , 790 円。 1 Tomcat や JBoss による Web アプリケー brary)) 、 glibc 2.3.3 、 XFree86 4.3.0 、 年間のサポート ( 障害対応を含む ) が付属 ション開発環境を提供する JavaCD 、商 GCC 3.3.3 、 rpm 4.2.2 。ハードウェア する「 Turbolinux 10 Server with Sup- 用サーバー・ソフトウェアの詔面版を求 検出機能を強化したインストーラ Mon- port 」、開発者向けの「同 Developer Edi- したソリューション・パック CD が付属。 goose 、セキュリティ・アップデート適用 tion 」 ( ユーサーの作成 / 削除などに制限あ 動 ( 乍環境は、 CPU が Pentium III (Hy- 機能 turboupdate ( セキュリティ・アッ り ) も用意。 perThreading 対応 ) 以上、主記憶が 256 プデートの提供期間は 5 年 ) などの独自 MB ( 推奨 512MB ) 以上、 HD が 8GB の設定ツール (TurboTools) を備える。 26 系カーネルのサーバー用 Linux •UNISYS prise Server ES7000 クシリーズの Linux 対応モテルの販売を開始した。 対応ディストリピューションは、 SUSE ー box@unisys.co.jp) は、 、、 Unisys Enter- LINUX Enterprise Server 、 Red Hat UNIX MAGAZINE 2004. 12 Li nux 対応工ンターフライズ・サーバー 日本ユニシス (E—maiI linuxbiz— 18
NEWS Enterprise Linux 、 MIRACLE LINUX ティション機能により、 1 筐体で最大 8 っ ド・レベルのサポートサーピスの提供を開 (Asianux)0 ES7000 シリーズは、 CPU (4CPU 単位 ) の OS の並列動イ乍が可能。 始した。 が Xeon MP または ltanium 2 、 CPU 数 同時に、「アドバンスド・サポート・サー が最大 32 、主記憶が最大 256GB 。パー ピス」のメニューを拡大し、ソースコー •EPSON Linux フレインストール PC エプソンダイレクト (Tel 0120 ー 545101 ) bolinux 10 Desktop Basic ( オフィス・ は、 Linux をプレインストールした PC ソフトウェアなどが含まれない基本版 ) 。 「 Endeavor LX2500 」「同 7500 」の販売 CPU は Celeron D 325 ( 2.53GHz ) / 330 Endeavor LX7500 を開始した。 ( 2.66GHz ) または Pentium 4 ( 3E / 3.2 2500 はタワー型 ( チップセットは lntel E/3.4EGHz) 、主記憶は 256 ~ 3 , 072MB 、 価格は、 Endeavor LX2500 が 79 , 800 875P 、グラフィックスは GeForce FX HD は 40 ~ 250GB 、光学ドライプは CD ー 円 (Pentium 4 3EGHz) から、同 7500 が 5200 、拡張スロットは PCIX5) 、 7500 は ROM ドライプ。ネットワーク I/F は、 50 , 400 円 (Celeron D 325 ) から。 マイクロタワー型 (lntel 865G 、 PCI x 3 ) 。 2500 が 10 / 100 / 1000Base T 、 7500 が 10 プレインストール OS はいすれも Tur- Base T/100Base TXO ◆ Endeavor LX2500 / 7500 のおもな仕様 LX2500 Pentium 4 ( 3E / 3.2E / 3.4EGHz ) lntel 875P 十 ICH5R LX7500 CeIeron D 325 ( 2.53GHz ) / 330 ( 2.66GHz ) Pentium 4 ( 3E / 3.2E/3.4EGHz) lntel 865G CPU チップセット 主記憶 HD グラフィックス 光学ドライプ ドライプペイ 拡張スロット I/F 外形寸法 (HxWxD)/ 重量 256 ~ 3 , 072MB 40 ~ 250GB NVIDIA GeForce FX 5200 (AGP 8X) CD-ROM ドライプ 3.5 ⅲ chx2 、 5.25 ⅲ chx3 、 HD 専用 x4 PCIx5 、 AGP 10 / 100 / 1000B e T 、 USB 2.0X6 、 PS/2x2 シリアル、ノヾラレル、音声入出力 ニ D-Sub 15 ピン、 DVI-I 、 S ビデオ 43.9X21.7X50.3cm / 15kg チップセット内蔵 3.5inch 、 5.25 ⅲ chx2 、 HD 専用 x3 PCIx3 、 AGP 10B e T / 100B e TX 、 USB 2.0X6 、 PS/2x2 シリアル、パラレル、音声入出力 ニ D-Sub 15 ピン 36.8x 17.9X39.9cm / llkg •NTT DATA 、 curl HTTPS/SOAP をサポート。開発に利 用できるサーバーサイドの部品、クライ アント用の API を用意。 NTT データイントラマート (Tel 03 ー 対応 OS は、サーバー側が Solaris 8 、 mart と、カール・アジアパシフィックの 5549 ー 2821 ) とカール・アジアパシフィッ Web システム開発言語 Curl を組み合わせ HP—UX 11i 、 AIX 5.2 、 Red Hat En- た製品。サーバー側を intra-mart 、クラ ク (Tel 03 ー 5255 ー 3411 ) は、 Web システ terprise Linux AS 2.1 、 Windows 、ク ム開発環境「 intra—mart/ CurI (I (C) 」 イアント側を Curl で開発することで、通 ライアント側が Linux (SUSE 8.2 、 Red 信の負荷を抑えながらさまざまな操作機 の販売を開始した。 H at 9 ) 、 Windowso 能をもっクライアントを作成できる。ク NTT データイントラマートの J2EE 価格は 160 万円 (ICPU) から。 対応の Web システム開発ツール intra— ライアント / サーバー間の通信は HTTP/ Web システム開発環境 ネットテレフォン ・インター 既存の EIOffice 2004 ( 2004 年 6 月発 売 ) のアップグレード製品。 Java で開発 さオ Linux 、 Windows に対応。処理速 インターネットテレフォンは、中国 Ev- フィス・ソフトウェア「 EIOffce2004 十」 度と安定性を強化し、新た ( ンヾッケージで の販売を開始した。 ermore Software の Java べースのオ の販売を開始 ( ダウンロード販売も継続 ) 。 UNIX MAGAZ 工 NE 2004. 12 Java べースのオフィス・ソフトウェア 19
bcopy() により、 C0000000H 以降のイ反想アドレスの奐 はカーネル用の仮想アドレスを参照するため、 pm-pteobj で管理するのは C0000000H 未満の仮想アドレスを変換す るためのページテープルだけです。 1 つのページテープル は 4MB に対応するため、 OOOOOOOOH—BFFFFFFFH のイ反想アドレスを変換するには 768 個のページテープルが 必要です。もちろん、同時に 768 個のページテープルを 使用するようなプロセスはありませんが、 1 , 319 行目では 、、いれもの " の大きさとして、、 768 " を言定しています。 1 , 326 行目の 767 は、物理ページフレームを 767 番 目のページテープルとして登録するという未の数です。 つまり、図 10 の pm-pteobj が指している灰色の領域は、 図 12 のページテープルに対応するわけです。 cpu-fork() cpu-fork() は、子プロセスの PCB とスタックフレー ムを初期設定する処理をおこないます。 そのコードは、 i386/i386/vm-machdep. c で定義され ています。 0153 : 0152 : 0149 : 0146 : 0145 : 0116 : 0108 : { 0107 : 0106 : 0105 : 0104 : 0103 : 0102 : bcopy(&pl->p—md, mdp2, sizeof(*mdp2)) ; mdp2 = &p2—>p—md ; bcopy(td1->td—pcb,pcb2,sizeof(*pcb2)) ; td2—>td—pcb = pcb2; 2 * PAGE_SIZE) pcb2 (struct pcb * ) (td2—>td-kstack + pl = tdl—>td—proc; int flags ; struct thread *td2 ; register struct proc *P2; register struct thread *tdl ; cpu-fork(tdl, p2, td2, flags) void 112 ッチともいいます ) をおこなうとき、カーネルモードで動 PCB 構造体は、タスクスイッチ ( コンテキスト・スイ 14 ) 、 145 行目のポインタの引算でアドレスが得られます。 ージフレームの最上位アドレスに格納されているため ( 図 プロセスの PCB 構造体は、カーネルスタック用のペ を子プロセスにコピーします。 145 ~ 149 行目では、親プロセスの PCB 構造体の内容 連載 /FreeBSD のブートプロセスをみる pcb-cr3; pcb-edi ; pcb-ebp; pcb-eSP; pcb-ebx ; pcb—e1P; pcb—dr0 ; pcb—gs ; pcb-psl; 図 14 カーネルスタックと PCB struct pcb 図 15 PCB 構本 struct trapframe スタックの 伸びる方向 struct pcb { 608 バイト 16 バイト 72 バイト 8 , 192 バイト i nt i nt int int int int int int int pcb- struct pcb—ext *pcb—ext ; i nt きは NULL がコピーされます。 は LDT か第定されないので、 init プロセスを生成すると ble) へのポインタをコピーします。しかし、 swapper に 152 ~ 153 行目では、 LDT (LocaI Descriptor Ta- します。 PCB 構造体の内容を図 15 に示します。 いているプロセスのレジスタの内容を待避するために使用 0161 : 0162 : 0163 : 0164 : 0165 : 0166 : td2->td-frame = (struct trapframe * ) ( (caddr—t) td2—>td—pcb ー 16 ) bcopy(tdl—>td—frame, td2->td—frame, sizeof(struct trapframe) ) ; td2—>td_frame—>tf—eax = 0 ; td2—>td—frame—>tf—ef1ags & = &PSL—C; td2->td_frame—>tf_edx = 1 ; 161 ~ 162 行目は、親プロセスの trapframe 構造イ本の 内容を子プロセスにコピーします。 話はすこしそれますが、ユーザープロセスによる fork システムコールの発行を例にとって trapframe の用途を 説明しましよう。 fork システムコールは、ソフトウェア 割込みを利用してカーネルモードに移行します。このと き、 CPU はプロセスのカーネルスタックにレジスタ SS 、 UNIX MAGAZINE 2004. 12
ワークステーションのおとーー 193 写真 4 ローゼット・ポックスに組み込む 写真 1 Ethernet 用の 2 ロローゼット 写真 5 泉の様子 0 Sun Blade IOOO を使う このところ、勤務先で使っているサーバーの変更を検討 していました。いま利用している Sun UItra 5 (CPU は 270MHz 、メモリ 256AIB 、ディスク 160GB (80GB >< 2 の RAID 1 が 2 セット ) で、 OS は Solaris9) では、 さすがにつらくなってきたからです。 初めのうちは、数名でログインしてメールを読み書きし たり、ファイルサーバーとして使うぶんにはとくに問題は ありませんでした。ところが、 Linux を OS とする PC サーバーでのソフトウェア開発が増えるにつれて問題が出 てきたのです。たとえば、いま使っているターゲット機の PC サーバーの CPU は Xeon 3GHz X 2 で、ディスク は 15 , 000 回転の SCSI ディスクです。つまり、 Ultra 5 とは 10 倍くらいの性能差があるので、 PC サーバー側が 待たされることがあります。また、 Windows から SMB 経由で大きなファイルを書き込もうとすると、なんとなく もたついた感じもします。 サーバー OS は ? 簡単です。 まず、ローゼット・ボックスからモジュラー・ジャック を外します ( 写真 2 ) 。カラーコードに沿って、橙 / 白交じ りの橙、緑 / 白交じりの緑、茶 / 白交じりの茶のより線に 1 ・ジャックを、青 / 白交じりの青に別のモ つのモジュラー ・ジャックを取り付けます ( 写真 3 ) 。カラーコー シュフー ドに沿って取り付ければ、青 / 白交じりの青はモジュラー ジャックの 4 番と 5 番のピンに酉泉されます。これはモジ ・ジャックの中央の 2 本で、 ーーに電話線のプラグ ュフー を入れると、ちょうと真ん中の 2 本、電話線が入っている ところに対応します。 Ethernet ケープルのテスターで配線カ噫図どおりに分 配されているかを確認したら、あとはローゼット・ボック スに組み込むだけです ( 写真 4 ) 。これと同じものをもう 1 っ作り、図 1 のように配線します ( 写真 5 ) 。 このようにしたあとでテストをしてみたところ、みごと に電話からノイズが消えていました。 サーバーとしては、次のような候補カ考えられます。 142 UN 工 X MAGAZ 工 NE 2004. 12
SC 翡 好評発売中 ! Linux ブートプロセス みる 連載 /FreeBSD のブートプロセスをみる 図 16 trapframe 構 ; 本 struct trapframe { int tf_fs; int ー e S ; int tf_ds; int tf edi ; int eSI,• int tf—ebp; int tf-xsp; int tf_ebx; int tf edx ; int int tf_eax; int tf—trapno ; int err ; int tf-exp; int tf_cs; int tf eflags; int tf-esp; int tf_ss; DS EDI ESI EBP ISP EBX EDX ECX EAX DUMMY DUMMY EIP CS EFLAGS ESP SS スタックの成長方向 Linux の プートプロセスをみる 白物博生 一ドアーヤのメモリ 積地 20 円 . 切ー . みとま外 0 円】のレ 0 アつセス、 PC / AT ア - キチクチャ つロッビからのツログラムの 0 ′“物ら一ネル梦の瞽で ) と - ⅵト、・なの 0 ゆネ物チバッ 多第物第第第 ・白崎博生著 ・ B5 判、 204 ページ ・旧 BN4-7561-4451-9 ・ 2 , 940 円 ( 税込み ) ESP 、 EFLAGS 、 CS 、 EIP の内容をブッシュします。さ らに、割込みノ、ンドラが EAX 、 ECX 、 ・・・ FS の内容を Linux カーネルがプートする仕組みを、コ ードを見ながら詳細に解説する。 CPU の ブッシュします。 構造から、 Linux のプートローダとカーネ trapframe 構造体の定義を図 16 に示します。スタック ルの動作、 init プロセスの起動までの道筋 にブッシュされたレジスタとメンバー変数の川頁番を見れば をみていく。カーネルの「敷居」を低く 分かると思いますが、この構造体はカーネルスタック上の する一冊。 レジスタの内容にアクセスするために使われます。 目次から 164 行目で EAX に設疋している 0 は、 fork システ ハードウェアの制御ーー CPU のメモリ管理 ムコールの子プロセスへの戻り値です。 IA -32 CPIJ の保護機能、割込みと例外 165 行目では EFLAGS の C フラグをクリアしていま CPU のレ O アクセス、 PC / AT アーキテクチャ フロッピーからのプログラムのロード す。このフラグは、システムコールの実行が成功したこと セットアップ・ルーチン、圧縮カーネルの展開 を (libc) ライプラリに通知するために使用されます。 sta 「 tup_82 ルーチン sta 「 t ke 「 nel() と setup_a 「 ch() pcb2—>pcb—cr3 = vtophys ( t 「 ap_init() 、 init_ 旧 Q() 、 time_init() 、 mem_init() (&p2—>p—vmspace->vm—pmap) ->pm-pdir) ; 「 est ー init ( ) からカーネルスレッドの生成まで pcb2—>pcb— edi = 0 ; init() と do_basic-setup() (int) fork—return ; pcb2—>pcb- e S 1 = ユーザープロセス / sbin / init の起動 pcb2—>pcb—ebp = 0 ; カーネルデバッガ (int) td2—>td—frame pcb2—>pcb —esp sizeof (void * ) ; (int)td2; pcb2—>pcb— ebx = (int) fork—trampoline ; pcb2— >pcb— pcb2—>pcb—ps1 = PSL-KERNEL ; rgs(); pcb2—>pcb—gs = pcb2—>pcb— ext = スタックの底 0175 : 0176 : 0177 : 0178 : 0179 : 0180 : 0181 : 0182 : 0183 : 0184 : 0197 : 株式会社アスキー 〒 1 02 ー 8584 東京都千代田区九段北ト ] 3-5 日本地所第一ビル 電話 ( 03 ) 6888 ー 5500 ( 営業局 ) 113 UN 工 X MAGAZINE 2004. 12
文房具としての 図 20 TFTP から取得したブートローダ 連載 ~ 08 e い「 bOOt fr0M RHD RH フ 9C97 日日 : 0 顰リ r ー g 物ー (C) 29 日 3 し物叔 re , に . ・ opy 「 ig 弋 (C) 199 ? - ・ 28 日日 lntel Corpor のを一 0 い > > 日 ory : 566 / 269 日 32 冫 ) ( 「 00 弋 0C0 ”「 rey. れ is ーーれ ra ・ c. jp 、 Thu 応 12 日 2 : 45 : 49 S す 2 日 94 ) > 〉 NetBS 第 / ー 386 PXE Boot, R 日 i & io れ 1 . 1 、日 T 阯旧 Y ー ~ : 192. 168. 11. 1 : L ー ENT ー第 : 192. ー 66. 11.3 K : 255.255.255.8 川 P 3 ENT : nIJI)R : ßC 29 5B RC BF 引月 : 564 ⅢロⅡ 2-43B ルツ R4E ~ 694 ド - ル n5C 日 5BflCB を ー P : 192. ー 68 . 11.2 regs return tO bOOt れ 0 , いリ 0 を he 「 ke ソー 0 「 b00 弋 Menu 図 22 カーネルがネットワーク言を DHCP で取得 、 5 娘 po 日 at i 、日第 or を日フヨ : い、臼 Plug い Play 、 10 、ⅱし e su p 「 t upxßはを i 09 リ 0 「 t Bx ー 9 一日 x 「「 : 戦 3 ⅱ exceptiou 16 fdcB at isag or を 9X3 ー 6 ー 9X3r7 irq 6 ・ q 2 i 0 第 9 リ 9 : no ISfi Plug 'n P ーリ日ⅱ : 日 s found e ロ田一 i20 RRIBframe 呶 : を i は ted scsibusg: Naiting 2 se 「 on は for は 0 iCOS tO 30 を t ー 0. t ⅱ in 図 21 ブートローダと DHCP 、 etwork も 00t ー「 OH AHD A ? 9C9 フ BR :opyright (C) 2893 、 " 物 re , lnc . 0 リ「一暫物 t (C ) 1997-2999 lnt e ー CO 「 po 「一一 0 れ れ 00t device: pcng 00t 0 れ pcnB afs_boot : trying 川 / OOTP ” f 町 boui : DHCP nexi—server: 192. 168. 11.2 nfs boot: 一一れれ日 = d ー s 長 1 日 ss ~ s を at ー 0 れ日 r リ 「 s ー bOot : 新ソ . ー td 「 : 492.168.1i.3 れ fs - 市 00t : り”物ミ k 第 255.255.255.9 江、一 h00 : を e 凵物リ : : 192.16B . 1k1 , ・ 00 ー 0 192.168.11.2:/usr/exports/root 「 00t ーーーい systeM t ソ第 : nfS 日Ⅱ 12 19 : 59 : 31 JST 29B4 h 日 c い fO 「 bOtc 日は superblock upgrades: 減「 t ⅱ file system checks: tty ーー gs. 第 tt い 14 sysctl variables: - t 「一新四 ne を川 k. ー P 6 , e : host : 0 れ「 ig r ⅱれ t 洋 k interfaces: 0 れ 0. カーネルの言蒄入み 図 23 静かなティスクレス文房具カ力した ! 、 onfiguring netHOrk interfaces: ui lding ddtdbd & 2 &. s ー 3 ー yø : s い℃ e れ 1 d に ( 89X25 , を 199 e 日ーー on ) s 臧ー S リーリ : screen 2 added ( 8 X25 , e ⅱ 0 を一 on ) s 護 is ーゝ用 : screen 3 畆 ed ( 89X25 , 日川れ t ⅱ s は is 第一 0Y8 : s こ「 20 4 0 斌 4 に ( 8 日 X25 , t1BB 0 日驫 t ー 0 れ ) :LIENT 心 RDDR : 99 BC 29 SB fiC BF GIJ ー 0 : 5640n3n2 ー 43B0 ー ? fi4 を一 694 ドー - D を ft5C85BRCB ド 」」 ENT ー : 192. ー 68. 11. 3 袵 K : 255. 255.255. DHC P 旧 T Ⅲー第 : 192. 168. ー 1. 1 > 〉 NetBSD/i3ß6 PXE B00 ー , 費 e リーー 0 れ 1 . 1 ) 〉 ( r00t0C0 fl ℃リ . れ一 st ー第「 . c . jp , Thu fi 社 4 12 92 : 45 : 49 JST 2 日 84 ) > ) He ト「ソ : 586 / 26 932 * 192. 168. 11.2 】 6a6334 を 14 ? 3 ・ 492944 ー 374384 ・ 33 フ 636 亠 t ー op 日れ : fi ー 2 れ a ! : tftp:netbsd •et_open: s じいル r は r : 192.168.11.2 net 90 を y : 192.168. ーれ 1 1 日 t ー open : subnet ”は k : 255.255.255. B •et—open: c ⅱ田「 : 192. 16B . 1 3 、を he 「れ e を「 ess ga : Bc : 29 : 5b : ac : b ー siog PCI 0 リー ce れ b 収 3 6 0 ice 17 function 日 XE B ー OS ( rs ー 0 2. 1 、 t 叔「 t ⅱ 1 ⅱー 9 ress 「日 t “ r れ一 0 bOOt 第 , n other key 「 or bOOt H 田 ウントダウンが終るとアドレスを取得し、カーネルを読み ートローダに制御が移ります ( 図 20 ) 。プートローダのカ います。しかし、駆動部分を究極まで削った静音 PC なら これで駆動する部分はほとんどないので、十分静かだと思 用した静かな ( そして冷たい ) NetBSD を紹介しました。 今回は、前回の N 十 I で利用したディスクレス端末を応 み取れますね。 プ領域も、正しくスワップとして追加されていることも読 見ると、 /etc/fstab に設疋した NFS サーバー上のスワッ レス文房具を起動させることができました ( 図 23 ) 。よく 以上のように長い道程を経て、ようやく静かなディスク れているようです。 クエストを出します ( 図 22 ) 。 root-path もちゃんと渡さ テムをマウントする直前に、今度はカーネルが DHCP リ 表示されていますね。さらにプートが進み、ファイルシス 込みます ( 図 21 ) 。 DHCP で設定したファイル名なども は 0 「 t ing heck ⅱ可 S aVeCOre : いⅱ i い 4 コ ear i リ . re ti 第 heck ⅱ ー秘 r 弋ⅱ可 t 「弋ⅱ pddt ing は art ⅱ可 は r ま i 9 tarting s s ー 09 は . fO 「 core 臧収目 . no core duHP ( れ 0 dumpdev) ーー filesysteHs . /tmp. . out runtiHe ーⅱ 1 e は一を 0 「ー「日 c ー 0 「ソ cache. quotas: 臧 0 第 e . d ⅱ 192.168.11.2 : ノ S 「 / expo 「 ts / & 叔 p as swap device at p 「一 0 「一 t リ 9 virecover. ー 0C0 ー斌驫 eH0 第 s : 川ⅱ . sendHai1. ー ne を . C 「 0 第 . 破 R 収 12 28 : 64 : 4 ? JST 2B84 etBSD/i386 (diskless—stationery) (console) BSD ではこれでも十分と思われるかもしれませんが、デ スクトッフ。環境として GNOME や KDE を使ったり、 GIMPIO で絵を描いたり、修士論文や博士論文などの大き な文書を pIAVfX でコンパイルするときなどは、やはりマ シンパワーはあるに越したことはありません。 そこで、次回は、、遅い CPU でも・商 ! X ウインドウ・ システム編 " ということで、静かな NetBSD でさらに商 ではの制約もあります。それは・・ 、一般的に CPU が 遅いことです。 CPU を冷却するためのファンも騒音のも とですから、多くの静音 PC ではこのファンを使わなくて もいいように、すこしばかり遅めの CPU を採用している ことが多いのです。 UNIX MAGAZINE 2004. 12 な環境を目指します。 ( みやち・としゆき もりしま・なおと 10 http://www.gimp ・ org/ 北陸先端科・学オ支彳椅大学院大学、 奈良先端科・学オ翅孑大学院大学 ) 125