- Почему в ядре линукс отсутствует config.h?
- unixforum.org
- Шо за файл config.h? (И почему его нет в openSUSE10.3?)
- Шо за файл config.h?
- Re: Шо за файл config.h?
- Re: Шо за файл config.h?
- Русские Блоги
- Глава 1 Разработка модуля ядра драйвера
- 1.1 Основы механизма модуля ядра
- 1.1.1 Концепция модулей ядра
- 1.1.2 Структура модуля ядра Linux
- 1.1.3 Скомпилировать и загрузить модуль ядра Linux
- 1.2 Начало работы с компиляцией модуля ядра Makefile
- 1.2.1 Компиляция модулей
- 1.2.2 Анализ конкретного процесса компиляции
- 1.2.3 Простое описание внутренней компиляции
- 1.3 Передача параметров модуля
- 1.3.1 определение module_param ()
- 1.3.2 Как использовать module_param ()
- 1.3.3 Пример использования
- 1.4 Экспорт таблицы символов
- 1.4.1 Определение макроса EXPORT_SYMBOL анализ
- 1.4.2 Как использовать EXPORT_SYMBOL
- 1.4.3 Примеры
- Подсказки:
- Интеллектуальная рекомендация
- Используйте Maven для создания собственного архетипа скелета проекта (4)
- Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
- Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
- Учебный дневник — перелистывание страниц
- Нулевое основание для отдыха-клиента
- Вам также может понравиться
- Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
- Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
- Шаблон алгоритма конной повозки
- 35 Line Code, чтобы получить метод исследования событий (ON)
- Образ докера: gitlab
Почему в ядре линукс отсутствует config.h?
Тот config.h, которые кушает команда make вместе с Makefile
«Почему он должен быть?» — возможно, спросите вы. Отвечаю: так я пришел к выводу из диаграммы к этой статье: https://en.wikipedia.org/wiki/Configure_script
А еще мне кажется, что этот момент можно отнести не только к ядру линукс, но и к куче других программ — это, в прицнипе, не особо важный момент. Просто в нем я впервые заметил отсутствие config.h
Потому что не каждый обязан использовать упоротую автотулзятину.
Это специфично для autotools. В ядре по другому организовано. Ядро с autotools было бы ужасным.
Так собирается ядро ведь командой make . Я что-то не понимаю. это какой-то другой make?
Это тот же самый. Но до команды надо make-файлы как-то сгенерировать. И тут уже есть разные способы. Autotools со скриптом configure только один из способов, пока ещё наиболее распространённый.
Потому что не нужен?
Autotools со скриптом configure только один из способов, пока ещё наиболее распространённый
Некоторые дегенераты ещё придумали cmake.
Ясно, я думал что эти все команды являются чем-то вроде монолита и make «привязан» к Makefile и config.h, и без них не будет работать.
А каким способом генерируется Makefile для ядра линукс, например? Просто интересно что ещё есть.
Make с автотулзятиной никак не связан. Мэйкфайлы можно генерить другим софтом или писать самому. Или make не использовать тоже, есть другие системы сборки.
Оу, круто. Это просто, когда знаешь где искать, а я даже не подозревал о существоании такой документации)
Там своя утилита kbuild есть, из конфига читает опции и формирует Makefile.
Хорошо, спасибо большое.
а я даже не подозревал о существоании такой документации
Ты ещё больше удивишься, узнав, что документация идёт в комплекте с исходным кодом?
Ты так говоришь, как будто я дурачок какой-то — не смотрел исходники. Хотя в гентушных я не увидел такой документации.
Ну а по теме: да я удивлен, и не очень понимаю зачем документацию пихать в исходники, мне это кажется нелогичным, архаичным.
Можно нубский вопрос?
Правильно я понимаю, что при сборке ядра буковка «M» рядом с некоторыми опциями говорит о том, что этот модуль будет собран; но в то же время, если я уберу эту буковку, я также могу в любой момент отдельно скомпилировать и подключить этот модуль? Просто я думаю, может эта возможность не просто так дана, и если я отключу её, то не смогу потом подключить отдельно собранный модуль.
Хотя в гентушных я не увидел такой документации.
Эту документацию не затрагивает даже USE=»-doc» и FEATURE=»nodoc» , так что ты или не смотрел, или что-то скрываешь.
Ну а по теме: да я удивлен, и не очень понимаю зачем документацию пихать в исходники, мне это кажется нелогичным, архаичным.
Это для того, чтобы держать документацию и код up-to-date. Плюс, данная документация удобна для всех, в том числе для пользователей.
Правильно я понимаю, что при сборке ядра буковка «M» рядом с некоторыми опциями говорит о том, что этот модуль будет собран; но в то же время, если я уберу эту буковку, я также могу в любой момент отдельно скомпилировать и подключить этот модуль? Просто я думаю, может эта возможность не просто так дана, и если я отключу её, то не смогу потом подключить отдельно собранный модуль.
От многого зависит. Видишь ли, опции в конфиге ядра зачастую включают не только саму возможность, но и возможности, от которой оно зависит (dependency graph). Потому скорее да, некоторые модули ты не сможешь подключить отдельно. Но в то же время, не вкомпиленный в блоб модуль ты сможешь выгрузить и загрузить на его место новый, если он совместим с текущим ядром.
make ничего не кушает, кроме Makefile, который ему подсунули
Это частный случай, когда при сборке используется config.h
Более того, в случае autotools config.h тоже необязательно применять
Источник
unixforum.org
Форум для пользователей UNIX-подобных систем
- Темы без ответов
- Активные темы
- Поиск
- Статус форума
Шо за файл config.h? (И почему его нет в openSUSE10.3?)
Шо за файл config.h?
Сообщение Galicarnax » 21.04.2008 16:15
Появилась необходимость поставить кое-какую железяку в компутер, к ней прилагаются дрова для линукса, библиотреки и т.п. Точно знаю, что на SuSE9.3 железяка работает. Но при компиляции в 10.3 компайлер ругается, что отсутствует файл «linux/config.h» (то бишь /usr/include/linux/config.h, если по-полному). Обшарил хард — нет такого файла (точнее есть несколько, но они относятся к конкретным девайсам и находятся в непонятных закоулках — т.е. это не тот нужный глобльный header-файл). Доустанавливал с дистрибутива все что можно — Kernel Development, C/C++-development и т.п., но файл не появился.
Железяка разработана под линукс без упоминания конкретного дистрибутива, т.к. для ее работы используются стандартные файлы, которые есть (должны быть. ) в любом линукс-дистре. Куда же делся config.h в сюзе 10.3?
Вдогонку: очень жаль, что в ясте нельзя делать поиск в Software Management по списку файлов, а не только по «Name», «Description», «RPM Provides» и т.п.
Re: Шо за файл config.h?
Сообщение Loky » 21.04.2008 16:27
Появилась необходимость поставить кое-какую железяку в компутер, к ней прилагаются дрова для линукса, библиотреки и т.п. Точно знаю, что на SuSE9.3 железяка работает. Но при компиляции в 10.3 компайлер ругается, что отсутствует файл «linux/config.h» (то бишь /usr/include/linux/config.h, если по-полному). Обшарил хард — нет такого файла (точнее есть несколько, но они относятся к конкретным девайсам и находятся в непонятных закоулках — т.е. это не тот нужный глобльный header-файл). Доустанавливал с дистрибутива все что можно — Kernel Development, C/C++-development и т.п., но файл не появился.
Железяка разработана под линукс без упоминания конкретного дистрибутива, т.к. для ее работы используются стандартные файлы, которые есть (должны быть. ) в любом линукс-дистре. Куда же делся config.h в сюзе 10.3?
Вдогонку: очень жаль, что в ясте нельзя делать поиск в Software Management по списку файлов, а не только по «Name», «Description», «RPM Provides» и т.п.
Re: Шо за файл config.h?
Сообщение Galicarnax » 21.04.2008 18:08
Железяка узко-специализированная. Называется Grape6-BLX64. Это PCI-плата с процессорами на борту, которые по определенному вшитому алгоритму просчитывают задачу N тел (для астрономов). Делают японцы.
Все, что написано насчет требований/спецификаций в очень скудном мануале:
• Speed: 131.3G flops (4 Grape6 VLSI Chips 6Pipeline per chip).
• Memory size: 262,144 particle. (18Mbit Burst-SRAM 8)
• OS (prepared by users) : Linux Kernel 2.6.9
*If you succeed in using other version , please inform us. Such information will help other users.
• Attached Application software:
C and Fortran language sample program, interface library. (CD-ROM)
• Host computer: Intel Pentium4 and 865G chip set is suitable.
• Dimension : 33mm(w) x 313mm(d) x108mm (h) 2 PCI slot space occupied
• Interface : Standard 64bit/133MHz PCI-X
Note: You should set BIOS to make PCI-X bus works with 133MHz.
• Power consumption: DC12V 5A
• Cooling fan : 1.8m3/min 65cfm (Please consult with the computer manufacturer.)
Источник
Русские Блоги
Глава 1 Разработка модуля ядра драйвера
1.1 Основы механизма модуля ядра
1.1.1 Концепция модулей ядра
1. Концепция модуля
Модули ядра — это коды, которые могут быть загружены и выполнены ядром операционной системы при необходимости и могут быть выгружены, когда они не нужны. Это хорошая функция, которая расширяет функции ядра операционной системы без перезапуска системы.Это технология динамической загрузки.
Возможности: динамическая загрузка, загрузка в любое время, выгрузка в любое время, расширенные функции
2. Функция загрузки модуля ядра
Модуль ядра просто предварительно регистрирует себя в ядре Linux, чтобы его можно было использовать в будущих запросах; он состоит из объектных кодов и не образует законченную исполняемую программу. Он просто сообщает ядру, что у него есть новые функции, и оно не использует (выполняет) немедленно, просто подождите, пока приложение вызовет; и приложение начинает выполняться после его загрузки.
3. Функции, используемые модулем ядра
Нет внешней библиотеки функций для написания кода модуля ядра, могут использоваться только функции, экспортированные ядром. Прикладная программа привыкла использовать внешние библиотечные функции, связывая вместе программу и библиотечные функции во время компиляции. Например, сравните printf () и printk ().
Таким образом, файлы заголовков, используемые драйвером, берутся из исходного кода ядра, а файлы заголовков, используемые приложением, берутся из функций библиотеки.
4. Свободное место для кода модуля ядра.
Код ядра выполняется в пространстве ядра, а прикладная программа — в пространстве пользователя. Запуск приложения формирует новый процесс, но модуль ядра, как правило, этого не делает. Каждый раз, когда приложение выполняет системный вызов, режим выполнения Linux переключается с пользовательского пространства на пространство ядра.
1.1.2 Структура модуля ядра Linux
Минимум две точки входа
* Функция загрузки модуля module_init ()
* Функция удаления модуля module_exit ()
Два макроопределения module_init () и module_exit () объявляют функцию загрузки и функцию выгрузки модуля, которые определены в linux3.14 / include / linux / init.h. Содержание:
Каждый модуль может иметь только один module_init и один module_exit.
Давайте сравним приложение и увидим разницу между приложением и модулем ядра:
Таблица 1
Сравнение приложения и модуля ядра резюмируется следующим образом.
Таблица 2
1.1.3 Скомпилировать и загрузить модуль ядра Linux
Собственно, компиляция ядра уже упоминалась, теперь давайте рассмотрим:
Makefile ядра linux3.14 разделен на 5 компонентов:
Makefile на верхнем уровне Makefile
.config Текущий файл конфигурации ядра, который становится частью Makefile фиксированного уровня при компиляции.
arch / $ (ARCH) / Makefile Makefile, связанный с архитектурой
s / Makefile. * Некоторые общие правила Makefile
На всех уровнях Makefile kbuild содержится около 500 файлов, которые компилируются в соответствии с макросами, переданными из верхнего Makefile.
Определение и другие правила компиляции, компиляция исходного кода в модули или в ядро
Makefile верхнего уровня считывает содержимое файла .config и отвечает за сборку ядра и модулей в целом. Arch Makefile предоставляет дополнительную информацию, связанную с архитектурой. Makefile в каталоге s содержит все определения и правила, необходимые для сборки ядра на основе Makefile kbuild. (Содержимое .config является результатом конфигурации через файл Kconfig при создании menuconfig, как упоминалось выше)
Для разработчиков и пользователей большинства модулей ядра или драйверов устройств наиболее частым контактом является сборочный файл kbuild, основанный на архитектуре kbuild на каждом уровне каталога. Основные части:
1. Определение цели
Целевое определение используется для определения того, что нужно скомпилировать как модуль, а что — скомпилировать и связать с ядром.
Самым простым является всего одна строка, например
Это означает скомпилировать foo.o из файла foo.c или foo.s и связать его с ядром, в то время как obj-m означает, что файл скомпилирован как модуль. За исключением y и m, все цели в форме obj-x не будут компилироваться.
Поскольку он может быть скомпилирован в модуль или в ядро, более часто метод компиляции файла определяется в соответствии с переменной CONFIG_ файла .config, например:
В дополнение к целям в форме obj-, есть также цели, такие как библиотека lib-y, хост-программа hostprogs-y, но они в основном используются в определенных каталогах и случаях.
2. Несколько целей
Модуль ядра компилируется из нескольких исходных файлов, что отличается от Makefile.
Используйте форму имени модуля плюс суффикс -objs или суффикс -y, чтобы определить файлы компонентов модуля.
как в следующем примере:
Имя модуля — ext2. Два объектных файла Balloc.o и bitmap.o, наконец, связаны для создания ext2.o до файла ext2.ko. Включать ли xattr.o зависит от конфигурации файла конфигурации ядра. Не имеет значения, если значение CONFIG_EXT2_FS равно y, файл ext2.o, созданный во время этого процесса, будет связан со встроенным.o и, наконец, связан с ядром. Здесь следует отметить, что каталог, в котором находится Makefile kbuild, больше не должен содержать исходные файлы с тем же именем, что и модуль, например ext2.c / ext2.s
или записывается как -objs:
3. Итерация каталога
Если значение CONFIG_EXT2_FS равно y или m, kbuild отобразит каталог ext2 в нисходящей итерации, но его роль ограничена этим. Должны ли файлы в каталоге ext2 быть скомпилированы как модули или связаны с ядром, или Определяется содержимым Makefile в каталоге ext2
4. Различные методы компиляции модулей.
При компиляции модуля вы можете поместить его в дерево кода и использовать Make modules для компиляции модуля. Вы также можете поместить каталог файлов, связанных с модулем, за пределы дерева кода. Location, используйте следующую команду для компиляции модуля:
-C указывает корневой каталог исходного кода ядра, $ PWD или PWD Это переменная среды текущего каталога, указывающая kbuild вернуться в текущий каталог для выполнения операции сборки.
5. Установка модуля
Если вам нужно установить модуль в место, отличное от места по умолчанию, вы можете использовать INSTALL_MOD_PATH, чтобы указать префикс, например:
Модуль будет установлен в каталог / foo / lib / modules.
Примечание. Модуль ядра имеет суффикс .ko, который отличает модуль ядра от обычных объектных файлов.
1.2 Начало работы с компиляцией модуля ядра Makefile
1.2.1 Компиляция модулей
В предыдущей компиляции ядра, часть переноса драйвера, о которой мы говорили о компиляции драйвера, делится на статическую компиляцию и динамическую компиляцию; статическая компиляция означает, что драйвер непосредственно компилируется в ядро, а динамическая компиляция означает, что драйвер компилируется в модуль.
Существует два типа динамической компиляции:
a — внутренняя компиляция
скомпилировать в исходном каталоге ядра
b — внешняя компиляция
Компилировать вне каталога исходного кода ядра
1.2.2 Анализ конкретного процесса компиляции
Примечание: эта компиляция является внешней компиляцией. Используемый исходный код ядра — это исходный код Ubuntu, а не исходный код ядра Linux 3.14, используемый платой разработки. Работающая платформа — X86.
Для обычного модуля драйвера устройства Linux следующий код представляет собой классический код make-файла. Используйте следующий make-файл для компиляции большинства драйверов. Вам нужно только изменить драйвер, который будет скомпилирован во время использования. Имя хорошее. Просто измените значение obj-m.
1. Переменные в make-файле
Сначала объясните значение некоторых переменных в следующем make-файле:
(1) KERNELRELEASE определен в make-файле верхнего уровня в исходном коде ядра Linux.
(2) shell pwd для получения текущего рабочего пути
(3) shell uname -r получает номер версии текущего ядра.
(4) Каталог текущего исходного кода ядра KDIR.
Есть два каталога с исходным кодом Linux, а именно
Но если вы скомпилировали ядро, вы будете знать, что исходный код в каталоге usr обычно загружается и распаковывается нами самими, в то время как исходный код в каталоге lib автоматически копируется во время компиляции.Файловая структура этих двух файлов абсолютно одинакова, поэтому иногда Установите исходный каталог ядра в / usr / src / linux-header- $ (оболочка uname -r) /. Каталог исходного кода ядра может быть изменен в соответствии с его собственным местом хранения.
(5)make -C $ (LINUX_KERNEL_PATH) M= $ (CURRENT_PATH) modules
Это скомпилированный модуль:
a — Сначала измените каталог на местоположение, указанное параметром -C (т. е. каталог исходного кода ядра), где хранится make-файл верхнего уровня ядра;
b — параметр M = заставляет make-файл возвращаться в каталог исходного кода модуля перед созданием целевого объекта модулей; затем цель modueles указывает на модуль, установленный в переменной obj-m; в приведенном выше примере , Мы устанавливаем переменную hello.o.
2. Этапы выполнения make
a — Когда вы впервые входите, макрос «KERNELRELEASE» не определен, поэтому введите else;
b — записать путь к ядру, записать текущий путь;
Поскольку после make нет цели, make выполнит первую цель в Makefile, которая не начинается с., в качестве цели по умолчанию. По умолчанию выполняется правило all.
c – make -C $ (KDIR) M= $ (PWD) modules
-C Войдите в каталог ядра и выполните Makefile. KERNELRELEASE будет назначен во время выполнения. M = $ (PWD) означает возврат в текущий каталог, повторное выполнение make-файла, и модули компилируются в модули Смысл
Итак, на самом деле здесь выполняется
d-Запустить make-файл снова, KERNELRELEASE имеет значение, и будет выполнен obj-m: = hello.o
obj-m: означает связывание hello.o и других объектных файлов с файлом модуля hello.ko и компиляцию hello.c в файл hello.o при компиляции.
Здесь видно, что make вызывается всего 3 раза
1)– make
2) — Генерируется вызов верхнего уровня makedile дерева исходных текстов ядра Linux. o файл
3) вызов make-файла дерева исходных текстов ядра Linux, ссылка на файл .o в файл ko
3. Скомпилируйте несколько файлов.
Если имеется несколько исходных файлов, используйте следующий метод:
1.2.3 Простое описание внутренней компиляции
Если вы переместите модуль hello в исходный код ядра. Например, если вы поместите его в / usr / src / linux / driver /, будет определено KERNELRELEASE.
в / usr / src / linux / Makefile
В настоящее время модуль hello больше не компилируется только с помощью make, а компилируется с помощью модулей make в ядре. В это время модуль драйвера компилируется с ядром.
1.3 Передача параметров модуля
1.3.1 определение module_param ()
Обычно при программировании в пользовательском режиме, то есть в приложении, вы можете передавать параметры командной строки через main (), а когда вы пишете модуль ядра, вы передаете параметры через module_param ().
Макрос module_param () недавно добавлен в ядро Linux 2.6. Этот макрос определен в файле include / linux / moduleparam.h и определяется следующим образом:
Итак, мы определяем параметр модуля через макрос module_param ():
Значение параметров:
name — это не только имя параметра, которое видит пользователь, но и переменная, которая принимает параметр в модуле;
type указывает тип данных параметра, который может быть одним из следующих: byte, short, ushort, int, uint, long, ulong, charp, bool, invbool;
perm определяет права доступа к соответствующим файлам в sysfs. Права доступа управляются так же, как разрешения доступа к файлам Linux, например 0644, или используются макросы в stat.h, такие как S_IRUGO.
0 означает полностью закрыть соответствующий элемент в sysfs.
1.3.2 Как использовать module_param ()
Макрос module_param () не объявляет переменные, поэтому вы должны объявить переменные перед использованием макроса. Типичное использование выглядит следующим образом:
Они должны быть записаны в начале исходного файла модуля. То есть int_var является глобальным. Также возможно сделать имя переменной внутри исходного файла модуля и имя внешнего параметра разными именами, которые определяются с помощью module_param_ named ().
a – module_param_named()
module_param_named(name, variable, type, perm);
имя внешнее (пространство пользователя) имя видимого параметра;
переменная Имя глобальной переменной в исходном файле;
тип
разрешения на доступ
И параметр module_param реализуется параметром module_param_ named, за исключением того, что имя совпадает с именем переменной.
Например:
b-строковый параметр
Если параметр модуля является строкой, для определения параметра модуля обычно используется тип charp. Ядро копирует строку, предоставленную пользователем, в память, и соответствующая переменная указывает на эту строку.
Например:
Другой метод — использовать макрос module_param_string (), чтобы позволить ядру скопировать строку непосредственно в массив символов в программе.
Здесь name — это имя внешнего параметра, string — это имя внутренней переменной, len — это размер буфера, названного строкой (он может быть меньше размера буфера, но не имеет значения), а perm означает права доступа к sysfs (или perm равен нулю, что означает полный Закройте соответствующий элемент sysfs).
Например:
параметр c-массива
параметры массива, значения, указанные в списке, разделенном запятыми, также поддерживаются загрузчиком модуля. Чтобы объявить параметр массива, используйте:
Имя массива имен (также имя параметра),
type Тип элемента массива,
num целочисленная переменная,
Обычное значение разрешения perm.
Если параметр массива установлен при загрузке, num устанавливается равным количеству предоставленных чисел.Загрузчик модуля отказывается иметь больше значений, чем может вместить массив.
1.3.3 Пример использования
Скомпилируйте и сгенерируйте исполняемый файл hello
Примечание:
a-Если при загрузке модуля hello параметры не вводятся, то начальное значение who — «world», а начальное значение times — 1;
b — При одновременной передаче строки в указатель нельзя передать такую строку who = «hello world!», то есть в строке не должно быть пробелов;
c — / sys / module / hello / parameters Узел файла, соответствующий переменной, созданной в этом каталоге.
1.4 Экспорт таблицы символов
Заголовочный файл ядра Linux предоставляет удобный способ управлять видимостью символов за пределами модуля, тем самым уменьшая загрязнение пространства имен (имя пространства имен может конфликтовать с именами, определенными в другом месте ядра), и правильное скрытие информации . Если вашему модулю необходимо выводить символы для других модулей, вы должны использовать следующее определение макроса:
Оба этих макроса используются для экспорта данного символа за пределы модуля.Определение макроса версии _GPL может сделать символ доступным только для модуля с лицензией GPL. Символы должны экспортироваться в глобальную часть файла модуля, а не в функцию. Это связано с тем, что два вышеуказанных макроса будут расширены в специальное объявление, а переменная должна быть глобальной. Эта переменная хранится в специальной исполняемой части модуля («ELF-раздел»). При загрузке ядро использует этот раздел для поиска переменных, экспортируемых модулем (заинтересованные читатели могут видеть
1.4.1 Определение макроса EXPORT_SYMBOL анализ
1. Исходный код
Перед анализом сначала усвойте следующие связанные знания:
1) # оператор, ## оператор
Обычно используют # для создания строки в определении макроса. #abc означает строку «abc» и так далее.
## Оператор называется связующим звеном препроцессора и используется для замены и склейки двух разных символов,
, например: #define xName (n) x ## n
, тогда xName (4) становится x4
2) gcc_ attribute_ Атрибуты:
_ attribute_Функция ((section («section_name»))) заключается в том, чтобы поместить указанную функцию или переменную в раздел с именем «section_name».
_ attribute_Добавление атрибутов может быть непосредственно добавлено к оператору определения, когда функция или переменная определены.
, например:
int myvar__ attribute__((section(“mydata”))) = 0;
означает, что целочисленная переменная myvar = 0 определена, а переменная хранится в разделе с именем «mydata»
Подробное описание gcc_attribute см. по адресу:
http://blog.sina.com.cn/s/blog_661314940100qujt.html
2. Какова роль EXPORT_SYMBOL?
Функция или символ, определенные в теге EXPORT_SYMBOL, открыты для всего кода ядра и могут быть напрямую вызваны в вашем модуле ядра без изменения кода ядра, то есть использование EXPORT_SYMBOL может сделать функцию символически Экспорт в другие модули для использования.
Вот сравнение с System.map: System.map содержит адрес функции при подключении. После того, как соединение установлено, в процессе работы ядра 2.6 неизвестно, какой символ находится по какому адресу.
Символ EXPORT_SYMBOL сохраняет эти символы и соответствующие адреса, и соответствующие адреса этих символов могут быть найдены во время работы ядра. В процессе загрузки модуля его суть заключается в динамическом подключении к ядру.Если в модуле есть ссылки на символы ядра или других модулей, эти символы должны быть EXPORT_SYMBOL, чтобы можно было найти соответствующее адресное соединение.
1.4.2 Как использовать EXPORT_SYMBOL
Сначала используйте EXPORT_SYMBOL (имя функции) после определения функции модуля.
Во-вторых, используйте extern, чтобы объявить его в модуле, который вызывает функцию
В-третьих, сначала загрузите модуль, определяющий функцию, а затем загрузите модуль, который вызывает функцию.
Для вызова интерфейсов функций и глобальных переменных, реализованных другими модулями, необходимо экспортировать символ /usr/src/linux-headers-2.6.32-33-generic/Module.symvers
Функция A сначала экспортирует функцию show (), а функция B использует extern для ее объявления. Примечание.
a — После компиляции модуля a скопируйте Module.symvers в модуль b.
b — только после этого можно скомпилировать модуль b.
c — Загрузить: сначала загрузить модуль a, затем модуль b
d — Удаление: сначала удалите модуль b, затем удалите модуль a
1.4.3 Примеры
После компиляции загрузите и выгрузите модули, и вы можете использовать dmesg для просмотра информации о печати ядра.
Подсказки:
Описание файла заголовка драйвера
В каталоге файлов заголовков всего 32 файла заголовков .h. Среди них 13 в основном каталоге, 4 в подкаталоге asm, 10 в подкаталоге linux и 5 в подкаталоге sys. Функции этих файлов заголовков заключаются в следующем:
1. Главный каталог
2. Подкаталог include / asm файлов заголовков, относящихся к архитектуре.
Эти файлы заголовков в основном определяют некоторые структуры данных, макрофункции и переменные, тесно связанные с архитектурой ЦП. Всего 4 файла.
3. Подкаталог специального заголовочного файла ядра Linux include / linux
4. Подкаталог с системной структурой данных include / sys
Интеллектуальная рекомендация
Используйте Maven для создания собственного архетипа скелета проекта (4)
Один, базовое введение в Maven Во-вторых, скачайте и настройте Maven Три, настроить домашнее зеркало на Али В-четвертых, создайте содержимое скелета архетипа В-пятых, создайте проект через архетип 6. .
Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
Автор | Сюй Линь Ответственный редактор | Ху Вэйвэй Предисловие Недавно Цай Сюкунь отправил письмо юриста на станцию B. Содержание письма юриста показало, что «на станции B имеется большое кол.
Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
Название Описание Во взвешенном ориентированном графе G для исходной точки v задача о кратчайшем пути от v до оставшихся вершин в G называется задачей кратчайшего пути с одной исходной точкой. Среди ш.
Учебный дневник — перелистывание страниц
Используйте плагин Layui.
Нулевое основание для отдыха-клиента
Предисловие: статья, обобщенная, когда я только что связался с тестом API, в дополнение к остальному клиенту этот инструмент сам, некоторые из мелких пониманий API, я надеюсь помочь тому же белую белу.
Вам также может понравиться
Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
Шаг 1. Откройте для себя инъекцию Со мной все было нормально, когда я был свободен, я случайно нажал на чужой блог и обнаружил, что ссылка заканчивается на id, поэтому я проверил его вручную. Результа.
Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
В предыдущем разделе мы ввели основное использование AXIOS, по сравнению с нативным Ajax, который при условии, что способ является более простым и, а сетевые данные теперь в состоянии получить его ров.
Шаблон алгоритма конной повозки
Блог гангстеров Тележки, запряженные лошадьми, используются для решения проблемы самой длинной подстроки палиндрома. Основное внимание уделяется подстрокам, а не подпоследовательностям. Если вы хотите.
35 Line Code, чтобы получить метод исследования событий (ON)
Об авторе: Чжу Сяою,Личный публичный номер: языковой класс большой кошки Эта проблема научит вас этой большой классе Cat.Как написать наиболее эффективное метод исследования событий с 35 Line R Code C.
Образ докера: gitlab
GitLab Docker images Both GitLab CE and EE are in Docker Hub: GitLab CE Docker image GitLab EE Docker image The GitLab Docker images are monolithic images of GitLab running all the necessary services .
Источник