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ビットを特別なレジスタに書き込む必要があります)。そのためのタイムラインが意味をなすかどうかは
—
わかり