プログラム - みる会図書館


検索対象: UNIX MAGAZINE 2002年6月号
42件見つかりました。

1. UNIX MAGAZINE 2002年6月号

2 し inux のプートプロセス 表 8 害込みと例外の頁 害込みと伊桝頁 例外 割込み ハードウェア割込み ソフトウェア割込み フォルト トラップ アポート 原因 INTR 信号 ( 外部周辺機器から送られる信号 ) NMI 信号 ( メモリエラー発生時にメモリモジュールから送られる信号 ) INT れ命令の実行によって発生 セグメントやページの一矍機能によって発生 INTO 、 INT 3 命令の実行によってÆ{E 処理を続行できないようなエラーカ疑旦きたときに盟三 といった命令か実行されているにちがいありません。 上記の例は一般に、、現実壁 " と呼ばれますが、 CPU はいくら酷使されても現実壁はしません。 CPU のソフ トウェア割込みは、システムに用意されている機能をユー サーカリ用するために使われます。たとえば、 BIOS の機 能やシステムコールを呼び出すために使用します。 BIOS とは、 PC の電源を入れたあとで Del キーや FI キーを押すと表示される、お馴染みのあの画面です。普通 の PC ューザーは、 BIOS のセットアッフ画面を呼び出 して IDE ディスクの設定をしたり、クロックアップのお ましないを唱えたりします。一方、プログラマーはという と、フロッピーディスクや IDE ディスクからのデータの 言ムみ、画面への文字の表示といった用途で BIOS を使 います。このとき、 BIOS の機能は CALL や JMP 命令 ではなく、 INT 命令でソフトウェア割込みを発生させて 呼び出します。 以上に紹介した割込みの発生源と原因をまとめると、 表 8 のようになります。 例外の発生源 例外は、次の 3 っから発生します。 ・ CPU か検出したプログラムエラー伊收ト ・ソフトウェア割込み ・マシンチェック例外 CPU は、プログラムの実行中に異常な状態を検出する と、、例外 " を発生します。例外は、その原因と再実行の可 能性により、フォルト、トラップ、アポートの 3 つに分 類されます。それぞれについて説明します俵 8 もあわせ てご覧ください ) 。 フォルト (fault) : ハンドラか漱態を修正することにより、 同し場所からプログラムの実行を再開できるタイプで す。 42 とくに頻繁に発生するのはページフォルトです。このと き、 OS はスワ : ソフ。テンヾイスから該当するべージフレー ムを読み取ったり、ページをコピーすることで状態を回 復できます。 CPU からみれはン。ログラムを再開できる 状態であっても、 OS かプログラムを停止させる場合も あります。プログラマーがよくお世話になる Segmen- tation Fault がそうです。 フォルトが発生すると、 CPU はフォルトを起こした命 令を実行する直前に状態を戻し、ハンドラを呼び出しま す。そして、ハンドラから戻ってきたときの実行ポイ ンタ (EIP レジスタ ) は、フォルトを起こした命令を 指しています。このため、再度同じ命令から実行を再開 します。 トラップ (trap) : トラップは、例タ ) 原因となった命令 を再実行しないタイフ。です。 トラップのおもな用途はプログラムのテンヾッグです。た とえば、プログラムの実行ポインタカワッークポイント に達したといったように、特定の条件を満たす状態にな ったとき、 INTO や INT 3 命令を使用してソフトウェ ア的にトラップを発生させ、テンヾッガに通知します。 トラッフ。が発生すると、 CPU はハンドラを呼び出しま す。そして、ハンドラから戻ってきたときの実行ポイン タ (EIP レジスタ ) は、トラップを起こした命令の次の 命令を指しています。ちょうど、サプルーチンを呼び出 したようなイメージです。 アポート ( ab 。 rt ) : ハードウェア・エラー、もしくはシス テムが参照するテープルに不一致があるなど、致命的な 工ラーが発生した場合刎列外です。 アポートが発生すると、その原因となったプログラムを 再開させることはできません。 Pentium 以降の CPU は、チッフ。内部の状態をチェッ クする樹冓を備えています。このオ冓がハードウェア的 なエラーを本鎹日すると、アポートを発生します。 UNIX MAGAZINE 2002.6

2. UNIX MAGAZINE 2002年6月号

インターフェイスの街角 図 8 MIPS の CPU をイ吏った Windows CE 2.11 システム用の MakefiIe CC OSVERSION CEVERS I ON PLATFORM TARGETCPU CESUBS YS MACHFLAGS WCERO OT INCLUDE LIB PATH clmps . exe = WCE211 211 MS HPC Pro mps = windowsce , 2 . 11 —machine :mips —D _MT —D _DLL —D MIPS —D _MIPS_ —D mips —D C : *Windows CE T001S = $ (WCEROOT) / $ (OSVERSION) / $ (PLATFORM) /include _mlps_ = $ (WCEROOT) / $ (OSVERSION) / $ (PLATFORM) /lib/$ (TARGETCPU) C : *Program Fi1es*Microsoft eMbedded T001s*EVC*$ (OSVERSION)*BIN ; $ (PATH) C OMMONCFLAGS COMMONCEDEFS CFLAGS LDFLAGS —DP 0 CKET_S IZE —DPALM_S I ZE $ ( MACHFLAGS ) ー n010g0 —I —D_WI NCE —DUNDER_CE=$ ( CEVERS I ON ) ー n010g0 —subsystem : $ (CESUBSYS) $ (COMMONCFLAGS) $ (COMMONCEDEFS) test . exe : test . Ob 」 link $(LDFLAGS) —out :test . exe test . obj 端末プログラム乍成例 さきほど述べたように、 eMbedded TooIs を利用すれ ば、コマンドシェルの上で標準入出力を用いて動作するプ ログラムを簡単に作ることができます。 インクルード・ファイルやライプラリは、コマンドシェ ルごとに異なるものを使う必要があるので、それぞれにつ 単に書くことができます。 cmd. exe 上の端末プログラムは、下記のようにごく簡 cmd. exe 用のプロクラム開発 いてイ嬲リに説明します。 int LPWSTR H INSTANCE WinMain(HINSTANCE hlnstance , #inc lude く windows . h> nCmdShow) 1pCmdLine , hPrevInstance, printf("He110!\n") ; UNIX MAGAZINE 2002.6 nmake コマンドを起動するとコンパイルとリンクが実行 うな MakefiIe を作成し、 eMbedded T001S に付属の 2.11 の HandheId PC マシンの場合には、図 8 のよ Telios など、 MIPS の CPU を使った Windows CE Tools に含まれるクロスコンパイラとリンカを使います。 このプログラムのコンパイル / リンクには、 eMbedded されます。 ConsoIe での端末プログラム開発 Console でも、端末プログラムは簡単に作れます。 C の 標準入出力ライプラリがすべて用意されているわけではあ りませんが、端末プログラムの作成には必要十分な機能を もつ conslib というライプラリをリンクして使用します。 183 printf ( " He110 ! \ Ⅱ " ) ; を使って GUI アプリケーションを作ることができます。 Windows CE では、 Windows の API のサプセット GUI プログラム乍成 main() #include く celib . h> 合とほは同様に作成することができます。 出力ライプラリをリンクすることにより、 cmd. exe の場 w32console 上で動く端末プログラムも、コンソール入 w32console での端末プログラム開発 Cputs(TEXT("He110 Wor1d")) int Main(DWORD argc , LPTSTR argv ロ ) TCHAR AppName ロ = TEXT ( " He110 " ) #include "conslib . 五"

3. UNIX MAGAZINE 2002年6月号

特集 し inux のプト彡ロセスをみる -32 CPU の保護機能、割込みと例外 白崎博生 図 1 特権レベル 特権レベル権限の強さープログラムの例 : 、 . = ー保護機能 UNIX MAGAZINE 2002.6 クしそうになったら参照してください。 るかもしれないので、最後に、、用語集 " を付けておきました豆以パー 1 刳可も、新しい用言試第迷の略材かいろいろと出てきます。混乱する人がい レベル 0 ( もっとも強いキ罸で動くプログラムの曰列 る I/O ポートへのアクセスの可否をコントロールします。 類やアクセス可能なメモリの範用、そして、次回に説明す 牛罸レベルは、プログラムか実行できる CPU 命令の種 が皇帝で、レベル 3 は平民です。 小さいはど高い権限を表します ( 図 1 ) 。いわば、レベル 0 牛讚レベルには 0 から 3 までの 4 段階があり、数値が す。この属生を特権レベル (privilege level) といいます。 、、なんでも " 実行でき、その他のプログラムは制限されま す。 CPU の場合も同様で、ある属生をもっプログラムは ューサーが実行したプログラムはアクセスが制限されま ログラムは、、なんでも " できます。一方、その他の ( ーヨ UNIX では、 root の権限をもつューザーが実行したプ 寺本レベノレ 今回は、 IA-32 CPU ク )f 描隻機能について説明します 1 よって拒否されます。 スにアクセスしようと試みても、そのアクセスは CPU に は、自分のページテープルを書き換えて任意の物理アドレ セスがカーネルのデータを書き換えようとしたり、あるい はそのプログラムの実行を停止させます。ューザープロ あるプログラムが無茶な振舞いをしようとすると、 CPU とがおこなえないように厳しく制限されます。たとえは、 ムのすべての挙動は CPU にチェックさ権限以 - ヒのこ IA-32 CPU がプロテクトモードにあるとき、プログラ 0 1 2 3 カーネル 強い アプリケーション 弱い ソフトウェア が OS のカーネルです。カーネルはメモリを管理したり、 I/O ポートを通して外部デバイスにアクセスするなど、す べてのハードウェアを制御する彳齬リを担っているため、レ ベル 0 窈罸雀が必要になります。 反対に、レベル 3 て新カ作するプログラムの例は、 OS 上 で新カくアプリケーション・ソフトウェアです。ューザーが 起動するプログラムのプロセスはもちろん、 root の権限 で動くプロセスもレベル 3 です。そのあいだの 1 と 2 の レベルは、 Linux では使用しません。 キ讚在レベルは、、プログラム " に対して割り当てます。プ ログラムはかならすどこかのコードセグメントのなかに含 まれているはすなので、より正確にいうと、キ罸レベルは 、、コードセグメント " に対して割り当てます。よって、基 本的にセグメントの DPL ( デスクリプタ特権レベル。後 述 ) が 0 のコードセグメントを実行しているときの CPU の牛讚径レベルは 0 であり、 DPL が 3 のコードセグメン トを実行しているときのキ罸レベルは 3 ということになり ます。 CPU カ躾行しているプログラムの罸径レベルを CPL (Current Privilege Level : 現行才罸レベル ) といい、そ の値は CS セグメント・レジスタの下位 2bit から参照する 31

4. UNIX MAGAZINE 2002年6月号

0 つのために作成したプログラムを別のコマンドシェル上で 実行すると、まずコマンドシェル・プログラムか起動し、 その後に指定したプログラムカ躾行されます。たとえば、 cmd. exe のプロンプトから w32console 用にコンノヾイル されたプログラムを実行すると、最初に w32console か起 動してウインドウが表示さ続いて指定したプログラム の実行結果か表示されます。 ConsoIe 用にコンパイルされ たプログラムを w32consoIe から起動した場合も同様で、 最初に Console か起動してウインドウが表示さその 後に指定されたプログラムの実行結果が表示されます。 このため、それぞれのコマンドシェル用に作成されたプ ログラムを、別のコマンドシェル上で実行するのはあまり お勧めできません。 端末ソフト Handheld PC には、ダイヤルアッフ妾続で別のマシン に直接ログインするための、、ターミナル " プログラムが付 属しています。しかし、山も丘は PPP を用いて TCP/IP による接続を確立し、それから TeInet で別マシンに接続 するガ去のほうか普通でしよう。 Windows では、寺西高 氏の開発した「 Tera Term 」という端末ソフトウェアがひ ろく使われています 15 。 HandheId PC では、 Tera Term の Windows CE 版である「 pocket Tera Term 」 16 が 使えます。 このほかに、 w32console 上で動く telnet コマンドも 利用できます。この telnet コマンドでは、ホート番号を 指定した通信も可能です。 Windows CE のプログラム開発囃竟 C 言語で Windows CE のアプリケーションを開発す るには、現在のところ Microsoft カ甘是供している開発ツー ルを使う必喫があります。 従来は、 Microsoft の統合開発環境である「 Microsoft Visual Studio 」のアドオンとして Windows CE のコ ンパイラなどカ甘是供されていましたが、これらをすべて購 入すると 10 万円以 - E かかってしまうので、個人で Win- 15 昨年、ドイツて闊かれたワークショップに参加したところ、そこに置か れていたすべての Windows マシンで Tera Term カイつれていま した。冫敏トでもノ、気があるようです。 16 http://hp.vector.co ・ jp/authors/VA002416/ce/ index-ce. html 182 図 7 Microsoft eMbedded TooIs k 年“第・れ 1 0 物第地気 - ま 00 を朝 E は第地・ : 地 ・第 0 第 V 第道「ト V 第物 : rnin. c -8 いし h nin() pri ⅸイⅡ 0 ! 新つ : 0 = 0000 、 0000 、 00 、 0 、、、 00. 、 0 0 ~ - 0 ・ 0 。、一 ~ ・ =. ← 00 、 = " 0 、 ~ 0 」 C : ⅳ d 物 5 Tco 医を 21 ハト气 : 0 Ⅵ「 cl は地 V 引引 ib. h ( 332 ) : see 0 ⅵ供 & 、 : 新飛ⅸ“ yma i 工Ⅵ nin ェ ( 6 ) : 「 ni 「 C40 師 : 'min : 「 0 「 e ⅳ「 0 物 当「 e いæ. Ⅱ b ( 陸ぶ . : ′ 0 「 L 2N1 : u-. 「 t r 5 ) 最、引耘 第「 i. 。 0 dows CE のプログラムを開発するのはかなり大変でした。 一方、 Palm ではフリーの GCC でプログラム開発をお こなえますし、 CodeWarrior のような統合開発環境も数 万円で入手できます。こういったこともあって、個人の開 発者は Palm のプログラム開発環境のほうに魅力を感して いたように思います。 このような状況を破しようと考えたのか、 Microsoft は Windows CE のコンパイラと統合開発環境をすべて 含む「 Microsoft eMbedded Tools 3.0 」をフリーてま是 供しています 17 この Microsoft eMbedded TooIs は、 VisuaI Studio とはは同じ操作インターフェイスをもつ高度な開発環境で す ( 図 7 ) 。 Visual Studio や eMbedded Tools は、エデイタや プロジェクト管理など、あらゆるツールを含む GUI の統 合開発環境てす。ただし、コンパイラやリンカは独立した コマンドになっていますし、プロジェクトも UNIX のも のとほは 1 司し MakefiIe で管理する方式になっています。 したがって、端末べースのプログラムであれは、あとで述 べるように GUI をまったく使わすに開発作業がおこなえ ます。たとえは、 Emacs でプログラムや Makefile を作 成し、端末十でファイル操作やコンパイル操作をおこない ながらプログラムを開発していくことかできるわけです。 現在、 Microsoft は開発工竟を全面的に VisuaI Studio . NET に移行しつつありますが、それと並行して eMbed- ded Tools 4.0 という製品の提供も続けるのではないかと いわれています。 17 http://www.*.com/mobile/downloads/ emvt30. asp UNIX MAGAZINE 2002.6

5. UNIX MAGAZINE 2002年6月号

ロプログラミンク・テクニック 多治見寿和 telnetd ( 2 ) 前回は telnetd プログラムをとりあげ、 telnet コマン ドによるサ→ヾーへの接続要求をどのように受理するかに ついて説明しました。 telnetd は inetd の利用を想定し て言されたプログラムなので、自分で接続を受け付ける 必要はありませんが、テンヾッグ用として接続受理のための コードも用意されています。 また、 inetd を利用して起動する際に、 IPv4 と IPv6 を男嚇固に扱えるようにするガ去を紹介しました。たん 0 ンヾ イトストリームが必要なアプリケーションでは IPv4 と IPv6 を区別しなくてもよいので、プログラムを inetd か ら起動 - す - るようにしておけは、どちらのプロトコルでも通 信できます。しかし、プロトコルに依存した処理が必要な プログラムもあるため、どちらか一方の接続要求だけを受 理するガ去も説明しました。 今回は、 telnetd の全ー冓造をみながら、 telnet コマン ドでの処理が telnetd プログラムではどのように処理され ているかについて説明します。 ます、 telnetd プログラムがユーザーのリクエストを実 現するイ督はみから紹介しましよう。 ューサーからの接続要求を受理すると、 telnetd プログ ラムは fork システムコールを実行し、自分自身を 2 つの プロセスに分けます。子プロセスでは、イ應課端末のスレー フ端をオープンし、自分自身は 1 。 g ⅲプロセスに置き換わ ります。これが、ユーサーによる入力カ鍍されるプロセス になります。想端末を利用しているのは、端末ライン・ ディシプリンから操作される形態にするためです。これは 3 月号でも説明したように、 login コマンドやあとて起動 telnetd の動作 UNIX MAGAZINE 2002.6 図 1 telnetd の全イ告 ネットワーク ー elnetd tel net 仮想端末 テ、マ・テス ノヾスノヾレ イタイー スースプ シェ丿レ するシェルに対し、相手が通常の端末であるとみせかける のが目的です。 親プロセスのほうは、仮想端末のマスター端をオープン し、子プロセスに入力を渡す準備をします。ューサーカリ 用しているホストとの通信もこのプロセスが処理します。 つまり、親プロセスは、ネットワークから読み込んだも のをイ反想端末に書き込み、保想端末から読み込んだものを ネットワーク側に書き込むという動作をおこないます。 main 関数 配列に注目します ( 誌面の都合上、で折り返していま その則に、 main 関数の直前で旦言されている valid-opts の main 関数は、 telnetd. c ファイルに言当されています。 く main 関数からみていきましよう。 telnetd プログラム る telnet コマンドのコードと上交していきます。さっそ 今回は、 telnetd のソースコードを参照しながら対応す char valid—opts ロ す。以羽司様 ) #ifdef #ifdef #endif AUTHENTI CATI ON SecurID 77

6. UNIX MAGAZINE 2002年6月号

2 手段として、ソフトウェアから割込みを発生させます。 方、伊外は実行中のプログラムのエラーや、ここまでに説 明してきオ」描違反によって発生します。 割込みと例外には、その不頁に応してべクタと呼ばれる 識別番号カ」り当てられています。そして、 CPU か呼び 出すプログラムをハンドラと呼び、ハンドラは発生の原因 に応して適切な処理をおこないます。 CPU はべクタ番号とハンドラの対表をイ寺し、割込 みと例外が発生したときに呼び出すべきハンドラのアドレ スをこの対応表から取り出します。対応表の名前は CPU のモードによって異なり、リアルモードでは割込みべクタ テーカレ、プロテクトモードでは割込みデスクリプタ・テ ーカレと呼びます。以 - ヒの関係をまとめると、図 11 のよ うになります。図中にはテープルの開始アドレスか書かれ ていますが、いまのところは、、見て見ぬふり " をしてくだ ハンドラによる処理か終ったあと、もとのプログラム の実行を再開するかどうかは発生の原因によって決まりま す。たいていは、もとのプログラムを再開しますが、場合 によって再開不可能なこともあります。そのようなときは OS カワ。ログラムを停止したり、あるいは OS 自体亭止 することもあります。 Linux では、タイマー割込みによってプロセスの切替 えがおこなわれています。 1 つのプログラムが長いあいだ CPU を使い続けている場合、そのプログラムをスリープ 状態にし、以前に中断したほかのプログラムを再開するこ ともあります。 以下では、割込み / 例外処理の動作とテープルの内容に ついて説明します。 割込みの発生源 割込みは、次の 2 つから発生します。 ・ハードウェア割込み ・ソフトウェア割込み ハードウェア割込みは、 CPU カ言号を受信するピンの 位置により、さらに INTR と NMI に分類されます。 図 12 と図 13 に、 8086 と Pentium のピン配置図を 示します。前回はアドレスパスのピンを探しましたが、今 回は、、 INTR" と、、 NMI" と書かれたピンを探してくださ し inux のプートプロセス 40 図 12 8086 のピン GND AD14 AD13 AD12 ADII ADIO AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 ADI ADO NMI INTR CLK GND 1 20 40 Vcc AD15 AI 6 / S3 AI 刀 S4 AI 8 / S5 AI 9 / S6 BHE/S7 M N/MX RD RQ/@12 (HOLD) RQ/GTI (HLDA) (WR) S2 SO QSo QSI RESET READY TEST 00 / M ) (2LR) (DEN) ( 竺 ) ()N ) い。図 12 から探すのは簡単だと思いますが、図 13 のほ うは、かって流行した、、ウォーリーをさかせ ! " より難しい かもしれません。 INTR ピンは、 8259A や万換チップなどの外音瞎リ込み コントローラに接続されていて ( 現在は、割込みコントロ ーラはチップセットに含まれています ) 、 8259A の先には キーポードやハードディスクなどか接続されています。 のあたりの話は次回に詳しく説明しますが、 こでは外部 周辺機器などの割込み信号が送られるピンだと理解してお いてください。ネットワーク・カードや SCSI カードを PC のバスに挿すときに 「 IRQ がふつかった ! 」 などと叫ぶ IRQ 割込み信号がこれにあたります。 INTR ピンから信号を受け取った CPU は、システム バスを経由して 8259A からべクタ番号を読み取ります。 こで IRQ の番号が分かり、それぞれのハードウェアに 応したハンドラか呼ばれます。 一方、 NMI ピンはメモリモジューノレに接続されていま す。このピンは、パリティエラーか発生したときにメモリ モジュールから送られる信号を受け取ります。 NMI ピン から信号を受け取った場合のべクタは 2 番と決められてい ます。よって、かならずべクタ番号 2 のハンドラか呼び 出されます。 UNIX MAGAZINE 2002.6

7. UNIX MAGAZINE 2002年6月号

2 Linux のプートプロセス 図 10 ページディレクトリとページテープル (4KB ページ ) (a) PDE (Page Directory Entry) ページテーブルのべースアドレス (b) PTE (Page Table Entry) 12 11 31 ページフレームのべースアドレス 表 4 U/S フラグによるアクセスの可否 AVAIL 9 AVAIL 9 8 0 8 0 7 0 7 0 6 0 6 D 5 5 A 4 4 0 3 3 2 2 1 0 1 0 表 5 表 6 表 7 。スー R/ 、フラグによるアクセスの可否 ユーザー スーパーバイサー U/S = 0 U/S = 1 アクセス不可アクセス可 アクセス可アクセス可 ユーサー スーパーバイサー 言衄ル専用 読み書き可 グラムかアクセス可能なのは U/S フラグがセットされて いるべージだけで、クリアされているべージにアクセスし ようとすると CPU は伊外を発生します。 U/S フラグによるアクセスの可否をまとめると表 4 の ようになります。 前回、 Linux のカーネルはリニアアドレスの C01000 00H に配置されていると説明しました。もし、これらの カーネル領域のメモリ内容がユーサー・プログラムから読 めるとすると、システムの重要な清報がユーザーに丸見え になってしまうことになり、セキュリティ面で好ましく ありません。そこで、 Linux では C0000000H 以降のシ ステム領域を指すべージディレクトリ・エントリの U/S フラグをクリアし、ユーサー・プログラムからはアクセス できないように設定します。一方、プログラムのコードと ヒープ ( 8048000H 以降 ) 、共有ライプラリ ( 40000000H 以降 ) 、スタック (BFFFFFFFH 以前 ) 領域の U/S フ ラグはセットされ、ユーサー・プログラムからアクセスで きるように設定されています。 R/ 、 (V フラグによるアクセス保護 R/W フラグは、ページフレームの読出しと書込み権限 を設定します。 CRO レジスタの WP フラグがクリアされている場合、 イザー・モードのプログラムは、 R/W フラグ の値にかかわらす、すべてのページを読み書きできます。 つまり、書込みー矍設定は無視されます。 一方、ユーサーモードのプログラムか書き込めるのは、 38 WP=O の場合のアクセス権 U/S R/W ユーサー ユーザー ユーザー ユーザー パーバイサー パーバイサー パーバイサー バイザー 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 、 VP=I の場合のアクセス権 U/S R/W ユーサー ユーサー ユーサー ユーサー ハーノヾイサー バイサー ハーパイサー バイサー 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 R/W = 1 読み書き可 読み書き可 アクセス権 アクセス権 翫み書き可 読み書き可 読み書き可 読み書き可 読み書き可 読出し専用 アクセス不可 アクセス不可 読み書き可 読出し専用 読み書き可 読み書き可 読み書き可 読出し専用 アクセス不可 アクセス不可 R/W フラグがセットされているべージだけです。 UNIX MAGAZINE 2002.6 W=O) のユーザーベージ (U/S=I) へのアクセスが表 7 レジスタの WP フラグをセットすると、読出し専用 ( R / ところが、 80486 以降の IA-32 プロセッサでは、 CRO ログラムには適用されません。 によるべージイ機能は、スーパーバイサー・モードのプ れを見れは分かるように、 U/S と R/W の 2 つのフラグ 表 4 ~ 5 を組み合わせると、表 6 のようになります。 ようになります。 R / W フラグによるアクセスの可否をまとめると表 5 の

8. UNIX MAGAZINE 2002年6月号

2 ロ nux のプートプロセス 図 6 2 つの CPL からデータセグメントにアクセスする例 コードセグメント DPL=O コードセグメント DPL=3 C P L=O CPL=3 データセグメント DPL=O テータセグメント DPL=I データセグメント D P L=2 テータセグメント D PL=3 この条件は、高い牛讚雀レベルをもっプログラムは、自分 と同等かより大きい ( 特権レベルが低い ) DPL のデータ セグメントにアクセス可能なことを表しています。たとえ ば、 CPL が 0 のプログラムは、すべてのデータセグメン トにアクセスできます。しかし、 CPL が 3 のプログラム は、牛讚レベルの最大値が 3 なので、 DPL が 3 のデータ セグメントにしかアクセスできません ( 図 6 ) 。 セグメント・セレクタの RPL には、通常は CPL と同 し値を代入します。たとえば、 GDT (Global Descrip- tor TabIe : グローバルデスクリプタ・テープル ) に以下 のセグメントデスクリプタが当されているとします。 インデックス DPL 3 4 0 3 このとき、 CPL が 3 のプログラムが 4 番目のセグメ ントにアクセスしたい場合、セレクタ値の各フィールドを 以下のようにセットし、 23H をセグメント・レジスタに ロードします。 [ lndex = 4 / TI = 0 / RPL = 3 ] 23H この操作は、 DPL=RPL=CPL なので許可されます。 同しく、 CPL が 0 のプログラムが 3 番目のセグメント にアクセスしたい場合は、 [ lndex = 3 / TI = 0 / RPL = 0 ] 18H UNIX MAGAZIN E 2002.6 なので、 18H をセグメント・レジスタにロードします。 の操作も DPL=RPL=CPL なので許可されます。 ところが、 RPL の値を 3 に変更し、 [ lndex = 3 / TI = 0 / RPL = 3 ] IBH として IBH をセグメント・レジスタにロードしようとす ると、今度違反か発生して操作は失敗します。 ここに、、どんな意味があるのか " は、ちょっと分かりづ らいところです。 lntel のマニュアル [ 1 ] を読むと、 RPL は次のように使うことを想定しているそうです。 通常、牛雀レベル 0 で動く OS のカーネルは、システ ムコールなどのインターフェイス経由でユーザープロセス のリクエストを処理します。このとき、システムコールは カーネルの一になので 4 雀レベル 0 て動きます。 たとえば、この OS では、ファイルの読み書きをおこな うシステムコールの引数に以下の値を指定するとします。 ( ファイル名 , セレクタ , オフセット , バイト印 、、そんな OS があるんかい ! " というツッコミは、とりあ え由斗の奧にしまっておきましよう。また、引数のなか にあるセレクタとオフセットの値は、ファイルから読み込 んだデータの転送先、あるいは、ファイルへ書き込むデー クタの値を指定できます。さらに、上で述べたようにシス ー屬己のシステムコールの例では、ユーザーが自由にセレ タの転送元を表すものとします。 35

9. UNIX MAGAZINE 2002年6月号

2 し inux のプートプロセス モリに読み込まれていて、そのページフレームを複数のプ いないので、偽のプロセス ID は指定しないでください。 ロセスが共有しているのです。 Linux はテマンド・ページ また、スワップデーモンなどのカーネルスレッドは、プロ ングを実装しているため、プログラムがまだ使っていない セスではないため言ムみ工ラーとなります。 サプルーチンやデータに対応するフレームはメモリにマッ なお、このプログラムはカーネルの領域を茁妾読み込む プされす、アクセスした時点ではじめてマップされます。 ため、実行には root の権限が必要です。 したがって、一方のページがすこし足りないように表示さ れることもあります。 C0000000H 以降のアドレスはカーネルの領域で、プ こ窈寺集では、あまり馴染みのない用語や謎の 3 文子言 ロセスの領域はそオ LJ ユ前のアドレスです。そこで、プロセ 葉がたくさん出てくるので、混乱している人がいるかもし ス領域からページアウトされていないページ数を合計する れませんそこで、これまでに出てきた用語と、それぞれ と、 ps コマンドで得られる RSS ( 物理メモリの使用量 ) の簡単な説明を以下に記しておきます。本文を読むときの とだいたい同し数値になります ( 多少の誤差カ咄るのです 参考にしてください。 が、理由は分かりません ) 。 CPL (Current Privilege Level : 現行特オレベル ) プログラムのコン / ヾイル CPU か実行中のプログラムがもつ 4 罸レベル。 コンパイルする前に、すこしだけ準備が必です。 関連 : キ権レベル、 DPL 、 RPL ます、計算機で動いているカーネルの System. map CR レジスタ : システムの重川乍を制脚するフラグをもつレ ファイルから pidhash" というシンポルのアドレスを調 ジスタ ( 図 19 ) 。 べます。カーネルをコンパイルしていない場合は、 Sys- DPL (Descriptor Privilege Level : デスクリプタ牛罸径 tem. map は /boot ディレクトリにあると思います。自 レベル ) : セグメント / ゲート・デスクリプタを参照する 分でコンパイルしたカーネルをインストールしている場合 ために必要なキ罸雀レベル。 は、 make を実行したディレクトリにあるはすです。たと 関 ; 里 : 特オ雀レベル、 CPL 、 RPL 、 IDT えば、以下のようにコマンドを実行してアドレスを取得し EFLAGS レジスタ : システムの重川乍を制御するフラグ てください。 をもつレジスタ ( 図 20 ) 。 % grep pidhash /b00t/System ・ map GDT (Global Descriptor Table : グローバルデスクリ c022c2cc ? __kstrtab_pidhash プタ・テープル ) : セグメントの属性を言己するセグメ C0231570 ? __ksymtab_pidhash c027dbeO B pidhash ントデスクリプタの酉リ。 GDT は、システムに 1 つだ け用意する。 次に、リスト 1 の内容のファイルを作成します。ファ 関連 : LDT イル名はなんでもかまいませんが、 こでは read-pgd. c IA-32 プロセッサ : lntel か製造・販売する CPU のう という名にしています。そして、リスト 1 の頁で定義 ち、同し系統に属する CPU の糸谺尓のこと。 8086 から している pidhash-addr" を自分の System. map から Pentium 4 まてが含まれる。 得たアドレスに変更してください。 IDT (lnterrupt Descriptor Table : 割込みデスクリプ ファイルが作成できたら、次のコマンドを実行してコン タ・テープル ) : ハンドラのアドレスやアクセス制御属 パイルします。 性を言当するゲート・デスクリプタの酉改 JO gcc -l/usr/src/linux/include - 関連 : ハンドラ、 DPL ー 0 read-pgd read—pgd ・ c INTR : CPU カリ込み信号を受信するピン。 EFLAGS プログラムの実行 レジスタの IF フラグをクリアすると、 INTR 信号を受 このプログラムは、 1 つのプロセス ID を引数に指定し 信しても CPU は無視する。 て実行します。とくにエラー処理らしい処理はおこなって 関連 : 割込み 集 用 0 1 三 これ 50 UNIX MAGAZINE 2002.6

10. UNIX MAGAZINE 2002年6月号

2 Linux のプートプロセス 図 11 リアルモードとプロテクトモードにおける害込みハンドラのテーカレ リアルモードの場合 プロテクトモードの場合 割込みハンドラ 割込みハンドラ 割込み デスクリプタ テーブ丿レ デスクソプタ n 灯 割込みべクタ テーブ丿レ べクタ FF Segment:Offset デスクリプタ 02 デスクリプタ 01 デスクリプタ 00 割込み 発生 割込み 発生 べクタ 02 Segment:Offset べクタ 01 Segment:Offset べクタ 00 Segment:Offset 00000H IDTR 00000H のように変化し、スーパーバイザー・モードのプログラム いてはあとで説明します。 がページに書き込もうとすると、 CPU カ甁外を発生しま す。結〕釉勺に、ス→ヾーバイザー・モードからページを保 護できるようになります。 CPU に割込み / 例外が発生すると、 CPU は現在実行 WP フラグによるイ描矍機能は、、℃ opy-On-Write" を しているプログラムを一イ判勺に中断し、別に用意してある : 滝見するために使用されます。 WP フラグを使用し、 2 つ 特別なプログラムを実行し始めます。このような割込み処 以 E のプロセスから共有されているユーサーベージを読出 理は、私たちの日常生活にもあります。たとえは、本を読 し専用として設定しておくと、 OS は CPU の例外発生 んでいるときに電話がかかってきたとか、宴会でピールを によってユーサーベージへの書込みを検出し、その点で 飲みすぎて、、自然の要求 " に逆らえなくなったとか、その 新しいページを割り当ててコピーできるようになります。 ようなことです。 Copy-On-Write の動作については、本題から外れるの CPU の割込みと例外には、発生源や発生の原因によっ で、こオ LJ ユ上の説明は省略します。 ていくっかの不頁があります。 「うーん、なんかよう分からんわ。なんというか、目で見 割込みはおもに外部のハードウェア ( キーポードやハー て分かるようなもんがあったらええねんけど・・ ドディスク、クロックタイマーなど ) から CPU に送ら れる信号によって発生します。また、特別な命令を用いて という方のために、ページディレクトリとページテープル の U/S と R/W フラグを表示するプログラムを作ってみ ソフトウェア的に割込みを発生させることもできます。た ました ( 末尾のリスト 1 ) 。コンパイルの手順と使い方につ とえば、 Linux ではユーザーがシステムコールを呼び出す , 。割込みと例外 39 UNIX MAGAZINE 2002.6