The Linux Programming Interface は、第3章で次のような演習を行っています。
Linux固有のreboot()システムコールを使用してシステムを再起動する場合、2番目の引数magic2を一連のマジック番号の1つとして指定する必要があります(例:LINUX_REBOOT_MAGIC2)。これらの数字の意味は何ですか? (それらを16進数に変換すると、手掛かりが得られます。)
マニュアルページは、magic2
がLINUX_REBOOT_MAGIC2(672274793)、LINUX_REBOOT_MAGIC2A(85072278)、LINUX_REBOOT_MAGIC2B(369367448)、またはLINUX_REBOOT_MAGIC2C(537993216)のいずれかである可能性があることを示しています。 16進数でそれらの意味を解読できませんでした。 /usr/include/linux/reboot.h
も確認しましたが、役立つコメントはありませんでした。
次に、カーネルのソースコードでsys_reboot
の定義を検索しました。私が見つけたのは、ヘッダーファイルの宣言だけです。
したがって、私の最初の質問は、これらの数字の意味は何ですか? 2つ目の質問は、sys_reboot
の定義はどこにあり、どのようにして見つけたのですか。
[〜#〜] edit [〜#〜]:kernel/sys.c
に定義が見つかりました。私はsys_reboot
をgrepしただけで、MAGIC番号のgrepを忘れていました。マクロトリックの背後に定義が隠されている必要があると思ったので、System.map
の下にある/boot
ファイルを調べ、ctrl_alt_del
の横にそれを見つけました。次に、その記号を検索し、正しいファイルに移動しました。ソースコードからカーネルをコンパイルした場合、シンボルを定義したオブジェクトファイルを見つけてそこから移動することができます。
推測だけですが、これらの数値は16進数でより興味深いように見えます。
672274793 = 0x28121969
85072278 = 0x05121996
369367448 = 0x16041998
537993216 = 0x20112000
開発者または開発者の子供の誕生日は?
Syscall実装を見つけることに関して、私はgit grep -n LINUX_REBOOT_MAGIC2
を実行し、カーネル/sys.cで定義を見つけました。シンボルsys_reboot
はSYSCALL_DEFINE4(reboot, ...
グッビンによって生成されたと思います。
Linus Torvalds(LinuxカーネルとGitバージョン管理の開発者)と3人の娘の誕生日です。マジックナンバーとして機能し、システムを再起動します。