Linux 소스 코드, 특히 시스템 호출 코드를 읽으면서 sys_reboot
구현 을 살펴 보았습니다 . http://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;
그것이 실제로 어떤 종류의 "안전"을 제공하는지 궁금합니다. 내 말은, 오용을 방지하기위한 것인가? 이 경우 매개 변수가 공용이므로 모든 라이브러리 또는 응용 프로그램은 매개 변수를 전달해야하더라도 시스템 호출을 잘못 사용할 수 있습니다. 내가 놓친 게 무엇입니까?
메모리 손상이나 시스템 콜 번호 오타로 인한 우발적 인 호출 일 수 있습니다. 그것이 실제로 걱정할 가치가 있는지 여부는 모릅니다.
—
derobert
@derobert 이해가 되겠지만 ... 모든 시스템 호출이 이와 같은 보호를 필요로하지는 않습니까?
—
lgeorget
getpid
물론 등을 제외 하고는 잘못 사용하면 모두 예측할 수없는 결과를 초래할 수 있습니다. 또는 다른 모든 syscall에는 이미 잘못 호출 된 경우 무해한 것으로 확인하기에 충분한 매개 변수가 이미 있습니다. 그것은 나에게 "안전"이라는 이상한 생각처럼 느껴집니다.
과연. 한 시점에서 Linus가 # $ & #을 유지 한 버그를 쫓고 있는지 확실하지 않습니다! 자신의 컴퓨터를 재부팅하거나 누군가가 편집증 등으로 방금 추가 한 경우 등을 보호합니다. 그로부터 보호가 필요한 이유는 무엇입니까?
—
derobert
@derobert 아마도 많은 칩들이 셧다운 기능을 가능하게하기 위해 일종의 보호를 구현하는 집적 회로에 익숙한 누군가로부터의 보류 일 것이다. 그래도 타임 라인이 의미가 있는지 잘 모르겠습니다.
—
mbrig