デバッガの基礎知識 20 21 22 23 24 25 26 27 int* p, p = sub2(); *P = 10 ; return *P ; (gdb) backtrace が bt と略せるのと同じく、 list コマンドも I ( ェル ) と省略できます。 (gdb) 1 23 図 10 1 2 3 4 5 6 7 8 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 特集 sample2. c #include く stdlib . h> #include く stdio . > static char* subl() ; static char* sub2() ; int main() printf ("strings sub 1 ( ) ) ; 18 19 20 21 22 23 24 25 26 27 ( gdb ) subl() int* p; p = sub2(); *P = 10 ; return , 引数を付けずに I コマンドを実行すると、その直前の I コ マンドで表示された行の続き、もしくは、スタックフレーム の表示の含まれていた行を中心とした部分が表示されます。 また、次のように関数名を引数に指定することもできま static char* subl() char* p ; p = sub2(); sprintf (p, return p ; char * sub2() char* p ; return p ; (char*)ma110c(5) ; こでは、 (sub2 で 0 を返しているので当り前ですが ) す。 (gdb) 14 15 16 17 18 19 20 21 22 23 ( gdb ) 1 subl return static int subl() int* p; 0 ; p = sub2(); *p = 10 ; このソースコードの 23 行目を見ると、ⅲ t へのポインタ p の内容として 10 という値を設定しようとしてエラーに なっています。 そこで、この変数 p がどのような値になっているのかを 調べてみましよう。変数の内容を確認するには、 print ( 省 略形は p) コマンドを使います。 (gdb) p p (int * ) 0X0 $ 1 = (gdb) UN 工 X MAGAZINE 2004.4 p の値が 0 になっていることカ寉認できました。たいてい のシステムでは、メモリ上のアドレス 0 はアクセスしては いけない領域になっているため、この時点でプログラムが 異常終了したことカ吩かります。実際にデバッグをおこな う場合は、さらに p のアドレスを設疋している sub2 関数 を調べ、なぜ 0 になっているのかを突き止めれば、問題を 夬することができるはずです。 もうすこしコアダンプの調べ方 コアダンプするプログラムをもう 1 つみてみましよう。 今度は sample2. c です ( 図 10 ) 。 samplel. c と同じく、確実にセグメンテーション・フォ ルトを起こすために sub2 関数で明示的に 0 を返すように しています。本来は、その直前のコメントアウトしてある 部分のように、なんらかのアドレスを確保して返す関数だ と思ってください。 39
Pe 日活用のヒント 今聿英世 理 処 五ロ 本 日 るので、内部処理に Unicode を使えば日本語を扱うこと 今回は、 perl で日本語処理をする際に役立つ知識と関数 ができる。たとえば、以下のプログラムを encodetestl. pl を紹介する。まず、 Perl 5.8 およびその前のバージョンで というファイルにシフト JIS で保存したとしよう。 の日本語処理について簡単に説明したあと、以下の関数を とりあげる。 # ! /usr/bin/perl ー use encoding "shiftjis" ・ canonicalize-jp : 日本語の文字列を正規化する関数 my $a print $a, " \ Ⅱ " ・ variant2regular-jp 、 strip-insignificant-jp 、 strip- print substr($a, 0 , 1 ) , org-type-jp : 曖味検索用の文字列処理をおこなう関数 これを実行すると、以下のようにシフト JIS で出力さ ・ kana2sortkey : かなの文字列を辞書式順序でソートす れる。 るための文字列に変換する関数 % . /encodetestl . pl この連載でとりあげるプログラムは私が一 - - ー・から書いたも ソ / ヾ のであり、連載のこれまでのぶんも含めて以下の URL で ソ 公開している。 シフト JIS では、、ソ " は、、 \ X83 \ x5c " で、 \x5c はバ ・ http: 〃 www.geocities.co.jp/SiliconValley-Oakland ックスラッシュである。そのため、シフト JIS を正しく / 4080 / 解釈したうえで処理しないと、上のような結果にはならな プログラムの配布ファイルのなかには、日本語のマニュ い。また、 substr はバイト単位ではなく文字単位で処理 アル (POD ファイル ) が含まれている。対象とする Perl をおこなっている。その証拠に、 2 行目の、、 use encod- のバージョンは、 UNIX の PerI 5.6 / 5.8 、 Windows の ing "shiftjis";" をコメントにして実行するとかなり違っ ActivePerl 5.8 と Cygwin の Perl 5.8 である。 こで た結果になる ( ファイル名は encodetest2. pl だとする ) 。 は各種の Linux 、 BSD 、 SoIaris などの商用 UNIX をす % . /encodetest2. pl ー od —c べてまとめて UNIX と呼んでいる。記事中に示す操作は 0000000 203 203 0 \n 203 \ Ⅱ 0000006 UNIX のコマンド行でのものだが、 Windows 上の Cyg- win でもほば同じ操作がおこなえる。ただし、 Windows 、、ソ " の 2 バイト目がバックスラッシュと解釈され、 $a が の ActivePerI は Cygwin のアプリケーションではない 3 バイトになっている。そして、 2 つ目の print では、、ソ " ので、若干の注意が必要である。 の 1 バイト目だけが出力されている。 このように、 Unicode の処理が標準で組み込まれている Perl での日本語の扱い PerI 5.8 でも、デフォルトの動作は PerI 5.6 までと同様 Perl 5.8 にバイト列をそのまま扱う。 Unicode の扱いや、エンコーディングの相互変換の詳細 perl 5.8 には Unicode の処理が標準で組み込まれてい 63 UN 工 X MAGAZINE 2004.4
デバッガの基礎知識 図 19 ブレークポイントの一キ酳畭 (gdb) b 9 Breakpoint 3 at 0X8048381 : (gdb) b 6 Breakpoint 4 at 0X8048368 : file samp1e3. c, file samp1e3. c, 特集 1 ine 9 . line 6 . (gdb) info break Num Type 3 breakpoint 4 breakpoint (gdb) d Disp Enb Address What keep y 0X08048381 in main at samp1e3. c : 9 keep y 0X08048368 in main at samp1e3. c : 6 De1ete a11 breakpoints? (y or n) y (gdb) info break NO breakpoints or watchpoints . (gdb) 図 20 main 謚にブレークポイントを言綻 (gdb) b main Breakpoint 5 at 0X8048368 : file samp1e3. c, line 8. (gdb) info break Num Type 5 breakpoint (gdb) Disp Enb Address What keep y 0X08048368 in main at samp1e3. c : 8 す。ここで、、 y " を入力すれば、最初からプログラムが実行 されます。 すると、最初のプレークポイントで実行が中断されます。 この段階では、まだ変数 buf と p か亘言されているだけで す。そこで、これらの変数がメモリ上のどの領域に確保さ れたのかを調べてみます。 print コマンドに buf や p という変数をそのまま指定す ると、その変数の内容が表示されてしまいます。ここで表 示したいのはアドレスですから、 print コマンドに変数の アドレスを指定します。 (gdb) p &buf [ 0 ] $ 1 = 0xbfffe6c0 " \ 024 \ n \ 023B ( (gdb) p &p (char * * ) Oxbfffe6bc (gdb) 変数 buf はメモリ上の Oxbfffe6c0 というアドレスから 始まる領域に、変数 p は同じく 0xbfffe6bc に確保されて いることカ認できます ( 図 21 ) 。 それでは、メモリ上のこのアドレスにどのような値が入 っているのかを調べてみましよう。ある範囲のメモリの値 を表示するには x コマンド (examine の意味 ) を使いま す。 実行するときは、 x の後ろに、、 / " ( スラッシュ ) を入力 し、それに続けて表示するアドレスの個数や表示する値の フォーマットなどを指定することができます。何も指定し UN 工 X MAGAZINE 2004.4 図 21 メモリ上にる呆された或 ( 1 ) ない場合は、 ・回数 : 1 ・フォーマット : x ( 16 進数 ) 変数 p として 確保された領域 変数 buf として 確保された領域 アドレス 0xbfffe6bc 0xbfffe6c0 ・メモリサイズの単位 : w ( ワード 4 バイト ) となります。 こでは表示させるアドレスの範囲を、 p の領域 0xbfff 45
UNIX MAGAZINE 主要記事ー 2003 / 04 110 ( 5 ) アルゴリズムとデータ構造の基礎知識 ・プログラミング入門 ( 今泉貴剋 ・ 2003 / 05 102 ( 3 ) プリンタの設疋・・ ( 2 ) ゲスト OS をイリに使うための定・・・・ 2003 / 04 27 ・ VMware Workstation 3.2 特集 ( 本鬱鷓 ) ( 6 ) アルゴリズムとデータ構造の基礎知識 - 文字列探索・・・ 見 ・ 2003 年 4 月 ~ 2004 年 3 月 2003 / 05 88 ( 7 ) アルゴリズムとデータ構造の基礎知識 134 ( 8 ) アルゴリズムとデータ構造の基石懸日識 2003 / 08 90 ( 9 ) アルゴリズムとデータ構造の基礎知識 2003 / 09 115 ・ SoIaris 9 の里と運用 ( 長原辯台 ) バックアップとリストア、パッチの適用 ・ SunScreen 3.2 ( 長原辯台 ) Solaris 9 でファイアウォールを作る・ ・ Linux で RAID 伏下秀冷 ) ・ 2003 / 06 38 2003 / 05 32 UNIX MAGAZINE 2004.4 XCAST6/Linux 佐藤純次・・・・・・ 2003 / 10 127 XCAST6/FreeBSD 長尾寛行・・・・・・ 2003 / 10 122 XCAST6 の概要今井祐二・・・・・ 2003 / 10 118 ・ XCAST6 (2)Web プラウザ、文書の整形、プリンタの接続・・・・・ 2003 / 11 88 (1)Linux のインストール、ユーザーエ竟の言定・・・・・・ 2003 / 10 36 ・プログラマーが自宅で使う UNIX ( 中屋金子 ) IPv6 の基礎、 IPv6 と DNS 、 IPsec ・・・・ 2003 / 09 43 (Timo Sivonen) ・ SoIaris と FreeBSD で IPv6 を使う 38 ( 2 ) ネームサービスの設疋、 LDAP サーバーの応用・・・・・・ 2003 / 08 (I)Solaris 9 の LDAP 認証機能・・・・・・ 2003 / 07 103 ・ LDAP でネームサービス展原台 ) 新機能の言田、旧バージョンからの移行・・・・・・ 2003 / 07 27 ・ VMware Workstation 4 ( 白崎博生 ) ミラーディスクからのプート・・ ・ 2003 / 06 109 整列・・・・・・ 2003 / 06 ー第リ②・・ ・ Broadband SoIution Showcase ( 沖本忠久 ) プロードバンド・ネットワークの言齬 t と運用・・・・・・ 2003 / 11 27 ・メーリングリスト十で情報を活かす ( 大下令 ) Majordomo 十 MHonArc/MaiIman 、 Namazu ・・ 2003 / 12 30 劃田耐各スイッチの曲塑症 ( / 林ロ真 ) スイッチと NIC の相互接続性本館正、↑社ヒ較・・・・・・ 2003 / 12 98 ・安全なネットワークの言雌十と構築 ( 白崎博生 ) ( 1 ) ネットワーク言妬 t の基本、ファイアウォールの構築・ 2004 / 01 41 ( 2 ) 各種サーバーの構築、 PPTP で VPN ・・・・・・ 2004 / 02 114 ・お手軽メールシステムを作ろう ( 大下令 ) fetchmail 、 Web メール、 procmail ・ ・ネットワーク・トラブルの調べ方 ( 1 ) ネットワーク・ツール、 TCP/IP の基礎、トラカレの追跡 荒井美千子 / : ロ恵・・・・ 2004 / 02 27 ( 2 ) 事例にみるトラブル解灣去ー実足躡扁荒井美千子・・ 2004 / 03 99 ・ VMware Workstation 4.0.5 ( キ鷓甦 ) Windows XP で Red Hat Linux 9 を使う・・・・・・ 2004 / 03 23 ・ FreeBSD のブートプロセスをみる ( 白崎博 ( 1 ) Boot Manager ・・ 2003 / 10 180 ( 2 ) b00t1 ・・・・ 2003 / 11 185 ( 3 ) b00t2 ーー BTX の初期化処理・・・・・・ 2003 / 12 175 ( 4 ) b00t2 ーーカーネルのロード・・・・ 2004 / 02 158 (5)btext ・・・・ 2004 / 03 154 ・ IPv6 の実装 ( 島慶ー ) (17)IP セキュリティ・・ ・ 2003 / 04 91 ( 18 ) 言正へッダの処理・・・・・・ 2003 / 05 66 (19)IP セキュリティの出力処理・・・・・・ 2003 / 06 77 ( 20 ) 暗号化へッダの処理・・・・・・ 2003 / 07 57 (21)IP セキュリティの出力処理 ( 2 ) ・・・・ 2003 / 08 65 (22)IPv6 モビリティ・ ・ 2003 / 10 86 ・ 2004 / OI 139 連載 (23)IPv6 モビリティ ( 2 ) ・・ (24)IPv6 モビリティ ( 3 ) ・・ (25)IPv6 モビリティ ( 4 ) ・・ 2003 / 11 74 2004 / 01 97 ・ 2004 / 02 82 189
特集 図 29 sampIe4. c 1 , 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 #include く stdlib . h> #include く string ・ h> #include く stdio . h> typedef struct tlist { int number ; Char* name ; struct tlist* next ; } TLIST; static TLIST* makeCe11 (char* name , int number) ; static TLIST* addCe11(char* name , int number, TLIST* base) ; main(void) int TLIST* base = NULL; base base base addCeII ("ceII addCe11 ("cell B" addCeII("ce11 2 , 3 , base) ; base) ; base) ; TLIST* listp; listp = base; while(listp ! = NULL) { listp = listp—>next ; printf ( " C%d] %s\n" , listp—>number , return 0 ; listp—>name) ; TLIST* makeCeII (char* name , TLIST* ptr; int number) (TLIST*)ma110C(sizeof (TLIST) ) ; pt r ptr—>name = (char*)malloc(strlen(name) + 1) ; return ptr ; ptr—>next (TLIST*) NULL ; ptr—>number = number ; strcpy (ptr¯>name , name) ; TLIST* addCeII (char* name , int number , TLIST* ptr, *qtr; TLIST* base) ptr = makeCe11 (name , number) ; if (base = = NULL){ return ptr; } else { qtr=base ; while(qtr—>next ! = NULL) qtr = qtr¯>next ; qtr—>next = ptr; return base ; UNIX MAGAZINE 2004.4 デバッガの基礎知識 49
U N ー X Commumcat10t1 WebDAV ( 2 ) 広帯域インターネット時代の情報共有 ( 3 ) 山口英 190 N0tes WebDAV をさらに使いこなす 54 くの WWW プラウザは WebDAV の機能に対応してい ただし、注意が必要な点もある。残念ながら、既存の多 に依存しないのは、大きな利点である。 BSD 系 UNIX で動く。このように特定のプラットホーム ライアントも Windows 2000 / XP 、 Mac OS X 、 Linux 、 各種 UNIX や Linux 、 Windows などで利用できるし、ク えば、 WWW サーバーとして Apache 2. x を使うのなら イアントも多種多様なプラットホームで構成できる。たと になっている点も重要である。このため、サーバーもクラ また、特定の OS やファイルシステムに依存しない構造 構築するといったよぶんな作業が必要になる。 サーバーに対して安全にアクセスするには、 VPN 環境を NFS や Samba などのシステムの場合、クライアントから なセキュリティ機構がそのまま適用できる。従来からある ず、 WWW サーバーと相性のよい SSL/TLS などの強力 れが WebDAV の最大の利点といってもよいであろう。ま である。ほかのファイル共有システムと比較した場合、こ DAV が HTTP を拡張するかたちで実装されていること このシステムにおいてもっとも注目すべき点は、 Web- DAV 環境が構築できるはすである。 バーを運用しているのであれば、わすかな誌定変更で Web- ュールが標準で含まれている。現在、 Apache 2. x でサー である Apache 2. x には、 WebDAV 機能を提供するモジ の基本的な使い方を紹介した。代表的な WWW サーバー (Web-based Distributed Authoring and Versioning) サーバーをファイルサーバーとして利用する WebDAV 前回は、 HTTP の機能を拡張することにより、 WWW ない。つまり、 WebDAV を使うには、プラットホームごと に利用可能なクライアント・ソフトウェアをみつけ、場合 によってはそれをインストールしなければならないのであ る。この作業はちょっと面倒ではあるが、そもそもクライ アントカ甘是供されていないシステムは皆無に近いので、あ まり心配しなくてもよい。 アクセス制御 こで、利用形態を念頭において設疋方法について考え てみよう。考慮すべき問題はいくつかあるが、なかでも重 要なのはアクセス制御であろう。 WebDAV 環境は、アク セス制御の手法を組み合わせて構築する必要がある。 OS の機能に頼らない UNIX 環境では、アクセス制御の機構はファイルシス テムに実装されている。そして、ユーザー認証や処理実行 制御などの機構と密接に連携することで、より堅固なアク セス制御を実現している。アクセス制御の単位としては、 各ユーザー (owner) 、ユーザーのグループ (group) 、そ の他のユーザー (other) という 3 つのカテゴリーを設疋 し、それぞれに読み / 書き / 実行権限の有無が設定できる。 これにより、かなり柔軟な誌定が可能になる。 UNIX のア クセス制御機構そのものはたいへんシンプルだが、その実 力は相当に高い。 一方、 WebDAV では、ユーザーの識別は WWW サー バーの認証機構によっておこなわれる。ただし、識別結果 は、 WWW サーバーが稼動しているシステムのユーザー 訒証機構とは独立に扱われる。事実、 WebDAV 上のファ ロ心、 イルの所有者とグループは、通常は httpd が実行される際 の UID と GID に設疋されてしまう。つまり、 WWW UNIX MAGAZINE 2004.4
JavaServer Pages 38 荒井美千子 Struts ( 9 ) Struts の TiIes フレームワークは、ページのレイアウト を統一的に作る仕組みです。 Tiles フレームワークを使っ てアプリケーションを作成する手順は次のとおりです。 1. TiIes タグライプラリを web. xml ファイルに登録する。 2. Tiles をプラグインとして struts-config. xml ファイル に登録する。 3. tiles-defs. xml ファイルを言する。 4. レイアウト・ファイルを作成する。 5. ヘッダやフッタなどの複数のページで共通して利用する タイルを作成する。 6. ページによって内容が異なる本体部分のタイルを作成す る。 前回は、上記の手順に沿って wordgame アプリケーショ ンのレイアウト・ファイルを作るところまで説明しました。 図 1 は、作成したレイアウト・ファイル、 ・ layouts/wordgameLayout ・ jsp です。今回は、残りのヘッダやフッタ、本体のタイルを作 ります。 タイルのサンプルとして、 Tiles パッケージ 1 に含まれて いる、、 tiles-blank-strutsl-l" というアプリケーションの ファイルを使用します。 Tiles を利用してみたいと考えて いる人は、こうしたサンプルを書き換えるところから始め ると手をつけやすいでしよう。 wordgame のおもなファイル 図 2 に、 wordgame アプリケーションのおもなファイ 1 TiIes パッケージは http://www.ⅱ日.fr/&dumoulin/tiles/tiles. tar. gz から入手できます。 UN 工 X MAGAZINE 2004.4 ルとディレクトリ構成を示します。ファイル名の後ろに * マークカ咐いているのは、今回作成するファイルです。 タイルのファイルや設疋ファイルなどは、 wordgame ア プリケーションのディレクトリの下の、いくつかのサプデ ィレクトリに分散しています。記事を読んでいてファイル の所在が分からなくなったときは、この図で確認してくだ さい。 フッタタイルのイ乍成 なら、 1. ヘッダ 2. フッタ の順に説明していくところですが、サンカレコードの説明 の都合があるので、最初にフッタタイルを作ります。 tiles-blank-strutsl-l アプリケーションのフッタタイ ルは、 ・ $APPDIR/tiIes/common/f00ter. jsp にあります。これを wordgame アプリケーションにコ ピーして書き換えましよう。なお、 $APPDIR は tiles- blank-strutsl-l アプリケーションをインストールしたデ を表示します。 ・ロゴイメージ 著イ / 龕 このフッタタイルは、図 4 のように 図 3 は、サンプルのフッタタイルです。 サンプルのフッタタイル ィレクトリです。 115
連載 / UN Ⅸ便利帖ー 0 リスト 5 ラ立データの履歴表示スクリプト く 01 > $logfile fopen("position. 103 while (!feof($logfile)) { $info fscanf($logfile, if ($info) { list($t, $ns, $lat, $ew, $ 1 。Ⅱ , $acc) $info; date("rl' print " く li > ” $ew . $ 10n く / 01 > $info = NULL ; リスト 6 ゼンリンキ歸マップの URI $ns $lat print " く a href=\"http://j ・ i ・ zenrin ・ co ・ jp/GpsMap/gpsmap ・ jsp?geo= $geo "&uid=NULLGWDOCOMO&X-acc=" "&ip=a001&pos= $ns $lat . $ew . $ 1 。Ⅱ リスト 7 AD 乗換案内の URI print " く a href=\"http://mb.jorudan . co ・ jp/gps/norigps ・ cgi?pos= $ns $lat . $ew . $ 10n. "&geo= $geo "&X—acc= "\">norikae く /a>\n" ・ リスト 8 ISS を見るための URI $1at2 substr($lat, 0 , 2 ) + substr($lat, 3 , 2 ) / 60 + substr($lat , 6 , 2 ) / 3600 + substr($lat , 9 , 2 ) / 360000 ; substr($lon, 0 , 3 ) + (substr($lon, 4 , 2 ) / 60 + substr($lon, 7 , 2 ) / 3600 + substr($lon, 10 , 2 ) / 360000 ; print " く a href=\"http://mobile.jaxa ・ jp/cgi—bin/iss/mobile_i_visibation. cgi?Latitude=%2Bt' $1at2 "&Longitude=%2B" $ 10n2 . "&Vehic1e=1\">ISS</a>\nl' ・ $ 10 Ⅱ 2 ( 誌面の都合上、で折り返しています ) ば地上からも観測できます。 JAXA では、この ISS を観 測するためのガイドとなる位置情報を観測地の緯度・経度 の情報をもとに言 1 算し、分かりやすく表示してくれるべー ジを開設しています。 このページへの緯度・経度の入力は、 F661i カ皺う、、北 緯 35 度 02 分 33 秒 73 " という形式ではなく、、、北緯 35.042703 度 " というかたちになります。したがって、 のページへの URI を作成するときには緯度と経度の値 を変換しなければなりません。この変換をおこないつつ 、、 ISS を見よう " ページへの URI を作成するのが、リスト 8 のスクリプトです。 ☆ 測イ吉果にもとづき、いろいろな情報を提供してくれる WWW ページはたくさんあります。今回は、それらのな かから、自分の好みでいくつかのページへのリンクを作成 UN 工 X MAGAZINE 2004.4 したり、自分の居場所を逐次記録したりするための仕掛け を作ってみました。 スクリプトの作成は、、思い立ったら即実行 " という方針 でおこない、細かい作業を除けば約 1 時間で使えるように なりました。この仕掛けは本格的な運用を前提にしたもの ではないので、 3 日も使えばポロカ咄るかもしれません。し かし、ボロカ咄たら直して使うというのも、題末的プログ ラムならではの楽しみではないかと思います。 ( みやした・けんすけ京都女子大学 ) 143
連載 / Pe 日活用のヒント リスト 1 test. pl 1 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 # ! /usr/bin/perl —w # $ld: test. pl,v 1.1 2004 / 02 / 11 23 : 41 : 06 himazu Exp $ use StriCt; use Encode : my $orig my $canon my $regular my $noinsig my $noorg pr i nt print pr i nt pr i nt pr int 'canonicalize—jp¯> "variant2regu1ar-jp-> "strip—insignificant—jp-> $noinsig\n" "strip.org/type-jp-> :JP::Uti1; "A B C D ! @キンク・・シ・ヨー新日鐵證券株式會社 " ・ canonicalize—jp($orig) ; variant2regu1ar-jp($canon) ; strip—insignificant—jp($regular) ; strip.org/type—jp($noinsig) ; $noorg\n" $regular\n" $canon\n" $orig\n" use Encode : : JP: :KanaTOSortKey; print "\nkana2sortkey : \n" foreach my $i ( split (/\n/, くく END) ) { ドヴァーラヴァティー カーノレス丿レーエ けつばんじよう ワーテノレロー END print "$i kana2sortkey ($i) , リスト 2 Util.pm 2 3 5 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # (c) 2004 Morgan Stan1ey Dean Witter and Co. . /LICENSE for terms of distribution. # See # $ld: Uti1. pm,v 1 . 1 2004 / 02 / 11 08 : 34 : 07 himazu Exp $ package Encode : : JP : : Uti1 ; use StriCt ; use base qw (Exporter) ; our @EXPORT = qw( ascii_z2h canonicalize—jp variant2regu1ar-JP strip—insignificant—jp strip.org/type-Jp use Encode : use Encode : : JP : : H2Z ; :CJKConstants qw( : a11 ) ; UNIX MAGAZINE 2004.4 73
連載 /FreeBSD のブートプロセスをみる 2 , 128 ~ 2 , 131 行目では、 gdp¯>gd—dpl = 3 ; 、カーネル・メッセージバッ アとは、 dmesg コマンドで表示される内容をイ尉寺している ファ " を初期化しています。カーネル・メッセージバッフ バッフアです。 コー丿レゲートの言聢 図 13 セグメント・セレクタの形式 lndex 羽 RPL 2134 : 2135 : 2136 : 2137 : 2138 : 2139 : 2140 : 2141 : 2142 : 2143 : gdp = &ldt [LSYS5CALLS—SEL] . gd; (int) &X1ca11—sysca11; X gdp—>gd—hioffset = x > > 16 ; SDT_SYS386CGT ; gdp—>gd—stkcpy = 1 ; selector = GCODE—SEL くく gdp—>gd—looffset = x; gdp¯>gd-p = 1 ; gdp—>gd—type = gdp->gd- 2160 : 2161 : 2162 : 2163 threadO. td—pcb—>pcb—ext = 0 ; threadO. td-frame = &procO—tf ; 3 ー 0 ; FreeBSD のユーザープロセスは、次の 2 つの方法でシ 略します。ただ、このようにしてサポートされているとい だけにかぎりませんが ) 、コールゲートについての説明は省 す。 a. out は FreeBSD では旧い形式なので (FreeBSD ポートするために、 LDT にコールゲートを設疋していま 2 , 134 ~ 2 , 143 行目は、 a. out 形式の実行ファイルをサ していました。 イルは、 LCALL 7 0 命令を実行するコールゲートを利用 Xint0x80-syscall です ) 。一方、以前の a. out 形式のファ 生させてシステムコールを呼び出します ( 2 , 060 行目の イルは、 INT 80H 命令によりソフトウェア割込みを発 最近の FreeBSD で使われている ELF 形式のファ ・コールゲート ・ソフトウェア割込み ステムコールを呼び出します。 うことだけ知っておくとよいでしよう。 PCB の言又疋 0150 : 0209 : 2151 : 2152 : 2153 : 2154 : 2155 : 2159 : 170 int _udatasel , static struct ucodesel = udatasel = _ucodesel; trapframe procO—tf ; LUDATA—SEL くく 3 ー 4 ー 3 ; LUCODE—SEL くく 3 ー 4 ー 3 ; / * setup proc O's pcb * / threadO. td—pcb—>pcb—flags threadO. td—pcb—>pcb—cr3 Id1ePTD ; 2 , 151 ~ 2 , 152 行目では、ユーザープロセスのコードと データ用のセグメント・セレクタ値を大域変数 - ucodesel と -udatasel に設疋しています。これら 2 つのセグメン トは LDT に登録されているため ( 1 , 421 ~ 1 , 440 行目 ) 、 LDT を参照するように下位 3 ビット目がセットされます ( 図 13 ) 。 2 , 155 ~ 2 , 161 行目は、 swapper のスレッドを管理す る構造体 thread0 の PCB を初期化しています ( 図 1 の struct pcb" です )。ところが、 2 , 159 行目の pcb-cr3 に ついては、前回説明した btext の以下の行ですでに設疋さ れているはずです。 0343 : movl 0344 : 0345 : movl (2*PAGE_SIZE—PCB_SIZE + PCB—CR3) (%eax) 2 , 159 行目を実行する直前に pcb-cr3 の値を調べてみる と、 IdIePTD の値が格納されています。この行は不要で はないかと思います。 工 d1ePTD, %esi ☆ 次回は、 getmemsize() をとりあげます。 ( しらさき・ひろお IIJ) [ 赭文献 ] [ 1 ] Jason Evans, Kernel-Scheduled Entities for Free- BSD, November 7 , 2000 UNIX MAGAZINE 2004.4