Что такое символ экспорта GPL в коде ядра Linux?
Что такое EXPORT_SYMBOL_GPL в коде ядра Linux?
Ниже приведен фрагмент кода, который содержит EXPORT_SYMBOL_GPL
62 struct resource *platform_get_resource(struct platform_device *dev,
63 unsigned int type, unsigned int num)
64 {
65 int i;
66
67 for (i = 0; i < dev->num_resources; i++) {
68 struct resource *r = &dev->resource[i];
69
70 if (type == resource_type(r) && num-- == 0)
71 return r;
72 }
73 return NULL;
74 }
75 EXPORT_SYMBOL_GPL(platform_get_resource);
Этот макрос появляется много раз в коде ядра...
1 ответ:
Это макрос для определения некоторого символа (например, функции) как экспортируемого (видно из загружаемых модулей ядра). Если символ не имеет "EXPORT_SYMBOL", он будет недоступен из модулей.
EXPORT_SYMBOL_GPL
будет показывать символ только в GPL-лицензионных модулях, аEXPORT_SYMBOL
- в модулях с любой лицензией.Http://lwn.net/Articles/154602/ - О значении EXPORT_SYMBOL_GPL (2005, corbet)
Когда загружаемый модуль вставляется, любые ссылки, которые он делает на функции ядра и структуры данных должны быть связаны с текущим работающим ядром. Однако загрузчик модулей не предоставляет доступ ко всем символам ядра; доступны только те, которые были явно экспортированы.
Экспорт бывает двух видов: ванильный (EXPORT_SYMBOL) и GPL-only (EXPORT_SYMBOL_GPL). Первые доступны любому модулю ядра, а вторые не могут использоваться никакими модулями, не имеющими лицензии, совместимой с GPL.