Linux 재부팅 시스템 호출에서“마법 인수”는 무엇입니까?


10

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 이해가 되겠지만 ... 모든 시스템 호출이 이와 같은 보호를 필요로하지는 않습니까? getpid물론 등을 제외 하고는 잘못 사용하면 모두 예측할 수없는 결과를 초래할 수 있습니다. 또는 다른 모든 syscall에는 이미 잘못 호출 된 경우 무해한 것으로 확인하기에 충분한 매개 변수가 이미 있습니다. 그것은 나에게 "안전"이라는 이상한 생각처럼 느껴집니다.
lgeorget

과연. 한 시점에서 Linus가 # $ & #을 유지 한 버그를 쫓고 있는지 확실하지 않습니다! 자신의 컴퓨터를 재부팅하거나 누군가가 편집증 등으로 방금 추가 한 경우 등을 보호합니다. 그로부터 보호가 필요한 이유는 무엇입니까?
derobert

@derobert 아마도 많은 칩들이 셧다운 기능을 가능하게하기 위해 일종의 보호를 구현하는 집적 회로에 익숙한 누군가로부터의 보류 일 것이다. 그래도 타임 라인이 의미가 있는지 잘 모르겠습니다.
mbrig

답변:


10

이 질문은이 슈퍼 유저 질문에서 답변되었습니다 :

기본적으로 주소를 약간 뒤집 으면 실제로 시스템 호출을 호출 할 때 프로그램이 하나의 시스템 호출을 호출한다고 생각할 수 있습니다 reboot(). reboot()시스템 상태를 지우는 매우 파괴적이고 동기화되지 않은 작업 이기 때문에 프로그램 오류 또는 패닉으로 노출 될 수있는 비트 플립 문제의 증거를 지우는 Linux-성공적인 사용에 대한 추가 보호 기능 .

흥미롭게도, 두 번째 마법 숫자 세트는 Linus와 그의 세 딸의 생일에 해당합니다.


1
아, 다른 사이트를 확인하는 것에 대해서는 생각하지 않았습니다. 나는이 질문이 여기 이외의 것이라고 생각하지 않았습니다. 어쨌든 대답 해 주셔서 감사합니다. :-)
lgeorget
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.