요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. include:: ../disclaimer-ita.rst
:Original: :ref:`Documentation/staging/magic-number.rst <magicnumbers>`
:Translator: Federico Vaga <federico.vaga@vaga.pv.it>
.. _it_magicnumbers:
I numeri magici di Linux
========================
Questo documento è un registro dei numeri magici in uso. Quando
aggiungete un numero magico ad una struttura, dovreste aggiungerlo anche
a questo documento; la cosa migliore è che tutti i numeri magici usati
dalle varie strutture siano unici.
È **davvero** un'ottima idea proteggere le strutture dati del kernel con
dei numeri magici. Questo vi permette in fase d'esecuzione di (a) verificare
se una struttura è stata malmenata, o (b) avete passato a una procedura la
struttura errata. Quest'ultimo è molto utile - particolarmente quando si passa
una struttura dati tramite un puntatore void \*. Il codice tty, per esempio,
effettua questa operazione con regolarità passando avanti e indietro le
strutture specifiche per driver e discipline.
Per utilizzare un numero magico, dovete dichiararlo all'inizio della struttura
dati, come di seguito::
struct tty_ldisc {
int magic;
...
};
Per favore, seguite questa direttiva quando aggiungerete migliorie al kernel!
Mi ha risparmiato un numero illimitato di ore di debug, specialmente nei casi
più ostici dove si è andati oltre la dimensione di un vettore e la struttura
dati che lo seguiva in memoria è stata sovrascritta. Seguendo questa
direttiva, questi casi vengono identificati velocemente e in sicurezza.
Registro dei cambiamenti::
Theodore Ts'o
31 Mar 94
La tabella magica è aggiornata a Linux 2.1.55.
Michael Chastain
<mailto:mec@shout.net>
22 Sep 1997
Ora dovrebbe essere aggiornata a Linux 2.1.112. Dato che
siamo in un momento di congelamento delle funzionalità
(*feature freeze*) è improbabile che qualcosa cambi prima
della versione 2.2.x. Le righe sono ordinate secondo il
campo numero.
Krzysztof G. Baranowski
<mailto: kgb@knm.org.pl>
29 Jul 1998
Aggiornamento della tabella a Linux 2.5.45. Giusti nel congelamento
delle funzionalità ma è comunque possibile che qualche nuovo
numero magico s'intrufoli prima del kernel 2.6.x.
Petr Baudis
<pasky@ucw.cz>
03 Nov 2002
Aggiornamento della tabella magica a Linux 2.5.74.
Fabian Frederick
<ffrederick@users.sourceforge.net>
09 Jul 2003
===================== ================ ======================== ==========================================
Nome magico Numero Struttura File
===================== ================ ======================== ==========================================
PG_MAGIC 'P' pg_{read,write}_hdr ``include/linux/pg.h``
APM_BIOS_MAGIC 0x4101 apm_user ``arch/x86/kernel/apm_32.c``
FASYNC_MAGIC 0x4601 fasync_struct ``include/linux/fs.h``
SLIP_MAGIC 0x5302 slip ``drivers/net/slip.h``
BAYCOM_MAGIC 0x19730510 baycom_state ``drivers/net/baycom_epp.c``
HDLCDRV_MAGIC 0x5ac6e778 hdlcdrv_state ``include/linux/hdlcdrv.h``
KV_MAGIC 0x5f4b565f kernel_vars_s ``arch/mips/include/asm/sn/klkernvars.h``
CODA_MAGIC 0xC0DAC0DA coda_file_info ``fs/coda/coda_fs_i.h``
YAM_MAGIC 0xF10A7654 yam_port ``drivers/net/hamradio/yam.c``
CCB_MAGIC 0xf2691ad2 ccb ``drivers/scsi/ncr53c8xx.c``
QUEUE_MAGIC_FREE 0xf7e1c9a3 queue_entry ``drivers/scsi/arm/queue.c``
QUEUE_MAGIC_USED 0xf7e1cc33 queue_entry ``drivers/scsi/arm/queue.c``
NMI_MAGIC 0x48414d4d455201 nmi_s ``arch/mips/include/asm/sn/nmi.h``
===================== ================ ======================== ==========================================
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
문서 정보와 제목
1-10이 문서는 이탈리아어 번역 면책문을 포함하며, 원문은 `Documentation/staging/magic-number.rst`의 `magicnumbers` anchor입니다. 번역자는 Federico Vaga이고 이 페이지의 이탈리아어 anchor는 `it_magicnumbers`입니다.
제목 `I numeri magici di Linux`는 'Linux의 magic number'를 뜻합니다.
.. include:: ../disclaimer-ita.rst
:Original: :ref:`Documentation/staging/magic-number.rst <magicnumbers>`
:Translator: Federico Vaga <federico.vaga@vaga.pv.it>
.. _it_magicnumbers:
I numeri magici di Linux
========================
Magic number 등록 원칙
11-15이 문서는 현재 사용 중인 magic number의 등록부입니다. 구조체에 magic number를 추가할 때는 이 문서에도 함께 기록해야 하며, 여러 구조체에서 사용하는 모든 magic number는 서로 고유하게 정하는 것이 가장 좋습니다.
Questo documento è un registro dei numeri magici in uso. Quando
aggiungete un numero magico ad una struttura, dovreste aggiungerlo anche
a questo documento; la cosa migliore è che tutti i numeri magici usati
dalle varie strutture siano unici.
실행 중 구조체 검증
16-23Kernel data structure를 magic number로 보호하는 것은 정말 좋은 방법입니다. 실행 중에 구조체가 훼손되었는지 확인하거나, procedure에 잘못된 구조체를 전달했는지 검사할 수 있기 때문입니다.
두 번째 검사는 특히 `void *` pointer로 data structure를 전달할 때 유용합니다. 예를 들어 tty code는 driver별 구조체와 line discipline별 구조체를 앞뒤로 넘기면서 이 검사를 정기적으로 수행합니다.
È **davvero** un'ottima idea proteggere le strutture dati del kernel con
dei numeri magici. Questo vi permette in fase d'esecuzione di (a) verificare
se una struttura è stata malmenata, o (b) avete passato a una procedura la
struttura errata. Quest'ultimo è molto utile - particolarmente quando si passa
una struttura dati tramite un puntatore void \*. Il codice tty, per esempio,
effettua questa operazione con regolarità passando avanti e indietro le
strutture specifiche per driver e discipline.
구조체 첫 필드에 선언
24-31Magic number를 사용하려면 아래와 같이 data structure의 맨 앞에 선언해야 합니다.
struct tty_ldisc {
int magic;
...
};
Per utilizzare un numero magico, dovete dichiararlo all'inizio della struttura
dati, come di seguito::
struct tty_ldisc {
int magic;
...
};
경계 초과 손상의 조기 발견
32-37Kernel을 개선할 때 이 지침을 따라야 합니다. 이 방법은 셀 수 없이 많은 debugging 시간을 줄여 주었으며, 특히 array 경계를 넘어선 쓰기로 메모리에서 바로 뒤에 있던 data structure가 덮어써지는 까다로운 문제에 효과적입니다.
이 지침을 따르면 그러한 memory corruption을 빠르고 확실하게 식별할 수 있습니다.
Per favore, seguite questa direttiva quando aggiungerete migliorie al kernel!
Mi ha risparmiato un numero illimitato di ore di debug, specialmente nei casi
più ostici dove si è andati oltre la dimensione di un vettore e la struttura
dati che lo seguiva in memoria è stata sovrascritta. Seguendo questa
direttiva, questi casi vengono identificati velocemente e in sicurezza.
변경 기록: 1994~1997
38-48변경 기록: Theodore Ts'o가 1994년 3월 31일 기록했으며, magic number 표는 Linux 2.1.55 기준으로 갱신되었습니다.
Michael Chastain `<mailto:mec@shout.net>`가 1997년 9월 22일 다음 갱신 기록을 남겼습니다.
Registro dei cambiamenti::
Theodore Ts'o
31 Mar 94
La tabella magica è aggiornata a Linux 2.1.55.
Michael Chastain
<mailto:mec@shout.net>
22 Sep 1997
변경 기록: Linux 2.1.112
49-58표는 Linux 2.1.112 기준으로 갱신되었습니다. 당시 feature freeze 기간이었으므로 2.2.x release 전에 변경될 가능성은 작았고, 행은 number field를 기준으로 정렬했습니다.
이 기록은 Krzysztof G. Baranowski `<mailto: kgb@knm.org.pl>`가 1998년 7월 29일 작성했습니다.
Ora dovrebbe essere aggiornata a Linux 2.1.112. Dato che
siamo in un momento di congelamento delle funzionalità
(*feature freeze*) è improbabile che qualcosa cambi prima
della versione 2.2.x. Le righe sono ordinate secondo il
campo numero.
Krzysztof G. Baranowski
<mailto: kgb@knm.org.pl>
29 Jul 1998
변경 기록: Linux 2.5.45
59-66표를 Linux 2.5.45 기준으로 갱신했습니다. Feature freeze 시점이었지만 Linux 2.6.x kernel 전에 새로운 magic number가 추가될 가능성은 여전히 있었습니다.
이 기록은 Petr Baudis `<pasky@ucw.cz>`가 2002년 11월 3일 작성했습니다.
Aggiornamento della tabella a Linux 2.5.45. Giusti nel congelamento
delle funzionalità ma è comunque possibile che qualche nuovo
numero magico s'intrufoli prima del kernel 2.6.x.
Petr Baudis
<pasky@ucw.cz>
03 Nov 2002
변경 기록: Linux 2.5.74
67-73Magic number 표를 Linux 2.5.74 기준으로 갱신했습니다. 이 기록은 Fabian Frederick `<ffrederick@users.sourceforge.net>`가 2003년 7월 9일 작성했습니다.
Aggiornamento della tabella magica a Linux 2.5.74.
Fabian Frederick
<ffrederick@users.sourceforge.net>
09 Jul 2003
Magic number 등록표
74-90다음 표는 magic name, number, 적용 structure, 정의 또는 관련 source file을 원문 그대로 대응시킨 등록부입니다. Symbol, 숫자, structure 이름, source path는 검색과 코드 대조를 위해 변경하지 않았습니다.
이탈리아어 원문의 고정폭 표를 동일한 4열 데이터로 구조화했습니다.
===================== ================ ======================== ==========================================
Nome magico Numero Struttura File
===================== ================ ======================== ==========================================
PG_MAGIC 'P' pg_{read,write}_hdr ``include/linux/pg.h``
APM_BIOS_MAGIC 0x4101 apm_user ``arch/x86/kernel/apm_32.c``
FASYNC_MAGIC 0x4601 fasync_struct ``include/linux/fs.h``
SLIP_MAGIC 0x5302 slip ``drivers/net/slip.h``
BAYCOM_MAGIC 0x19730510 baycom_state ``drivers/net/baycom_epp.c``
HDLCDRV_MAGIC 0x5ac6e778 hdlcdrv_state ``include/linux/hdlcdrv.h``
KV_MAGIC 0x5f4b565f kernel_vars_s ``arch/mips/include/asm/sn/klkernvars.h``
CODA_MAGIC 0xC0DAC0DA coda_file_info ``fs/coda/coda_fs_i.h``
YAM_MAGIC 0xF10A7654 yam_port ``drivers/net/hamradio/yam.c``
CCB_MAGIC 0xf2691ad2 ccb ``drivers/scsi/ncr53c8xx.c``
QUEUE_MAGIC_FREE 0xf7e1c9a3 queue_entry ``drivers/scsi/arm/queue.c``
QUEUE_MAGIC_USED 0xf7e1cc33 queue_entry ``drivers/scsi/arm/queue.c``
NMI_MAGIC 0x48414d4d455201 nmi_s ``arch/mips/include/asm/sn/nmi.h``
===================== ================ ======================== ==========================================
요약·해설
magic-number.rst:1-90Magic number를 kernel structure의 첫 필드에 두면 실행 중 구조체 훼손과 잘못된 type 전달을 조기에 확인할 수 있습니다. 특히 `void *`로 driver data를 교환하는 경로와 array 경계 초과로 인접 구조체가 덮어써지는 상황에서 유용합니다.
이 문서의 표는 Linux 2.5.74까지의 역사적 등록부입니다. 실제 코드와 대조할 때는 각 symbol과 source path를 기준으로 현재 kernel tree의 정의가 남아 있는지 별도로 확인해야 합니다.