紅孔雀 このページをアンテナに追加 RSSフィード

2013-01-02 LINUX プログラミングインタフェース 3章

LINUX プログラミングインタフェース 3章

冬休み中なので、普段はじっくり読む時間をとりづらい本を読むことができています。

今は「LINUXプログラミングインタフェース」を読んでいます。

今まで Linux でのシステムプログラミングを行なった経験は無かったので、初めて知ることだらけです。

まだ 3 章までしか読み終えていませんが、学んだことをいくつかまとめます。

カーネルのソースコード

今までカーネルのソースコードを読んだことは無かったのですが、良い機会なのでダウンロードしました。

カーネルのソースコードは The Linux Kernel Archives からダウンロードできます。

「カーネルコードを読み」というと何となく敷居が高い感じがしますが、ダウンロードして展開するだけです。

wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.7.1.tar.bz2
tar xvfo linux-3.7.1.tar.bz2

「3 章 システムプログラミング」では、システムコールが呼び出されたときに内部で行なわれる処理が書かれていました。

システムコールを呼び出すと、最終的に system_call() 関数が呼び出されると書かれていたので、その部分のコードを読んでみました。

カーネルコードの中の arch/x86/kernel$ view entry_32.S に system_call() 関数の定義がありました(アーキテクチャごとにファイルは分かれています)。

読んでも理解できない部分が多いのですが、システムコールを呼び出して戻り値を返す、という部分は見つけることができました。

 517 syscall_call:
 518     call *sys_call_table(,%eax,4)
 519     movl %eax,PT_EAX(%esp)      # store the return value

きちんと読み解くには、もっと経験値が必要そうです。

reboot() の第二引数に渡すマジックナンバーの意味

第 3 章の演習に「システムコール reboot の第二引数に渡す LINUX_REBOOT_MAGIC2 などのマジックナンバーの意味を答えよ(ヒント:値を 16 進数に変換する)」とありました。

まずは、man コマンドで「LINUX_REBOOT_MAGIC2 などのマジックナンバー」を確認します。

man 2 reboot

関係のある部分だけ抜粋します。

This   system   call  will  fail  (with  EINVAL)  unless  magic  equals
LINUX_REBOOT_MAGIC1   (that   is,   0xfee1dead)   and   magic2   equals
LINUX_REBOOT_MAGIC2  (that  is, 672274793).  However, since 2.1.17 also
LINUX_REBOOT_MAGIC2A  (that  is,  85072278)  and  since   2.1.97   also
LINUX_REBOOT_MAGIC2B   (that  is,  369367448)  and  since  2.5.71  also
LINUX_REBOOT_MAGIC2C (that is, 537993216) are permitted  as  value  for
magic2.   (The  hexadecimal  values of these constants are meaningful.)

「LINUX_REBOOT_MAGIC2 などのマジックナンバー」が何であるか確認することができました。ついでに「The hexadecimal values of these constants are meaningful. (これらの 16 進数値には意味が込められている」と意味深なことが書かれています。

とりあえず各マジックナンバーを 16 進数に変換しました。

定数名 16 進数値
LINUX_REBOOT_MAGIC1 0xfee1dead
LINUX_REBOOT_MAGIC2 0x28121969
LINUX_REBOOT_MAGIC2A 0x05121996
LINUX_REBOOT_MAGIC2B 0x16041998
LINUX_REBOOT_MAGIC2C 0x20112000

う〜ん、、としばらく考えてみたのですが分かりませんでした。

ギブアップして検索してみると、リーナス・トーバルズと 3 人の娘さんの誕生日だったんですね。

定数名 16 進数値 意味
LINUX_REBOOT_MAGIC1 0xfee1dead feel dead
LINUX_REBOOT_MAGIC2 0x28121969 1969/12/28 リーナス・トーバルズの誕生日
LINUX_REBOOT_MAGIC2A 0x05121996 1996/12/05 一人目の娘の誕生日
LINUX_REBOOT_MAGIC2B 0x16041998 1998/04/16 二人目の娘の誕生日
LINUX_REBOOT_MAGIC2C 0x20112000 2000/11/20 三人目の娘の誕生日

参考ページ: リーナス・トーバルズ - Wikipedia

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/benikujyaku/20130102/1357142427
Connection: close