Linuxの再起動システムコールでの「魔法の引数」の用途は何ですか?


10

Linuxのソースコード、より具体的にはシステムコールのコードを読んでいるときに、httpsys_reboot//lxr.free-electrons.com/source/kernel/reboot.c#L199の実装に遭遇しました。

199 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
200                 void __user *, arg)
201 {
202        ...
...    
286 }

真ん中には、次の特定のコードがあります。

209 
210         /* For safety, we require "magic" arguments. */
211         if (magic1 != LINUX_REBOOT_MAGIC1 ||
212                         (magic2 != LINUX_REBOOT_MAGIC2 &&
213                         magic2 != LINUX_REBOOT_MAGIC2A &&
214                         magic2 != LINUX_REBOOT_MAGIC2B &&
215                         magic2 != LINUX_REBOOT_MAGIC2C))
216                 return -EINVAL;

それが実際にどんな「安全」を提供してくれるのか。つまり、誤用を防ぐためですか?この場合、パラメーターはパブリックであるため、パラメーターを渡す必要がある場合でも、ライブラリーまたはアプリケーションはシステムコールを誤用する可能性があります。私は何を取りこぼしたか?


たとえば、メモリの破損や、syscall番号のタイプミスなどによる偶発的な呼び出しが原因です。それが実際に心配する価値があるものかどうかはわかりません。
derobert 14

@derobertは理にかなっていますが...すべてのシステムコールがこのような保護を必要とするわけではないでしょうか?getpidもちろん、などを除いて、誤用した場合、すべて予測できない結果をもたらす可能性があります。あるいは、他のすべてのsyscallには、それらが誤って呼び出された場合に無害にするためにチェックするのに十分なパラメーターがすでにあります。それは私にとっては「安全性」の奇妙な考えのように
思え

確かに。ある時点で、Linusが#$&#を保持するバグを追いかけていたのかどうかはわかりません!彼のマシンを再起動したり、偏執狂だったために誰かがそれを追加したりした場合など。なぜそれからの保護が必要なのかは良い質問です。
derobert 14

@derobertおそらく、多くのチップがシャットダウン機能を有効にするために何らかのガードを実装している集積回路に使用されていたホールドオーバー(たとえば、シャットダウン命令が機能する前に、XYZビットを特別なレジスタに書き込む必要があります)。そのためのタイムラインが意味をなすかどうかは
わかり

回答:


10

この質問は、このスーパーユーザーの質問で回答されています。

基本的に、アドレスのビットフリップは、実際にはシステムコールを呼び出しているときに、プログラムが1つのシステムコールを呼び出していると見なす可能性がありreboot()ます。のでreboot()ので、それ以外の場合は、プログラムエラーやパニックとして公開されるだろうビットフリップ問題の証拠を消去- -システムの状態を消去非常に破壊的な、非同期操作であるLinuxは、その成功の使用の周りに余分な保護を含み。

興味深いことに、マジック番号の2番目のセットは、Linusと彼の3人の娘の誕生日に対応しています。


1
ああ、他のサイトの確認は考えていませんでした。この質問がここ以外にあるとは思いもしませんでした。とにかく、お返事ありがとうございます。:-)
lgeorget 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.