2011-01-26 11 views
52

The Linux Programming Interface ha un esercizio nel Capitolo 3 che va come questo:numeri magici del sistema Linux riavvio() chiamata

Quando si utilizza il riavvio specifico per Linux() sistema di chiamata per riavviare il sistema, il il secondo argomento, magic2, deve essere specificato come uno di un set di numeri magici (ad esempio LINUX_REBOOT_MAGIC2). Qual è il significato di questi numeri ? (Conversione loro di esadecimale fornisce un indizio.)

La pagina man ci dice magic2 può essere uno dei LINUX_REBOOT_MAGIC2 (672.274.793), LINUX_REBOOT_MAGIC2A (85.072.278), LINUX_REBOOT_MAGIC2B (369.367.448), o LINUX_REBOOT_MAGIC2C (537.993.216). Non sono riuscito a decifrare il loro significato in esadecimale. Ho anche guardato a /usr/include/linux/reboot.h, che non ha dato alcun commento utile neanche.

Ho quindi cercato nel codice sorgente del kernel per la definizione di sys_reboot. Tutto quello che ho trovato era una dichiarazione in un file di intestazione.

Pertanto, la mia prima domanda è, qual è il significato di questi numeri? La mia seconda domanda è: dov'è la definizione di sys_reboot e come l'hai trovata?

EDIT: Ho trovato la definizione in kernel/sys.c. Mi sono solo innamorato di sys_reboot e ho dimenticato di grep per i numeri MAGIC. Ho capito che la definizione deve essere nascosta dietro qualche trucco macro, quindi ho guardato il file System.map sotto /boot e l'ho trovato accanto a ctrl_alt_del. Poi ho iniziato ad usare quel simbolo, che mi ha portato al file corretto. Se avessi compilato il kernel dal codice sorgente, potrei provare a trovare quale file oggetto ha definito il simbolo, e andare da lì.

risposta

71

Solo una supposizione, ma quei numeri aspetto più interessante in esadecimale:

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

sviluppatori o sviluppatori compleanni dei bambini?

Per quanto riguarda la ricerca dell'implementazione di syscall, ho eseguito uno git grep -n LINUX_REBOOT_MAGIC2 e trovato la definizione in kernel/sys.c. Il simbolo sys_reboot viene generato dai gubbins SYSCALL_DEFINE4(reboot, ..., suppongo.

+4

+1 solo per le date;) – BlackBear

+0

che deve essere! Avrei dovuto allineare i numeri! –

+24

Il 28 dicembre 1969 è la data di nascita di Linus Torvalds [Wikipedia]. Gli altri sembrano essere le date di nascita dei suoi figli, anche se posso solo confermare che uno è nato nel dicembre 1996 [random googling]. –

18

È il compleanno di Linus Torvalds (lo sviluppatore del kernel Linux e il controllo della versione Git) e le sue 3 figlie. funziona come numeri magici per riavviare il sistema.

http://en.wikipedia.org/wiki/Linus_Torvalds

Problemi correlati