カーネル - みる会図書館


検索対象: UNIX MAGAZINE 2001年4月号
35件見つかりました。

1. UNIX MAGAZINE 2001年4月号

図 1 プロセス ID をオ諚する FreeBSD% ps —lp 1 UID PID PPID CPU PRI NI 0 1 0 0 10 FreeBSD% 0 VSZ 528 RS S WCHAN wait 204 STAT ILs TT T IME C OMMAND 0 : 00 .80 /sbin/init ス ID が 1 番であるⅲ it プロセスの状態を詳しく知りた いときは、言田な情報を出力するための一 1 と、プロセス ID を指定する -p の 2 つのオプションを使います。 -p は引数をとるオプションなので、後ろにプロセス ID を指 定します ( 図 1 ) 。 プロセスの様子を調べる場合には、直接、そのプロセス の内部情報を得るか、カーネル内にあるそのプロセスに関 する情報を得ます。最初のガ去には間題があります。なぜ なら、プロセス内には、ユーザーが入力した平文のバスワ ードなど、重要な情報かイ尉寺されている可能生があるから です。そこでカーネル内の情報を用いるのですが、やはり そのなかにも重要な情報か数多く含まれているため、無制 限に情報を公開するわけにはいきません。 カーネル内の情報を取り出す方法にも間題があります。 以前の UNIX の ps コマンドは、カーネルの内容を直接調 べていました。 UNIX の言 t 者は、 ps コマンドのように カーネルの内部構造を利用するコマンドはそれはどないと 考え、あえて特別なシステムコールは設けませんでした。 そのため、 ps コマンドはカーネル内のデータ構造をその まま利用していました。しかし、カーネル内の構造はシス テムごとに異なるため、結果として ps コマンドはシステ ムに依存することになってしまいました。さらにカーネ ル内の情報を必要とするコマンドは ps 以外にも数多くあ り (uptime など ) 、これらもシステムに依存することに なってしまいました。 Sun Microsystems は、この間題を解決するために カーネル内のさまざまな情報にアクセスするためのライプ ラリを提供するガ去を導入しました。このライプラリ関数 を用いてアクセスするかぎり、カーネル内部の構造や情報 か変更された場合にも同しインターフェイスで辭長カ碍ら れるというわけです。これが、、 KVM ライプラリ " です。 fopen/fwrite などの高水準入出力ライプラリのように KVM ライブラリ 110 オープンしてディスクリプタを取得し、ディスクリプタ を用いて重清報を取り出し、最後にこのディスクリプタ をクローズするイ督はみになっています。 このライプラリによって互換性の間題は解決しました が、まだ別の問題が残っていました。カーネル内の情報 を取得するために、特別な権限が必要となるのです。従来 のプログラムでは、 setuid や setgid システムコールの機 能を用いて権限を取得し、カーネル内の情報を読み込んで いました。たしかに、これらの情報を必要とするのが ps コマンドのようなシステムのアプリケーションだけであれ ば、このガ去は有効かもしれません。しかし、ユーサーが 作成するアプリケーションでも、これらの清幸ゞ必にな ることもあります。このようなアプリケーションの作成や 変更のたびに、管理者に頼んで setuid を設定してもらう のは面倒です。 最近の BSD のシステムでは、 KVM ライプラリを提 供するだけでなく、このライプラリからカーネル内の情報 にアクセスする場合には、特別な権限はイ畯になっていま す。内部的には、プロセス情報を得るためのシステムコー ルを増やして、一殳のプロセスからカーネル内の情報を得 られるようにしています。 KVM ライプラリには次のような関数があります。 ・ kvm-open カーネル関連のファイルを指定し、 KVM ライプラリ のためのディスクリプタを得る。 ・ kvm-openfiles カーネル関連のファイルを指定し、 KVM ライプラリ のためのディスクリプタを得る。 ・ kvm—close オープンしたディスクリプタをクローズする。 ・ kvm-get pro cs プロセスに関する情報を得る。 ・ kvm-getargv プロセスのコマンド行引数に関する情報を得る。 ・ kvm-get envv UNIX MAGAZINE 2001.4

2. UNIX MAGAZINE 2001年4月号

田淵責昭、末永洋樹、宮地利幸 ロ取 Up 臧 0 Linux 関連のソフトウェアの更新情報をお届けする。 からのおもな変史点は以下のとおりである。 Linux カーネル 2.4.2 が発表された。カーネル 2.4.1 Linux カーネル 2.4.2 Linux カーネルである。 これは AXIS 社のネットワーク・カメラ用に移植された 対応アーキテクチャとしては、 cris カ噺しく加わった。 ・ USB 関連のフィックス ・ドライバのアッフ。デート ・ ReiserFS のノヾグフィックス ・ S / 390 対応コードの修正 ・ドキュメントの追加と修正 ・ XFree86 3.3.6 X Servers ・ XFree86 4.0.2 ・カーネル 2.4.0 内容は以下のとおりである。 fisher) を公開した。 レッドハットは Red Hat Linux 7.0.9 ( コード名 Red Hat Linux 7.0.9 驀 Linux ティストリビューション ・ XMMS 1.2.4 ・ BIND 9.1.0 ・ GIMP 1.2.1 ・ glibc 2.2.1 ・ gcc 2.97- RH ・ rpm 4.0.2 ・ GNOME libs 1.2.8 ・ KDE 2.1 べータリリース・スナップショット UNIX MAGAZINE 2001.4 テクチャである。 る。 IA64 は lntel の ltanium でイ目されているアーキ 特徴としては、 IA64 をサポートしたことが挙げられ Meister Linux Mandrake 7.2 レーサーファイプは、 Meister Linux Mandrake 7.2 を発売した。 Red Hat べースで、構成は以下のとおりで ある。 ・カーネル 2.2.17 ( 2.4 し尺 - 可育 ・ glibc 2.1.3 ・ XFree86 4.0.0 ( 3.3.6 も〕 4 尺・可自 ・ KDE 2.0.1 ・ GNOME 1.2 驀セキュリティ関連 BIND lnternet Software Consortium (ISC) によって BIND (Berkeley lnternet Name Domain) 4.9.8 と 8.2.3 がリリースされた。これは、 BIND に存在する 4 つのセキュリティ・ホールが CERT によって報告され たことに対し、バグフィックスというかたちでのリリー スである。 BIND は多くの UNIX 系 OS ーーヒで重川乍する DNS サ ーバーの実装であり、インターネット上の多くの DNS サーバーに用いられているソフトウェアである。 CERT の文書によると、これらのセキュリティ・ホー ルにより、 BIND を実行しているユーサーの権限で任意 のコードか実行されたり、 D 。 S のゾンビとして利用され る可能匪がある。 もし、まだ 4.9.8 以前または 8.2.3 以前のバージョン の BIND を利用しているならば、至急、対 ) 斉みのバー ジョンへのアップグレードが必要である。また、これら のセキュリティ・ホールは BIND 9. x には該当しないた め、 9.1 にアップグレードする去も有効である。 このところ、 BIND などサー ・アプリケーション のセキュリティ・ホールを狙った攻撃がたいへん多いの で、 BIND 以タ ) サーバー・アプリケーションについて も、べンダー窈是供する情報を頻繁に石忍しておくことを お勧めする。 SSH 安全な通信を実現するために Telnet などに代わって 用いられている SSH に、セキュリティ・ホールがみつ 159

3. UNIX MAGAZINE 2001年4月号

プログラミング・テクニック / 図 2 kvm kvm const char *swapfile , kvm—openfiles(const char *execfile, t * const char *swapfile , int ・ kvm-get err プロセスの環境変数に関する情報を得る。 kvm-open 関数と kvm-openfiles 関数 t * kvm_open(const Char *execfile, const Char *corefile, flags , const char *errstr) const Char *corefile, int flags , char *errbuf) KVM ライプラリ関数に関するエラーメッセージを得 る。 ・ kvm-getfiles UNIX MAGAZINE 2001.4 kvm-open は、 Sun カ甘是供した KVM ライプラリとの します。 し値を用いて、 corefile に対する書込みか言ムみかを指定 flags には、 open システムコールて寸旨定するものと同 ムが適当なファイルを尺してくれます。 これらのすべてに対して NULL を指定すると、システ 指定します。 ンプのどちらかです。 swapfile にはスワッフ。デバイスを か、 savecore により作成されたカーネルのクラッシュダ ネルのメモリイメージを指定します。通常は /dev/mem す。通常は /kernel などを指定します。 corefile にはカー 引数 execfile にはカーネルの実行イメージを指定しま なっています。 不頁の関数を使います。これらは、図 2 のようにすこし異 を取得するには、 kvm-open と kvm-openfiles という 2 ディスクリプタを引数としています。このディスクリプタ kvm-open と kvm-openfiles を除くすべての関数は、 カーネルのメモリ空間に書き込む。 kvm—write カーネルのメモリ空間を読み込む。 ・ kvm-read カーネルのシンポルテープルに関する情報を得る。 ・ kvm-nlist システムのスワップ領域に関する情報を得る。 kvm-getswapinfo システムのロードアベレージに関する情報を得る。 ・ kvm-getloadavg カーネルがオープンしているファイルの一覧を得る。 互換性のために用意されているものです。この関数を実行 中にエラーが発生した場合、 errstr が NULL であれは工 ラーメッセージに関する処理はおこなわれません。 errstr が NULL でない場合は、その内容が出力されたあとに工 ラーメッセージカ咄力されます。この出力は、もちろん標 準工ラー出力に対しておこなわれます。 しかし、この動作はライプラリ関数らしくありません。 というのは、ライプラリ関数はプログラマーの意図に反し て画面を乱す可能生があるため、関数自体はエラーメッセ ージを出力しないのです。 errstr を NULL にすれはよけ いなエラーメッセージを出力しないようにすることはでき ます。しかし、それではエラーに関する情報、つまり適切 なエラーメッセージか碍られなくなってしまいます。 これを角夬するために作られたのが kvm-openfiles 関 数です。この関数では、最後の引数の errbuf に文字酉改ー を指定しておき、エラーが発生した場合はそこにメッセー ジをオ絲タすることができます。ェラーメッセージを出力す る場合は、ここにオ褓内された情報をプログラム中で明示的 に出力すれはよいのです。 新しい KVM ライプラリでは、エラーメッセージは kvm-geterr 関数を経由して取得する決まりになってい ます。しかし、 kvm-openfiles 関数だけは特別に専用の 引数か設けられています。これには次のような意味があり ます。 kvm-geterr は、次のように使います。 char * kvm—geterr (kvm—t *kd) この関数は、指定したディスクリプタについて、もっ とも最近に発生したエラー情報を文字列の形式で返しま す。 kvm-geterr を使うには、引数としてディスクリプ タを指定する必要がありますが、 kvm-openfiles が失敗 した場合、ディスクリプタは取得できません。そのため、 kvm-geterr は利用できないのです。 111

4. UNIX MAGAZINE 2001年4月号

いつでも使えるインターネット 写真 3 LAMB-RT-OI 一 4M2-2T ー 01 羊ルータ LAMB-RT-OI 」 ( 以ード、 LAMB) を紹介しま したファイアウォール構築例として、ワイルドラボの「子 Linux カーネルのバケット・フィルタリング機能を利用 特集の 4 ~ 6 回目 ( 2000 年 10 月号 ~ 12 月号 ) では、 ルータを別途用意する必要があります。 に接続する場合は、ファイアウォールを構築するための ます ) 。このため、これらの機器を用いてインターネット 時点ではこのような機能をもつ製品ははとんどないと思い 能はありません俐知らないだけかもしれませんが、現 の機器で、 ISDN ルータのようなフィルタリングなどの機 その名が示すとおり、データの変調と彳をおこなうため 接続事業者の回線に接続します。ところが、このモデムは ている場合は、ケープルモデムや xDSL モデムを使って インターネットへの接続に CATV や xDSL を利用し 子羊ルータ LAMB ・ DHCP をサポート ーションが必要 ・ファームウェアの更新には専用の Windows アプリケ ・ NAT と IP masquerade によるアドレス変換 送信可能 許可 / 拒否したバケットのログは syslog で他ホストに ・バケット・フィルタリング ( ただし、欠陥あり ) イスによる設定 ・ Web インターフェイスとコマンドライン・インターフェ ・ LAN 型接続と端末型接続をサポート 側は ISDN) ・ LAN 側に 4 つの 10BaseT インターフェイス (WAN を以下に示します。 ファイアウォール構築という点からみたこの製品ク寺徴 102 0 この製品には、以下のような特徴があります。 ・ LAN 側と WAN 側にそれぞれ 1 つの 10Base T イン ターフェイス ・ Linux カーネル 2.2.16 か動く超小型 PC 互換機 ・ Red Hat Linux をベースとする糸屯粋な Linux マシン ・ Web インターフェイスとコマンドライン・インターフェ イスによる設定 ・バケット・フィルタリング 許可 / 拒否したバケットのログは syslog で他ホストに 送信可能 ・ IP masquerade によるアドレス変換 ・ファームウェアの更新には別の PC が必要 ・ DHCP をサポート (PPPoE にも試丐剱勺に対応 ) LAMB は、デフォルトで独自のファイアウォール機 能をもっているため、それをそのまま利用することもでき ます。しかし、この特集では、ユーサーが自分で用意した Linux マシンを使ってファイアウォールを構築すること も想定し、あえて LAMB のファイアウォール機能を無 効にし、 Linux カーネルにフィルタルールを直接登録する ための ipchains コマンドを用いて設定するガ去を紹介し ました。さらに、 Linux カーネルがフィルタルールを適 用する重川乍と、 ipchains コマンドのオプションについて 角見しました。 ところが、せつかく勉強した ipchains の知識は、近い 将来に役立たすになりそうです ( 「昔は、 ipchains コマン ドで設定したもんだがねえ・・・・・・」と、蘊蓄を傾けることは できそうですか ) 。 「えー、そんなことがあってええんかいな。時間を返せ ! 」 と嘆きたくなるのもよく分かります ( せつかく書いたの ・・ ) 。しかし、旧いフィルタリング機能と置き換えら れた機能は、その嘆きを補ってあまりあるものです ( と期 待します ) 。 Linux カーネル 2.4. x では、 Netfilter という新しい フィルタリング・システムが実装されました。 リリース ノートを読んだかぎりでは、この NetfiIter はステートフ ル・インスペクションのような機能をもっているようで す。しかし、私自身はカーネル 2.4 を動かしたこともソー UNIX MAGAZINE 2001.4

5. UNIX MAGAZINE 2001年4月号

ますが、たいへん重要な決まり文句です。 getuid システ ムコールはプロセスの実ューサー ID を返します。さらに setuid システムコールはプロセスの実ューザー ID と実効 ューサー ID を設定します。コードの実行前に 実ューサー ID = r 実効ューサー ID = e となっているとすると、 実ユーザー ID = r 実効ューサー ID = r このコードの実行後には、 となります。つまり、このコードは実効ユーザー ID を無 効にするのです。 前述したように、以前の ps コマンドは setgid の機能を 用いてカーネル内部の情報を取得できるようになっていま した。現在は、 KVM ライプラリや sysctl の整備によっ て setgid は不要になりましたが、以前のコードか残って いるのでしよう。このコードが原因でとくにイ諸に合カ起こ ることは考えられないので、残しておいても問題はありま せん。むしろ、描丘はセキュリティの面でいろいろと問題 が発生しているので、より安全な動作か期待できるコード を残しておくのはよいことです。 このあと、 kvm-openfiles を用いて KVM ライプラリ のディスクリプタを取得します。 kd = kvm—openfiles (nlistf , memf , swapf , O_RDONLY , errbuf) ; errbuf) ; こで kvm-openfiles の引数に注目します。さきほど のライプラリの説明では、 /kernel などの意味のあるファ イルを指定すると説明しましたが、デフォルトでは 3 つの 引数に / dev / 11u Ⅱを渡しています。 こんなことで動くのかと不安になるかもしれませんが、 大丈夫です。この場合、 KVM ライプラリは、可能なか ぎり特別な権限を必要としない sysctl を用いて情報を収 集します。現在のシステムでは、 ps コマンドに必喫な情 報はすべてこの方法で取得できます ( だからこそ setgid も不要になっています ) 。 KVM ライプラリでもこうい う面は考慮されていて、カーネルのメモリイメージとし て /dev/null か指定されてもよいように作られています ( 本来は /dev/mem かクラッシュダンプだけです ) 。逆 UNIX MAGAZINE 2001.4 プログラミング・テクニックー に、メモリイメージとして本来の /dev/mem を指定して しまうと、このファイルを読むための権限が必要になるの で、 KVM ライプラリがファイルをオープンできす、ェ ラーとなってしまいます ()M はメモリイメージを指定す るオプションです ) 。 FreeBSD% ps —M /dev/mem ps : /dev/mem : Permission denied KVM ライプラリのソースコードも調べてみました。イ メージファイルはかならすオープンしますが、これが保存 されたクラッシュダンプのファイルでなければカーネルの 実行イメージをオープンすることはありません。さらに、 スワッフ。テンヾイスにいたってはオープンする気配すらあり ません 1 。 次に、まだ出力用フォーマットカ甘旨定されていないので あれば、こでデフォルトのフォーマットを指定しておき NODEV & & pid uid = getuid() ; ui d (uid-t)-l) if ( ! a11 & & ttydev parsefmt (dfmt) ; if (!fmt) てすから、このインターフェイスに依存するプログラムは書かないように 1 もちろん、これは工第点での話であり、麦どう変わるかは分かりません。 り当てられたプロセスを、プロセス ID カ甘旨定されていれ サーのプロセスを、端末カ甘旨定されていればその端末に割 決定します。ューサー ID カ甘旨定されていればそのユー 次に、どんな不頁のプロセスに関する情報を得るのかを どを調べます。 する必要があるか、コマンド名寺する必要があるかな れの情報のフラグを検査することで、 user 構造体 &f 尉寺 この関数も ps. c ファイルで定義されています。それぞ scanvars() ; とカ甘旨定されているのかを十ヾます。 次の関数で、カーネルからどのような情報を取り出すこ 行したユーザーのプロセスを表示するためです。 ロセスに関する指定がなかったときに、 ps コマンドを実 uid によりューサー ID を取得します。これは、とくにプ さらに、ユーザーに関する情報が必要な場合には、 get- しましよう。 117

6. UNIX MAGAZINE 2001年4月号

ワークステーションのおと一 O 、を t 0 に卩朝こ e Term-CCiM1 VT ~ 此印れ第面物 画面 6 コンソールが ttya になっている CAUTIO'I: After choosing Con 弋 i 上 , 弋 s t 記 8t0 」 t ard irv 」 t devices keyboard. ー t the desi red &vices and ℃ 0 C 代 i に . Specify a C86 output 証旧 i 「 0 」 t device ot 「仕 n the sc 「 een ard are immediately tO access t ト conso 尾 . [ ] sc 「 1 and keyEoard ttya ttyb ツ Lont Ⅲリをト 3 (.;ancei 9 起動前 噬 T 0 Term - t"J.)M1 し 7 t path: / öciO , 0 / pci - i 214 , 1 / i / cn 匐 , 0 : a くくく Current めそ Parameters 〉〉 > ト 6 H 引 0 土 args b Cf ile-name] CEmt-fIags] く ENTER> i く ENTER> く ENTER> くくく t i 弋 in 5 seconds > 》 T 3 Term ー COMI 、灯 Edit 学 C 一当加響わ 10 起始まる lect (b)oot or (i)nterprete 「 : to bcot with 弋 ior 心 弋 0 ot with defaults 弋 0 ぎ社 e 「 ot ⅲ弋 e 「 p 「 e e 「 画面 7 テパイスドライバの言△み 印ⅱ 1 叩 - C 壑市引物水解 当 T ョを口第 -COMI VT Loading Driver 猷 a. bef ー ease ; t 画面 8 起動テパイスの尺 は阯 , 叩 0 引′ 0 当を Term-COM1 、鷲 ) 00t So 「 〉 To rake a ーい uæ the a 「「 keys, 印 press Enter tO mark は CX]. asterisk は ) indicates t ト「「信リ日斌ⅵ ( e. sett ings, chcose Tasks. TO perform wt ion 引 features, s 廴ー as if ⅵ鷓 the autoOt and procerty choose Cont i 「 3. Select を of 仕総 identified ⅵ c to 斌 the SoIaris kernel and Board ー反 0 を at [Ev 10 : lntel Pr0100 Fast Et 「弋 Maste 「 ing ー c 価 0 Ⅱ e 「 Board ートぉ 0 , at 2 8. OG : Ta 「 get 0 : を AO 8-224E & ぉ s 「 i ー cmt 「 0 Ⅱ e 「 Board ー b.s 0 , at Dev 2 [ ] 田 : Ta 「 get 1 , TOSHIBA 1214G & Mastering ー圧 cm 土「 0 Ⅱ「 Board ートぉ 0 , at 2 田 : い ) Target 0 , TGHIBÅ 1214G くくく 0 」「「士弋 Parameters > > > t path: / pci , 0 / pci - i 014 , 1 / i / , 0 : a t args b Cf 日 e - r ] COt-fIags] く ENTER> i く ENTER> く ENTER> ype 士 0 ot with cpti 侊虐 土 0 と 0 with defaults to ente 「 ) 土 interprete 「 [ ] IET 2 (-:onti nue F3 8 ャ十 F4 Boot 信 4 ( s フォルトの起動デバイス ( 今回の例では、、 Target 0 , TO- UNIX MAGAZINE 2001.4 ます。ここで、 Sun のマシンにあった ROM モニターの F2 キーを押すと、今度は画面 9 のような表示に変わり ソルを動かし、スペースキーを押して X 印を付けます。 したハードディスクのところまで ( カーソルキーで ) カー こに X 印カ咐いていないときは、 SoIaris をインストール SHIBA MK1214GAP") か選ばれているはすです。 くくく t ⅳに 0 」 t in 5 seconds 》〉 尾 a 5.8 Version 肥「 ic 108529-03 32-bit ハードディスクのアクセスランフ。が点滅し、何かしてい 「うまいこといくやろか ( どきどき ) 」 れています ( 画面 10 ) 。 きました。画面には、カーネルの起動メッセージか表示さ これで、ようやく Solaris のカーネルの起動にたどり着 に起動力始まります。 起重丿けるかを選びます。何もせずに放っておくと、 5 秒後 ようなもの (boot interpreter) を起動するか、ただちに 「国 1983-2000 & 』 1 Microsystems, ー 8. ÅII 「 ights 「 ese 「 v . 141 ワーク経由でログインしようとしても、さつばり反応があ しかし、 5 分ほど待っても何も変わりません。ネット みよ」 「待ては海路の日和ありともいうしな、ちょっと待って り、ディスクの音も聞こえなくなってしまいました。 ところが、すこし経っとアクセスランフ。の点滅が止ま 「そうや、その調イ。ええがな、ええがな」 るようです。

7. UNIX MAGAZINE 2001年4月号

連載 . /lnside Cygwin— 図 1 Cygwin と VMware のアーキテクチャの本田 Cygwin アプリケ ンヨン Cygwin アプリケ ンヨン Wi ndows アプリケ ンヨン NT カーネ丿レ NetBSD アプリケ ンヨン NetBSD アプリケ ンヨン Cygwin DLL Cygwin DLL Win32 サプシステム ーー 0 VMware 上の NetBSD では、 NetBSD のカーネル VMware VP ドライバ vp モニター ハードウェア アプリケーションの利 表 3 ubench の測定結果 Cygwin VMware 上 用する資源をカーネルがすべて掌握しているのに対して、 Cygwin DLL はそうではない。そのため Cygwin DLL では、システムコールのエミュレーションを最適化しづら くなっている。パス角夬 1 っとっても、 NetBSD なら一度 角夬したパス名はキャッシュできるのに対して、 Cygwin でははかのアプリケーションがファイルシステムに触って しまうので、そういうことはできない。 Windows の資源 を借りるときに、 VMware が NT カーネルを利用してい るのに対して、 Cygwin DLL は W ⅲ 32 サプシステムを 利用しているのもハンデになる。 したがって今回のべンチマークは、 Cygwin が遅いの 頭で述べた、℃ PU をぶん回すだけなら遅くない " こ とを ーク・ソフトウェアは前述の lmbench と、冒 ーク・ソフトウェア は当り前で、何がどれくらい遅いのかをみきわめることが / ヾンチ ~ べンチマ 目的になる。 UNIX MAGAZIN E 2001.4 7 http://www.phystech.com/download/ubench.html 化オプションとして一 03 のみを指定している。 lmbench をコンパイルする際には、すべての竟で最適 欠落していたので、 lmbench 2alpha10 から補っている。 このバージョンでは webpage-lm. tar というファイルが 回用いたバージョンは lmbench-2beta1 である。ただし、 の「 PC UNIX のべンチマーク」を参照してほしい。今 lmbench の詳細は、前述したように 1999 年 6 月号 lmbench 示すために ubench7 を用いた。 CPU メモリ ubench 37 , 532 23 , 872 30 , 702 の NetBSD 59 , 934 17 , 488 38 , 711 NetBSD 38 , 781 20 , 541 29 , 661 ubench は、 UNIX の CPU とメモリまわりの性能を 調員けるソフトウェアである。 CPU の性能を整数演算と 浮動小点演算を約 1 : 3 の割合で交ぜた引算で、メモリの 性能を malloc 、 memset 、 memcpy 、 free の適当な組合 せで則り、結果を独自のスコアで表小する。さらに、マル チプロセッサ竟の↑生能を測るために、プロセスを複数生 成して並列に負荷をかけるようになっている。 今回用いたバージョンは ubench-0.32 である。プロ セスを複数生成するガ去では、プロセス生成やコンテキス ト・スイッチのコストか言則結果に含まれてしまうので、 オプション (-s) を指定して単一プロセスで測定をおこな った。コンノヾイル・オプションは、 ubench が Linux 用 に用意している以下のオプションを、すべての竟でその まま用いている。 ー 02 —Wa11 —ma1ign—100ps=2 —ma1ign—jumps=2 —ma1ign—functions=2 —fomit—frame—pointer ubench の測定結果 ubench の測定結果を表 3 に示す。結果の数字は大きい ほどよい。 CPU をぶんぶん回すだけなら Cygwin 上でも 遅くはないという予測は、おおむね当たっている。 VMware 上の NetBSD の CPU のスコアが、 PC 上 133

8. UNIX MAGAZINE 2001年4月号

所 ux を高速実行、 しかもテスク ! ′ 0 せ 0 新 加 ux - ティスクレス PC アジャイル・リドット Linux カーネルを ROM(Disk On Chip) 化。 本体内部にハードディスクを持たない ティスス設計 ! ! システム管理者はハードディスクの障害に畄ませられることなく、クライアントメンテナンスから解放され、シ ステムの TCO 削減に大きく貢献します。ディスクレスマシンでありながら、旧 t 引 Pentium Ⅲ、 CeIe 「 on プロ セッサを搭載し、通常の PC - Linux マシンと全く変わらない高速な演算処理を実現します。また、本体ユ二ッ トは PC アーキテクチャをベースにしているため、 CD-ROM ドライブ、 MO ドライブ、ビデオキャプチャボード 等のオプションを組み合わせることにより、マルチメディアコンテンツの実行にも大きな威力を発揮します。

9. UNIX MAGAZINE 2001年4月号

if ((ioct1(STDOUT_FILENO, TIOCGWINSZ, (char *)&ws) ioctl (STDERR_FILENO , TIOCGWINSZ , (char *)&ws) ioct1(STDIN_FILENO, TIOCGWINSZ, else if 文の条件部がかなり複雑になっていて、これらはすべ termwidth = ws . ws_col termwidth = 79 ; WS . WS_COI = 0 ) 116 _PATH_DEVNULL ; swapf memf = nlistf いう値で衫琪月化されています。 つの変数です。これらはすべて -PATH-DEVNULL と こで注意してほしいのは、 memf 、 nlistf 、 swapf の 3 次は、オプションを解釈するための変数の初期化です。 関数を使って解釈できるようになります。 これらの変換により、旧い形式のオプションも getopt し、—p オフションに変換する。 か指定されていない場合にはプロセス ID 窈旨定とみな ・オプションの末尾か数字の並びであり、その前に t や p -T オプションに変換する。 ーで始まらないオプションで t で終っているときは、 ーて始まらないオプションの場合には、地寬こ - を付け この関数は、次の 3 つの処理をおこないます。 argv[l] = kludge—oldps—options(argv[l] ) ; if (argc > 1 ) 地直の引数に対して整をおこなっています。 うに、 kludge-oldps-options という長い名前の関数が、 す。このような場合にも正しくオプションか解釈できるよ ため、現在でも、 psaux " などとしてしまうことがありま ステムでは、かなり以前からこのような仕様となっていた ンを指定しなくてもよいものがありました。 BSD 系のシ 要がなかったり、プロセスを指定する際に -p オプショ い ps コマンドには、オプションを表す - を付ける必 次は、オプションを表す引数の言驩各をおこないます。旧 調べていき、イ勧碍られたところで else 節を実行します。 が真となった場合、後ろの節を実行します。前から順番に て & & で結はれています。つまり、前の節を実行して結果 このマクロは /usr/include/path. h ヘッダファイルで 定義されており、その値は /dev/null です。 このあと、 getopt 関数を使った引数の解釈か読きます。 オプションに関しては、さきほどの変換により、旧い形式 窈旨定でも正しく処理できるようになっているので簡単で す。しかし、旧い ps コマンドの場合、たんに引数を並べた ときに、それらをカーネルの実行イメージ、カーネルのメ モリイメージ、スワップテパイスと解釈するという規則も ありました。しかも、 1 つだけ指定されたら実行イメージ として、 2 つ指定されたら実行イメージとメモリイメージ として、 3 つ指定されたらさらにスワッフ。テンヾイスとして 解釈するのです。これを実現している部分が、 getopt の ためのループのすぐ後ろにあります。 #define BACKWARD_COMPATIBILITY #ifdef BACKWARD_COMPATIBILITY if (*argv) { nlistf if (* + + argv) { memf = *argv ; if (* + + argv) swapf = *argv ; #endif ps コマンドは、オプションと対応しない引数をとる ことはないので、引数が残っていればそれはこのための 引数であることカ竕かります。引数が残っているかぎり、 nlistf 、 memf 、 swapf に順番に代入していけはよいので す。 このコード全体が ifdef プロックになっていて、そ の直前で、対応するマクロ BACKWARD-COMPATI- BILITY が定義されているのもおもしろいですね。この 部分からは、作者の、、いつかはこれを使わないでいいよう にするぞ " という思メ朝ムみが感しられます。また、このよ うに明カ勺に互換生のためのコードの範囲カ甘旨定されてい ると、プログラムを読む場合にも理解しやすくなります。 次に続くコードも昔の名残りです。 if (dropgid) { setuid(getuid() ) ; setgid(getgid() ) ; UNIX MAGAZINE 2001.4 しています。このコードはまったく意味がなさそうにみえ グループ ID とユーザー ID を取得し、それを再度設定

10. UNIX MAGAZINE 2001年4月号

・ VIS-TAB タブ文字も変換する。 ・ VI S-NL テ文字も変換する。 ・ VIS-WHITE 空白、タブ、予文字も変換する。つまり、 、、 VIS-SP ー VIS-TAB ー VIS-NL" と指定したときと同じ ・ VIS-SAFE 通常の文字に加え、ベル文字や予文字など、安全なも if ( (vis—env = malloc(strlen(k—>ki—env) if (k—>ki—env) はなく、環竟変数に対してもおこないます。 は M-C と表現されます。この処理は引数に対してだけで と指定されているので、制御文字 C ( C 、メタ文字 c VIS_TAB ー VIS_NL ー VIS_NOSLASH さきほどのソースコードでは、 のに関しては変換しない。 120 else 示します。 はこの幅の範囲内で、竟変数の値やコマンドの引数を表 幅よりも小さければ出力を標 ~ 勺な幅に設定します。あと を引けば、残っている桁数カ碍られます。それか剽勺な 数ですから、そこから自分自身のオ剽純勺な幅 (v->width) totwidth は、オ剽軸勺な出力をおこなった場合の本の桁 る場合は、あと何桁残っているのかを調べます。次の 後ろに出力する情報はないが出力幅が限定されてい vis—args) ; (void)printf ( "%s " vis_env) ; (void)printf ("%s if (vis—env) if (termwidth = = UNLIMITED) { / * last field * / if (ve—>next = = NULL) { てを出力します。 が無艮長となっている場合には、イ寺している 1 辭長のすべ 大きく変わります。ほか窈辭長を出力せす、端末窈旨定 実際の出力は、後ろにほかの情報を出力するかどうかで vis_env = NULL ; VIS_TAB ー VIS_NL ー VIS_NOSLASH) ; StrViS(ViS_env, k—>ki_env, err(), NULL) ; * 4 + 1 ) ) = = NULL) left = termwidth (totwidth ー v—>width) ; if (left く 1 ) / * already wrapped, Just use std width * / left = v—>vidth; 一方、後ろに出力する情報か有する場合には、オ剽勺 } else します。 ために使った vis-args や vis-env を解放して関数を終了 たく出力されません。あとは、出力用の文字列をイ尉寺する な幅を用いて出力します。その場合には、竟変数はまっ free(vis_env) ; if (vis—env ! = NULL) free(vis—args) ; v—>width , v—>width, vis_args) ; (void)printf ( " % ー * . *S" UNIX MAGAZINE 2001.4 ( たじみ・ひさかす ) もうすこし詳しくみていきます。 した。次回は、カーネル内の情報を取得するガ去について、 ドを見ながら、 bsearch や strvis などの関数も紹介しま 関数について説明しました。このほかに、 ps のソースコー いる、カーネル内の情報を扱うための KVM ライプラリ 今回は ps コマンドをとりあげ、その内部で用いられて ☆ におこなえるわけです。 り、どんなに長くても v->width までという指定が簡単 指定では、全ー柘 ) 文字数を表します。つまりこの指定によ 定しますが、文字列など浮重ル」、点数以外のフォーマット 占数の場合には、後ろの数値は小魏点以下の数字の数を指 文字列とでは、この意味はまったく異なります。 ~ ル」 のは浮動小魏点数のときが多いのですが、浮動小点数と であれば、、 % ー 10.10S " となります。こういった指定をする から値を取り込むという意味ですから、 v->width が 10 ださい。、、 % ー *. * s " となっています。この場合の * も引数 この printf 関数のフォーマット文字列にも注目してく