1. ホーム
  2. linux

Linuxのreboot()システムコールのマジックナンバー

2023-07-29 06:34:56

質問

Linux プログラミング インターフェース には、第3章にこのような練習問題があります。

Linux特有のreboot() システムコールを使ってシステムをリブートする場合 第2引数の magic2 は マジックナンバーのセットの1つとして指定する必要があります。 数 (例: LINUX_REBOOT_MAGIC2) のいずれかを指定する必要があります。 これらの数字の意味は何ですか? これらの数字の意味は何ですか?(16進数に変換することで、そのヒントが得られます。 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 の定義を探しました。私が見つけたのは、ヘッダー ファイル内の宣言だけでした。

したがって、私の最初の疑問は、これらの数字の意味は何なのか、ということです。第二の疑問は sys_reboot の定義はどこにあるのか、そしてどうやってそれを見つけたのか?

EDIT : で定義されていることがわかりました。 kernel/sys.c . を grep しただけです。 sys_reboot のみを検索し、MAGICナンバーを検索するのを忘れていました。私は、定義が何らかのマクロのトリックの後ろに隠されているに違いないと考え、そのために System.map ファイルの下にある /boot の隣にあります。 ctrl_alt_del . そして、そのシンボルを grep して、正しいファイルへと導きました。もし私がソース コードからカーネルをコンパイルしていたなら、どのオブジェクト ファイルがそのシンボルを定義しているかを見つけ、そこから行くことができました。

どのように解決するのですか?

単なる推測ですが、これらの数字は16進数の方が面白そうです。

672274793 = 0x28121969
 85072278 = 0x05121996
369367448 = 0x16041998
537993216 = 0x20112000

開発者の誕生日、開発者の子供の誕生日?

syscallの実装を見つけることについては、私が行ったのは git grep -n LINUX_REBOOT_MAGIC2 を実行したところ、kernel/sys.c に定義が見つかりました。 sys_reboot が生成されるのは SYSCALL_DEFINE4(reboot, ... gubbins と思われます。