Как скомпилировать модуль ядра linux

Содержание
  1. Kernel (Русский)/Traditional compilation (Русский)
  2. Contents
  3. Подготовка
  4. Установка пакетов
  5. Создание каталога сборки
  6. Загрузка исходников
  7. Распаковка исходников
  8. Настройка
  9. Конфигурация ядра
  10. A. Стандартная конфигурация Arch
  11. B. Сгенерированная конфигурация
  12. Продвинутая конфигурация
  13. Компиляция
  14. Установка
  15. Установка модулей
  16. Копирование ядра в каталог /boot
  17. Создание начального RAM-диска
  18. Автоматизированный метод
  19. Ручной метод
  20. Копирование System.map
  21. Настройка загрузчика
  22. Русские Блоги
  23. Глава 1 Разработка модуля ядра драйвера
  24. 1.1 Основы механизма модуля ядра
  25. 1.1.1 Концепция модулей ядра
  26. 1.1.2 Структура модуля ядра Linux
  27. 1.1.3 Скомпилировать и загрузить модуль ядра Linux
  28. 1.2 Начало работы с компиляцией модуля ядра Makefile
  29. 1.2.1 Компиляция модулей
  30. 1.2.2 Анализ конкретного процесса компиляции
  31. 1.2.3 Простое описание внутренней компиляции
  32. 1.3 Передача параметров модуля
  33. 1.3.1 определение module_param ()
  34. 1.3.2 Как использовать module_param ()
  35. 1.3.3 Пример использования
  36. 1.4 Экспорт таблицы символов
  37. 1.4.1 Определение макроса EXPORT_SYMBOL анализ
  38. 1.4.2 Как использовать EXPORT_SYMBOL
  39. 1.4.3 Примеры
  40. Подсказки:
  41. Интеллектуальная рекомендация
  42. Используйте Maven для создания собственного архетипа скелета проекта (4)
  43. Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
  44. Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
  45. Учебный дневник — перелистывание страниц
  46. Нулевое основание для отдыха-клиента
  47. Вам также может понравиться
  48. Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
  49. Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
  50. Шаблон алгоритма конной повозки
  51. 35 Line Code, чтобы получить метод исследования событий (ON)
  52. Образ докера: gitlab

Kernel (Русский)/Traditional compilation (Русский)

В статье представлена краткая инструкция по сборке собственного ядра из исходников kernel.org. Данный метод является традиционным и общим для всех дистрибутивов. В зависимости от вашего опыта, компиляция из исходников может показаться несколько более сложной в сравнении с использованием системы сборки. Инструменты Arch Build System разрабатывались как раз с целью сделать многократно повторяющиеся задачи по компиляции более удобными и безопасными.

Contents

Подготовка

Для подготовки ядра не требуется ни root-аккаунт, ни root-привилегии (например, через sudo).

Установка пакетов

Установите группу пакетов base-devel с набором необходимых инструментов вроде make и gcc . Также рекомендуется установить пакеты, указанные в стандартном PKGBUILD ядра Arch Linux: xmlto , kmod , inetutils , bc , libelf , git , cpio , perl , tar , xz .

Создание каталога сборки

Рекомендуется создать отдельный каталог для сборки вашего ядра. В этом примере будет использоваться каталог kernelbuild в домашнем каталоге:

Загрузка исходников

Выберите версию ядра и загрузите файлы с исходным кодом с сайта https://www.kernel.org. Они будут иметь вид сжатого tar-архива (суффикс tar.xz ).

Загрузить можно просто через браузер (правый клик по ссылке с tar.xz и выбрать Save Link As. ) или любой другой программой, с графическим интерфейсом или интерфейсом командной строки, работающей через HTTP, TFTP, Rsync или Git.

Например, так выглядит загрузка ядра версии 4.8.6 в каталог

Также стоит проверить корректность загрузки. Скачайте файл подписи, с его помощью добудьте отпечаток (fingerprint) ключа, а с помощью отпечатка получите сам ключ:

Обратите внимание, что подпись создаётся для tar-архива (суффикс .tar ), а не для сжатого файла .tar.xz , который был загружен. Необходимо выполнить декомпрессию, но без извлечения архива. Для этого потребуется xz :

К последующим шагам нельзя переходить, если вы не получили вывод в виде «Good signature».

Если wget запускался не из каталога сборки, переместите в него скачанный архив:

Распаковка исходников

Распакуйте архив ядра в каталоге сборки:

Для завершения приготовлений убедитесь, что дерево файлов ядра абсолютно чистое; не стоит полагаться на то, что что оно будет таковым после распаковки. Перейдите в новый каталог с исходниками и выполните команду make mrproper :

Настройка

Это наиболее важный шаг в процессе «подгонки» ядра под точные характеристики вашего компьютера. Настройки ядра, включая используемые модули, задаются в файле .config .

Если правильно выбрать параметры в файле .config , то производительность вашего ядра и компьютера значительно вырастет.

Конфигурация ядра

Существует два способа создать конфигурацию:

  • A. Использовать стандартные настройки Arch для официального ядра (рекомендуется).
  • B. Сгенерировать файл с настройками ядра, работающего в данный момент (например, если вы желаете подкорректировать текущие настройки).

A. Стандартная конфигурация Arch

Этот метод предполагает создание нового файла .config на основе настроек стандартного ядра Arch. Если на вашей машине работает стандартное ядро, выполните следующую команду в каталоге с исходниками нового ядра:

В противном случае стандартную конфигурацию можно взять в официальном пакете ядра Arch Linux.

B. Сгенерированная конфигурация

С ядра 2.6.32 команда localmodconfig создаёт файл .config для нового ядра, отключив все опции, которые не заданы в работающем здесь и сейчас ядре. Другими словами, включены будут только опции, включённые в данный момент.

Хотя данный минималистичный подход позволяет создать высокоэффективную конфигурацию, подогнанную конкретно под вашу систему, есть ряд недостатков, таких как потенциальная неспособность ядра поддерживать более новое аппаратное обеспечение, периферийные устройства и другие особенности.

Продвинутая конфигурация

Существует ряд инструментов для тонкой настройки конфигурации ядра, которые можно использовать вместо многочасовой ручной настройки каждой возможной при компиляции опции.

  • make menuconfig : утилита командной строки с интерфейсом ncurses; была заменена nconfig .
  • make nconfig : новый инструмент командной строки с ncurses-интерфейсом.
  • make xconfig : более дружелюбный к пользвателю графический интерфейс, которому требуется пакет packagekit-qt5 в качестве зависимости. Это рекомендуемый метод — особенно для неопытных пользователей — поскольку в нём упрощена навигация, а также выводится справочная информация о каждой опции.
  • make gconfig : графический настройщик, похожий на xconfig, но использующий gtk.

Выбранную программу необходимо запустить внутри каталога с исходниками ядра. Все они создают новый .config либо перезаписывают существующий. Все опциональные настройки будут автоматически включены, но новые опции (т.е. отсутствовавшие в .config старого ядра) могут не включиться.

После внесения всех необходимых изменений сохраните файл .config . Имеет смысл также сделать резервную копию этого файла вне каталога с исходниками. Возможно, придётся повторить процесс несколько раз, прежде чем результат вас устроит.

Если испытываете сомнения, изменяйте по несколько опций между компиляциями. Если вы не можете загрузиться с новым ядром, изучите список необходимых пунктов конфигурации здесь.

Команда $ lspci -k # в liveCD-окружении выведет список используемых модулей ядра. Важно также не забыть обеспечить поддержку cgroups. Это необходимо для systemd.

Компиляция

Время компиляции может варьироваться от небольшого (

15 минут) до значительного (более часа) в зависимости от настроек ядра и мощности процессора. После задания всех необходимых настроек нового ядра в файле .config , выполните в каталоге с исходниками следующую команду:

Установка

Установка модулей

После того, как ядро скомпилировано, то же самое необходимо сделать с модулями. Сначала соберите модули:

Затем установите их:

Эта команда скопирует откомпилированные модули в каталог /lib/modules/ — . Например, для ядра версии 4.8 они будут скопированы в /lib/modules/4.8.6-ARCH . Это позволяет хранить модули разных ядер в отдельных каталогах.

Копирование ядра в каталог /boot

В результате компиляции ядра создаётся bzImage (big zImage, «большой сжатый образ») этого ядра, который необходимо скопировать в каталог /boot и переименовать. Имя должно начинаться с vmlinuz- , окончание можно выбрать любое. В примерах ниже установленное и скомпилированное ядро версии 4.8 копируется и переименуется в vmlinuz-linux48 :

Создание начального RAM-диска

Если вы не знаете, что такое создание начального RAM-диска, изучите статьи initrd и mkinitcpio.

Читайте также:  Какое время требуется для установки windows 10

Автоматизированный метод

Чтобы initramfs для нового ядра был сгенерирован аналогично официальному ядру, можно скопировать и модифицировать существующий mkinitcpio preset. Это удобно при перекомпиляции ядра (например, после обновления). В примере ниже файл предустановок (preset file) стокового ядра Arch копируется и модифицируется под ядро версии 4.8, установленное выше.

Сначала скопируйте существующий preset-файл, переименовав его с использованием суффикса из /boot/vmlinuz- (в нашем случае — linux48 ):

Затем отредактируйте файл под новое ядро. В параметре ALL_kver= необходимо указать имя нового ядра, выбранное при копировании bzImage :

Наконец, сгенерируйте initramfs-образ для нового ядра:

Ручной метод

Вместо использования файла с предустановками можно сгенерировать initramfs-файл вручную посредством mkinitcpio:

  • -k ( —kernel ): указывает модули, которые будут использованы при генерации образа. Имя совпадает с именем каталога с исходниками нового ядра (и каталога с модулями для него, расположенного в /usr/lib/modules/ ).
  • -g ( —generate ): указывается имя initramfs-файла, который будет создан в каталоге /boot . Ещё раз — рекомендуется использовать стандартную схему именования, упомянутую выше.

Например, команда для ядра версии 4.8:

Копирование System.map

Файл System.map не требуется для загрузки Linux. Это что-то вроде «телефонной книги» со списком функций для конкретной сборки ядра. System.map содержит список символов ядра (т.е. имён функций, переменных и т.п.) и соответсвующих им адресов. Это отображение имён символов на адреса используется:

  • Некоторыми процессами вроде klogd, ksymoops и т.д.
  • Обработчиком OOPS, когда во время падения ядра на экран выводится информация (например, о том, какая именно функция вызывала падение).

Если ваш каталог /boot использует файловую систему с поддержкой символических ссылок (т.е. не FAT32), скопируйте System.map в /boot , добавив название ядра к итоговому файлу. Затем создайте символическую ссылку /boot/System.map на /boot/System.map- :

В итоге в /boot должно быть 3 файла и 1 символическая ссылка (не считая любых других файлов, находившихся там до этого):

  • Ядро: vmlinuz-
  • Initramfs: Initramfs- .img
  • System Map: System.map-
  • Символическая ссылка на System Map.

Настройка загрузчика

Добавьте в файл настроек загрузчика пункт с новым ядром. В статье Процесс загрузки Arch#Сравнение возможностей приведено сравнение доступных загрузчиков; также изучите соответствующие статьи.

Источник

Русские Блоги

Глава 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, используйте следующую команду для компиляции модуля:

Читайте также:  Что такое bfe windows

-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-массива
параметры массива, значения, указанные в списке, разделенном запятыми, также поддерживаются загрузчиком модуля. Чтобы объявить параметр массива, используйте:

Читайте также:  Как поменять расширение файла mac os

Имя массива имен (также имя параметра),
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 .

Источник

Оцените статью