← Documents Documentation/translations/it_IT/core-api/symbol-namespaces.rst GitHub 원문 ↗

Linux 6.18.37 · Translations

Symbol namespace

커널 export symbol을 namespace로 구조화하고 MODULE_IMPORT_NS로 소비자 의존성을 선언하며 nsdeps로 누락 import를 자동 보정하는 방법을 설명합니다.

Source pathDocumentation/translations/it_IT/core-api/symbol-namespaces.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

symbol-namespaces.rst:1-163

Symbol namespace는 커널 내부 API를 논리적으로 분류하고 모듈이 의존성을 명시하게 합니다. export 측은 명시적 또는 기본 namespace를 설정하고, 소비 모듈은 MODULE_IMPORT_NS()를 선언해야 하며 modpost·모듈 로더·nsdeps가 누락을 검출하고 보정합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 .. include:: ../disclaimer-ita.rst
2
3 :Original: Documentation/core-api/symbol-namespaces.rst
4
5 ===========================
6 Spazio dei nomi dei simboli
7 ===========================
8
9 Questo documento descrive come usare lo spazio dei nomi dei simboli
10 per strutturare quello che viene esportato internamente al kernel
11 grazie alle macro della famiglia EXPORT_SYMBOL().
12
13 Introduzione
14 ============
15
16 Lo spazio dei nomi dei simboli è stato introdotto come mezzo per strutturare
17 l'API esposta internamente al kernel. Permette ai manutentori di un
18 sottosistema di organizzare i simboli esportati in diversi spazi di
19 nomi. Questo meccanismo è utile per la documentazione (pensate ad
20 esempio allo spazio dei nomi SUBSYSTEM_DEBUG) così come per limitare
21 la disponibilità di un gruppo di simboli in altre parti del kernel. Ad
22 oggi, i moduli che usano simboli esportati da uno spazio di nomi
23 devono prima importare detto spazio. Altrimenti il kernel, a seconda
24 della configurazione, potrebbe rifiutare di caricare il modulo o
25 avvisare l'utente di un'importazione mancante.
26
27 Come definire uno spazio dei nomi dei simboli
28 =============================================
29
30 I simboli possono essere esportati in spazi dei nomi usando diversi
31 meccanismi. Tutti questi meccanismi cambiano il modo in cui
32 EXPORT_SYMBOL e simili vengono guidati verso la creazione di voci in ksymtab.
33
34 Usare le macro EXPORT_SYMBOL
35 ----------------------------
36
37 In aggiunta alle macro EXPORT_SYMBOL() e EXPORT_SYMBOL_GPL(), che permettono
38 di esportare simboli del kernel nella rispettiva tabella, ci sono
39 varianti che permettono di esportare simboli all'interno di uno spazio dei
40 nomi: EXPORT_SYMBOL_NS() ed EXPORT_SYMBOL_NS_GPL(). Queste macro richiedono un
41 argomento aggiuntivo: lo spazio dei nomi.
42 Tenete presente che per via dell'espansione delle macro questo argomento deve
43 essere un simbolo di preprocessore. Per esempio per esportare il
44 simbolo ``usb_stor_suspend`` nello spazio dei nomi ``USB_STORAGE`` usate::
45
46 EXPORT_SYMBOL_NS(usb_stor_suspend, "USB_STORAGE");
47
48 Di conseguenza, nella tabella dei simboli del kernel ci sarà una voce
49 rappresentata dalla struttura ``kernel_symbol`` che avrà il campo
50 ``namespace`` (spazio dei nomi) impostato. Un simbolo esportato senza uno spazio
51 dei nomi avrà questo campo impostato a ``NULL``. Non esiste uno spazio dei nomi
52 di base. Il programma ``modpost`` e il codice in kernel/module/main.c usano lo
53 spazio dei nomi, rispettivamente, durante la compilazione e durante il
54 caricamento di un modulo.
55
56 Usare il simbolo di preprocessore DEFAULT_SYMBOL_NAMESPACE
57 ----------------------------------------------------------
58
59 Definire lo spazio dei nomi per tutti i simboli di un sottosistema può essere
60 logorante e di difficile manutenzione. Perciò è stato fornito un simbolo
61 di preprocessore di base (DEFAULT_SYMBOL_NAMESPACE), che, se impostato,
62 diventa lo spazio dei simboli di base per tutti gli usi di EXPORT_SYMBOL()
63 ed EXPORT_SYMBOL_GPL() che non specificano esplicitamente uno spazio dei nomi.
64
65 Ci sono molti modi per specificare questo simbolo di preprocessore e il loro
66 uso dipende dalle preferenze del manutentore di un sottosistema. La prima
67 possibilità è quella di definire il simbolo nel ``Makefile`` del sottosistema.
68 Per esempio per esportare tutti i simboli definiti in usb-common nello spazio
69 dei nomi USB_COMMON, si può aggiungere la seguente linea in
70 drivers/usb/common/Makefile::
71
72 ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE='"USB_COMMON"'
73
74 Questo cambierà tutte le macro EXPORT_SYMBOL() ed EXPORT_SYMBOL_GPL(). Invece,
75 un simbolo esportato con EXPORT_SYMBOL_NS() non verrà cambiato e il simbolo
76 verrà esportato nello spazio dei nomi indicato.
77
78 Una seconda possibilità è quella di definire il simbolo di preprocessore
79 direttamente nei file da compilare. L'esempio precedente diventerebbe::
80
81 #undef DEFAULT_SYMBOL_NAMESPACE
82 #define DEFAULT_SYMBOL_NAMESPACE "USB_COMMON"
83
84 Questo va messo prima di un qualsiasi uso di EXPORT_SYMBOL.
85
86 Come usare i simboli esportati attraverso uno spazio dei nomi
87 =============================================================
88
89 Per usare i simboli esportati da uno spazio dei nomi, i moduli del
90 kernel devono esplicitamente importare il relativo spazio dei nomi; altrimenti
91 il kernel potrebbe rifiutarsi di caricare il modulo. Il codice del
92 modulo deve usare la macro MODULE_IMPORT_NS per importare lo spazio
93 dei nomi che contiene i simboli desiderati. Per esempio un modulo che
94 usa il simbolo usb_stor_suspend deve importare lo spazio dei nomi
95 USB_STORAGE usando la seguente dichiarazione::
96
97 MODULE_IMPORT_NS("USB_STORAGE");
98
99 Questo creerà un'etichetta ``modinfo`` per ogni spazio dei nomi
100 importato. Un risvolto di questo fatto è che gli spazi dei
101 nomi importati da un modulo possono essere ispezionati tramite
102 modinfo::
103
104 $ modinfo drivers/usb/storage/ums-karma.ko
105 [...]
106 import_ns: USB_STORAGE
107 [...]
108
109
110 Si consiglia di posizionare la dichiarazione MODULE_IMPORT_NS() vicino
111 ai metadati del modulo come MODULE_AUTHOR() o MODULE_LICENSE().
112
113 Caricare moduli che usano simboli provenienti da spazi dei nomi
114 ===============================================================
115
116 Quando un modulo viene caricato (per esempio usando ``insmod``), il kernel
117 verificherà la disponibilità di ogni simbolo usato e se lo spazio dei nomi
118 che potrebbe contenerli è stato importato. Il comportamento di base del kernel
119 è di rifiutarsi di caricare quei moduli che non importano tutti gli spazi dei
120 nomi necessari. L'errore verrà annotato e il caricamento fallirà con l'errore
121 EINVAL. Per caricare i moduli che non soddisfano questo requisito esiste
122 un'opzione di configurazione: impostare
123 MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=y caricherà i moduli comunque ma
124 emetterà un avviso.
125
126 Creare automaticamente la dichiarazione MODULE_IMPORT_NS
127 ========================================================
128
129 La mancanza di un'importazione può essere individuata facilmente al momento
130 della compilazione. Infatti, modpost emetterà un avviso se il modulo usa
131 un simbolo da uno spazio dei nomi che non è stato importato.
132 La dichiarazione MODULE_IMPORT_NS() viene solitamente aggiunta in un posto
133 ben definito (assieme agli altri metadati del modulo). Per facilitare
134 la vita di chi scrive moduli (e i manutentori di sottosistemi), esistono uno
135 script e un target make per correggere le importazioni mancanti. Questo può
136 essere fatto con::
137
138 $ make nsdeps
139
140 Lo scenario tipico di chi scrive un modulo potrebbe essere::
141
142 - scrivere codice che dipende da un simbolo appartenente ad uno spazio
143 dei nomi non importato
144 - eseguire ``make``
145 - aver notato un avviso da modpost che parla di un'importazione
146 mancante
147 - eseguire ``make nsdeps`` per aggiungere import nel posto giusto
148
149 Per i manutentori di sottosistemi che vogliono aggiungere uno spazio dei nomi,
150 l'approccio è simile. Di nuovo, eseguendo ``make nsdeps`` aggiungerà le
151 importazioni mancanti nei moduli inclusi nel kernel::
152
153 - spostare o aggiungere simboli ad uno spazio dei nomi (per esempio
154 usando EXPORT_SYMBOL_NS())
155 - eseguire ``make`` (preferibilmente con allmodconfig per coprire tutti
156 i moduli del kernel)
157 - aver notato un avviso da modpost che parla di un'importazione
158 mancante
159 - eseguire ``make nsdeps`` per aggiungere import nel posto giusto
160
161 Potete anche eseguire nsdeps per moduli esterni. Solitamente si usa così::
162
163 $ make -C <path_to_kernel_src> M=$PWD nsdeps
164

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

Symbol namespace의 목적

1-26

이 문서는 이탈리아어 공통 면책 고지 `../disclaimer-ita.rst`를 포함하고 공식 원문 `Documentation/core-api/symbol-namespaces.rst`를 가리킵니다. `EXPORT_SYMBOL()` 계열 매크로로 커널 내부에 공개하는 항목을 symbol namespace로 구조화하는 방법을 설명합니다.

Symbol namespace는 커널 내부에 노출되는 API를 정리하기 위해 도입됐습니다. 하위 시스템 유지관리자는 export symbol을 여러 namespace로 분류해 책임 범위와 사용 목적을 드러낼 수 있습니다.

예를 들어 `SUBSYSTEM_DEBUG`처럼 디버그 전용 API를 별도 namespace로 묶으면 문서화가 쉬워지고, 다른 커널 영역에 특정 symbol 그룹이 무분별하게 노출되는 것도 제한할 수 있습니다.

namespace에서 export된 symbol을 쓰는 모듈은 먼저 해당 namespace를 import해야 합니다. import가 없으면 커널 설정에 따라 모듈 로드를 거부하거나 누락 경고를 냅니다.

Namespace 사용 계약
Subsystem exports symbolAssign namespace
Module references symbolDeclare namespace import
modpostCheck import at build time
Kernel loaderCheck import at module load

export 측이 symbol을 namespace에 넣고 consumer 모듈이 명시적으로 import합니다.

Namespace의 효과
효과설명
문서화symbol 그룹의 용도를 namespace 이름으로 표현
구조화하위 시스템 export를 논리적 그룹으로 분류
접근 계약consumer가 MODULE_IMPORT_NS()로 의존성을 선언
검증modpost와 모듈 로더가 누락 import를 탐지

API 조직화와 소비자 검증 측면의 목적입니다.

.. include:: ../disclaimer-ita.rst

:Original: Documentation/core-api/symbol-namespaces.rst

===========================
Spazio dei nomi dei simboli
===========================

Questo documento descrive come usare lo spazio dei nomi dei simboli
per strutturare quello che viene esportato internamente al kernel
grazie alle macro della famiglia EXPORT_SYMBOL().

Introduzione
============

Lo spazio dei nomi dei simboli è stato introdotto come mezzo per strutturare
l'API esposta internamente al kernel. Permette ai manutentori di un
sottosistema di organizzare i simboli esportati in diversi spazi di
nomi. Questo meccanismo è utile per la documentazione (pensate ad
esempio allo spazio dei nomi SUBSYSTEM_DEBUG) così come per limitare
la disponibilità di un gruppo di simboli in altre parti del kernel. Ad
oggi, i moduli che usano simboli esportati da uno spazio di nomi
devono prima importare detto spazio. Altrimenti il kernel, a seconda
della configurazione, potrebbe rifiutare di caricare il modulo o
avvisare l'utente di un'importazione mancante.

EXPORT_SYMBOL_NS()로 명시적 export

27-55

Symbol을 namespace로 export하는 방법은 여러 가지지만, 모두 `EXPORT_SYMBOL` 계열이 `ksymtab` 항목을 만드는 방식에 namespace 정보를 추가한다는 공통점이 있습니다.

일반 `EXPORT_SYMBOL()`과 GPL 전용 `EXPORT_SYMBOL_GPL()` 외에 namespace 변형인 `EXPORT_SYMBOL_NS()`와 `EXPORT_SYMBOL_NS_GPL()`이 있습니다. 이 변형은 symbol 뒤에 namespace 인수를 하나 더 받습니다.

매크로 확장 방식 때문에 namespace 인수는 전처리기가 처리할 수 있는 symbol이어야 합니다. 예제는 `usb_stor_suspend`를 `USB_STORAGE` namespace로 export합니다.

simbolo ``usb_stor_suspend`` nello spazio dei nomi ``USB_STORAGE`` usate::

	EXPORT_SYMBOL_NS(usb_stor_suspend, "USB_STORAGE");

그 결과 커널 symbol table의 `kernel_symbol` 구조체 항목에 `namespace` 필드가 설정됩니다. namespace 없이 export한 symbol은 이 필드가 `NULL`이며, 암묵적인 기본 namespace가 존재하는 것은 아닙니다.

`modpost`는 빌드할 때 namespace 정보를 검사하고, `kernel/module/main.c`의 코드는 모듈을 로드할 때 이를 사용합니다.

Export 매크로
매크로Namespace정책
EXPORT_SYMBOL()명시하지 않음일반 export
EXPORT_SYMBOL_GPL()명시하지 않음GPL 호환 모듈용
EXPORT_SYMBOL_NS()추가 인수로 지정일반 namespace export
EXPORT_SYMBOL_NS_GPL()추가 인수로 지정GPL namespace export

라이선스 제약과 namespace 지정 여부를 구분합니다.

명시적 namespace export
EXPORT_SYMBOL_NS(symbol, namespace)Macro expansion
ksymtab entrykernel_symbol.namespace = namespace
modpost / module loaderValidate consumer import

매크로 호출에서 ksymtab 항목의 namespace 필드까지 이어집니다.

Come definire uno spazio dei nomi dei simboli
=============================================

I simboli possono essere esportati in spazi dei nomi usando diversi
meccanismi.  Tutti questi meccanismi cambiano il modo in cui
EXPORT_SYMBOL e simili vengono guidati verso la creazione di voci in ksymtab.

Usare le macro EXPORT_SYMBOL
----------------------------

In aggiunta alle macro EXPORT_SYMBOL() e EXPORT_SYMBOL_GPL(), che permettono
di esportare simboli del kernel nella rispettiva tabella, ci sono
varianti che permettono di esportare simboli all'interno di uno spazio dei
nomi: EXPORT_SYMBOL_NS() ed EXPORT_SYMBOL_NS_GPL(). Queste macro richiedono un
argomento aggiuntivo: lo spazio dei nomi.
Tenete presente che per via dell'espansione delle macro questo argomento deve
essere un simbolo di preprocessore. Per esempio per esportare il
simbolo ``usb_stor_suspend`` nello spazio dei nomi ``USB_STORAGE`` usate::

	EXPORT_SYMBOL_NS(usb_stor_suspend, "USB_STORAGE");

Di conseguenza, nella tabella dei simboli del kernel ci sarà una voce
rappresentata dalla struttura ``kernel_symbol`` che avrà il campo
``namespace`` (spazio dei nomi) impostato. Un simbolo esportato senza uno spazio
dei nomi avrà questo campo impostato a ``NULL``. Non esiste uno spazio dei nomi
di base. Il programma ``modpost`` e il codice in kernel/module/main.c usano lo
spazio dei nomi, rispettivamente, durante la compilazione e durante il
caricamento di un modulo.

DEFAULT_SYMBOL_NAMESPACE 설정

56-85

하위 시스템의 모든 symbol마다 namespace를 반복해서 쓰면 번거롭고 유지하기 어렵습니다. `DEFAULT_SYMBOL_NAMESPACE` 전처리기 symbol은 명시적 namespace가 없는 `EXPORT_SYMBOL()`과 `EXPORT_SYMBOL_GPL()`에 기본값을 제공합니다.

설정 방법은 유지관리자 선호에 따라 다릅니다. 첫 방법은 하위 시스템 `Makefile`의 compiler flags에서 정의하는 것입니다. `usb-common`의 모든 일반 export를 `USB_COMMON`에 넣는 예는 다음과 같습니다.

possibilità è quella di definire il simbolo nel ``Makefile`` del sottosistema.
Per esempio per esportare tutti i simboli definiti in usb-common nello spazio
dei nomi USB_COMMON, si può aggiungere la seguente linea in
drivers/usb/common/Makefile::

	ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE='"USB_COMMON"'

이 compiler flag는 해당 범위의 `EXPORT_SYMBOL()`과 `EXPORT_SYMBOL_GPL()`을 바꿉니다. 반면 `EXPORT_SYMBOL_NS()`로 namespace를 명시한 symbol은 영향을 받지 않고 지정한 namespace로 export됩니다.

두 번째 방법은 컴파일할 소스 파일에서 전처리기 symbol을 직접 정의하는 것입니다. 기존 정의를 `#undef`한 뒤 `USB_COMMON`으로 다시 정의합니다.

Una seconda possibilità è quella di definire il simbolo di preprocessore
direttamente nei file da compilare. L'esempio precedente diventerebbe::

	#undef  DEFAULT_SYMBOL_NAMESPACE
	#define DEFAULT_SYMBOL_NAMESPACE "USB_COMMON"

Questo va messo prima di un qualsiasi uso di EXPORT_SYMBOL.

이 정의는 파일 안의 어떤 `EXPORT_SYMBOL` 사용보다 먼저 나와야 합니다. 그렇지 않으면 앞선 export에는 기본 namespace가 적용되지 않습니다.

기본 namespace 지정 방법
방법범위주의
ccflags-y -DDEFAULT_SYMBOL_NAMESPACE하위 시스템 빌드 범위문자열 인용 보존
#define DEFAULT_SYMBOL_NAMESPACE개별 컴파일 단위모든 EXPORT_SYMBOL보다 먼저 정의
EXPORT_SYMBOL_NS()개별 symbol기본값보다 명시적 namespace 우선

Makefile 범위와 개별 소스 파일 범위를 비교합니다.

Usare il simbolo di preprocessore DEFAULT_SYMBOL_NAMESPACE
----------------------------------------------------------

Definire lo spazio dei nomi per tutti i simboli di un sottosistema può essere
logorante e di difficile manutenzione. Perciò è stato fornito un simbolo
di preprocessore di base (DEFAULT_SYMBOL_NAMESPACE), che, se impostato,
diventa lo spazio dei simboli di base per tutti gli usi di EXPORT_SYMBOL()
ed EXPORT_SYMBOL_GPL() che non specificano esplicitamente uno spazio dei nomi.

Ci sono molti modi per specificare questo simbolo di preprocessore e il loro
uso dipende dalle preferenze del manutentore di un sottosistema. La prima
possibilità è quella di definire il simbolo nel ``Makefile`` del sottosistema.
Per esempio per esportare tutti i simboli definiti in usb-common nello spazio
dei nomi USB_COMMON, si può aggiungere la seguente linea in
drivers/usb/common/Makefile::

	ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE='"USB_COMMON"'

Questo cambierà tutte le macro EXPORT_SYMBOL() ed EXPORT_SYMBOL_GPL(). Invece,
un simbolo esportato con EXPORT_SYMBOL_NS() non verrà cambiato e il simbolo
verrà esportato nello spazio dei nomi indicato.

Una seconda possibilità è quella di definire il simbolo di preprocessore
direttamente nei file da compilare. L'esempio precedente diventerebbe::

	#undef  DEFAULT_SYMBOL_NAMESPACE
	#define DEFAULT_SYMBOL_NAMESPACE "USB_COMMON"

Questo va messo prima di un qualsiasi uso di EXPORT_SYMBOL.

MODULE_IMPORT_NS()로 symbol 사용

86-112

namespace에서 export된 symbol을 사용하려는 커널 모듈은 관련 namespace를 명시적으로 import해야 합니다. 그렇지 않으면 커널이 모듈 로드를 거부할 수 있습니다.

모듈 소스는 `MODULE_IMPORT_NS()` 매크로로 필요한 namespace를 선언합니다. `usb_stor_suspend`를 사용하는 모듈은 `USB_STORAGE`를 다음과 같이 import합니다.

Per usare i simboli esportati da uno spazio dei nomi, i moduli del
kernel devono esplicitamente importare il relativo spazio dei nomi; altrimenti
il kernel potrebbe rifiutarsi di caricare il modulo. Il codice del
modulo deve usare la macro MODULE_IMPORT_NS per importare lo spazio
dei nomi che contiene i simboli desiderati. Per esempio un modulo che
usa il simbolo usb_stor_suspend deve importare lo spazio dei nomi
USB_STORAGE usando la seguente dichiarazione::

	MODULE_IMPORT_NS("USB_STORAGE");

각 import 선언은 모듈에 `modinfo` 태그를 만듭니다. 따라서 빌드된 `.ko` 파일이 import하는 namespace를 `modinfo` 명령으로 확인할 수 있습니다.

Questo creerà un'etichetta ``modinfo`` per ogni spazio dei nomi
importato. Un risvolto di questo fatto è che gli spazi dei
nomi importati da un modulo possono essere ispezionati tramite
modinfo::

	$ modinfo drivers/usb/storage/ums-karma.ko
	[...]
	import_ns:      USB_STORAGE
	[...]

`MODULE_IMPORT_NS()` 선언은 `MODULE_AUTHOR()`나 `MODULE_LICENSE()` 같은 다른 모듈 메타데이터 가까이에 두는 것이 권장됩니다.

모듈 namespace import
MODULE_IMPORT_NS(USB_STORAGE)Emit import_ns modinfo tag
modinfo module.koInspect imported namespaces
Kernel module loaderMatch imports to used symbols

소스 선언이 modinfo 메타데이터와 로드 검증으로 이어집니다.

Import 관련 요소
요소역할
MODULE_IMPORT_NS()모듈의 namespace 의존성 선언
import_nsmodinfo에 저장되는 태그
MODULE_AUTHOR/MODULE_LICENSEimport 선언을 함께 두기 좋은 메타데이터 영역

선언, 검사, 배치 관례를 정리합니다.

Come usare i simboli esportati attraverso uno spazio dei nomi
=============================================================

Per usare i simboli esportati da uno spazio dei nomi, i moduli del
kernel devono esplicitamente importare il relativo spazio dei nomi; altrimenti
il kernel potrebbe rifiutarsi di caricare il modulo. Il codice del
modulo deve usare la macro MODULE_IMPORT_NS per importare lo spazio
dei nomi che contiene i simboli desiderati. Per esempio un modulo che
usa il simbolo usb_stor_suspend deve importare lo spazio dei nomi
USB_STORAGE usando la seguente dichiarazione::

	MODULE_IMPORT_NS("USB_STORAGE");

Questo creerà un'etichetta ``modinfo`` per ogni spazio dei nomi
importato. Un risvolto di questo fatto è che gli spazi dei
nomi importati da un modulo possono essere ispezionati tramite
modinfo::

	$ modinfo drivers/usb/storage/ums-karma.ko
	[...]
	import_ns:      USB_STORAGE
	[...]


Si consiglia di posizionare la dichiarazione MODULE_IMPORT_NS() vicino
ai metadati del modulo come MODULE_AUTHOR() o MODULE_LICENSE().

모듈 로드 시 누락 import 처리

113-125

`insmod` 등으로 모듈을 로드하면 커널은 사용한 각 symbol이 존재하는지와 그 symbol의 namespace를 import했는지 확인합니다.

기본 동작은 필요한 모든 namespace를 import하지 않은 모듈의 로드를 거부하는 것입니다. 오류를 로그에 남기고 모듈 로드는 `EINVAL`로 실패합니다.

`MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=y`로 설정하면 요구 사항을 충족하지 않은 모듈도 로드하지만 누락 경고를 냅니다. 이는 호환 완화 옵션이지 올바른 import 선언을 대체하는 권장 경로가 아닙니다.

모듈 로드 검증
Load moduleResolve each used symbol
Check symbol namespaceImported?
YesContinue loading
No + strict defaultLog error and fail EINVAL
No + allow-missing optionLoad with warning

사용 symbol과 import namespace를 비교해 로드 여부를 결정합니다.

누락 import 정책
설정결과
기본값모듈 로드 거부, EINVAL
MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=y경고 후 로드

커널 설정에 따른 결과입니다.

Caricare moduli che usano simboli provenienti da spazi dei nomi
===============================================================

Quando un modulo viene caricato (per esempio usando ``insmod``), il kernel
verificherà la disponibilità di ogni simbolo usato e se lo spazio dei nomi
che potrebbe contenerli è stato importato. Il comportamento di base del kernel
è di rifiutarsi di caricare quei moduli che non importano tutti gli spazi dei
nomi necessari. L'errore verrà annotato e il caricamento fallirà con l'errore
EINVAL. Per caricare i moduli che non soddisfano questo requisito esiste
un'opzione di configurazione: impostare
MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=y caricherà i moduli comunque ma
emetterà un avviso.

make nsdeps 자동 보정

126-163

누락 namespace import는 빌드 때 쉽게 찾을 수 있습니다. 모듈이 import하지 않은 namespace의 symbol을 사용하면 `modpost`가 경고를 냅니다.

`MODULE_IMPORT_NS()`는 보통 모듈 메타데이터가 모인 정해진 위치에 추가됩니다. 모듈 작성자와 하위 시스템 유지관리자를 돕기 위해 누락 선언을 고치는 script와 make target이 제공됩니다.

Creare automaticamente la dichiarazione MODULE_IMPORT_NS
========================================================

La mancanza di un'importazione può essere individuata facilmente al momento
della compilazione. Infatti, modpost emetterà un avviso se il modulo usa
un simbolo da uno spazio dei nomi che non è stato importato.
La dichiarazione MODULE_IMPORT_NS() viene solitamente aggiunta in un posto
ben definito (assieme agli altri metadati del modulo). Per facilitare
la vita di chi scrive moduli (e i manutentori di sottosistemi), esistono uno
script e un target make per correggere le importazioni mancanti. Questo può
essere fatto con::

	$ make nsdeps

일반적인 모듈 개발 흐름은 namespace import 없이 symbol을 사용하는 코드를 작성하고 `make`를 실행한 뒤, `modpost`의 누락 import 경고를 확인하고 `make nsdeps`로 적절한 위치에 선언을 추가하는 것입니다.

하위 시스템 유지관리자가 새 namespace를 도입할 때도 흐름은 같습니다. `EXPORT_SYMBOL_NS()` 등으로 symbol을 새 namespace로 이동하거나 추가하고, 가능하면 `allmodconfig`로 모든 커널 모듈을 포함해 빌드한 뒤 `modpost` 경고를 확인하고 `make nsdeps`를 실행합니다.

외부 모듈에도 `nsdeps`를 실행할 수 있습니다. 커널 소스 경로를 `-C`로, 현재 외부 모듈 디렉터리를 `M=$PWD`로 지정합니다.

Potete anche eseguire nsdeps per moduli esterni. Solitamente si usa così::

       $ make -C <path_to_kernel_src> M=$PWD nsdeps
모듈 작성자의 nsdeps 흐름
Use namespaced symbolRun make
modpost warns missing importRun make nsdeps
MODULE_IMPORT_NS addedRebuild and verify

빌드 경고를 자동 import 선언으로 고칩니다.

하위 시스템 namespace 전환
Move exports into namespaceBuild with allmodconfig
Collect modpost warningsRun make nsdeps
Review generated importsRebuild

넓은 빌드 구성으로 영향받는 모듈을 찾아 일괄 보정합니다.

nsdeps 명령
대상명령
커널 트리 모듈make nsdeps
외부 모듈make -C <path_to_kernel_src> M=$PWD nsdeps

in-tree와 외부 모듈 사용 형식입니다.

Creare automaticamente la dichiarazione MODULE_IMPORT_NS
========================================================

La mancanza di un'importazione può essere individuata facilmente al momento
della compilazione. Infatti, modpost emetterà un avviso se il modulo usa
un simbolo da uno spazio dei nomi che non è stato importato.
La dichiarazione MODULE_IMPORT_NS() viene solitamente aggiunta in un posto
ben definito (assieme agli altri metadati del modulo). Per facilitare
la vita di chi scrive moduli (e i manutentori di sottosistemi), esistono uno
script e un target make per correggere le importazioni mancanti. Questo può
essere fatto con::

	$ make nsdeps

Lo scenario tipico di chi scrive un modulo potrebbe essere::

	- scrivere codice che dipende da un simbolo appartenente ad uno spazio
	  dei nomi non importato
	- eseguire ``make``
	- aver notato un avviso da modpost che parla di un'importazione
	  mancante
	- eseguire ``make nsdeps`` per aggiungere import nel posto giusto

Per i manutentori di sottosistemi che vogliono aggiungere uno spazio dei nomi,
l'approccio è simile. Di nuovo, eseguendo ``make nsdeps`` aggiungerà le
importazioni mancanti nei moduli inclusi nel kernel::

	- spostare o aggiungere simboli ad uno spazio dei nomi (per esempio
	  usando EXPORT_SYMBOL_NS())
	- eseguire ``make`` (preferibilmente con allmodconfig per coprire tutti
	  i moduli del kernel)
	- aver notato un avviso da modpost che parla di un'importazione
	  mancante
	- eseguire ``make nsdeps`` per aggiungere import nel posto giusto

Potete anche eseguire nsdeps per moduli esterni. Solitamente si usa così::

       $ make -C <path_to_kernel_src> M=$PWD nsdeps