Вопрос по linux-device-driver, kernel-module, linux-kernel, kernel – Как компилятор / компоновщик разрешает API ядра, например «printk», вызываемый из модуля в Linux

3

Я написал пример модуля ядра hello.ko:

#include <linux/module.h>      /* Needed by all modules */
#include <linux/kernel.h>      /* Needed for KERN_INFO */

int init_module(void)
{
        printk(KERN_INFO "Hello world.\n");
        return 0;
}

void cleanup_module(void)
{
        printk(KERN_INFO "Goodbye world 1.\n");
}

Здесь я использовал & quot; printk & quot; метод, который представляет собой API ядра, предоставляемый Linux. Я вижу экспортированные символы Linux в «/ proc / kallsyms». Мне любопытно узнать, как gcc / ld связывает называемые API ядра? Получает ли gcc / ld адрес метода ядра из "/ proc / kallsyms"? или какой-то другой файл и выполнить связывание? Если да, как gcc / ld узнает об этом? Я не мог ни один вариант, который говорит это.

Ваш Ответ

1   ответ
7

Загрузчик модулей ядра Linux в основном содержит специальный компоновщик времени выполнения. Файл .ko на самом деле является объектным файлом, как и любой другой, и как таковой он поставляется с таблицей символов. Если вы бежитеnm в теме (nm <path/to/some_module.ko>), вы увидите много символов, помеченных как «U», то есть «не определено». Это включает символы для основных функций ядра, которые используются модулем, такие какprintk, __kmalloc, kfreeи т. д., но во многих случаях также символы, реализованные другими модулями.

Когда модуль загружен, ядро запускает неопределенные символы модуля и ищет их в таблице символов (времени выполнения), исправляя соответствующие области памяти, так же, как любой другой компоновщик. Если какие-либо неопределенные символы еще не находятся в таблице символов, загрузка не удастся (легко показать с помощьюinsmod вместоmodprobe поскольку он не будет загружать зависимости). Он также добавляет любые символы, экспортируемые модулем, в таблицу символов для использования другими модулями, отслеживая зависимости, так что вы не можете извлечь модуль, используемый другим.Илья Матвейчиков имеет ссылку на соответствующий код в загрузчике модуля в комментариях, который поможет, если вы хотите узнать все кровавые подробности.

Спасибо за объяснение, мне было лень это делать :)
Хорошее объяснение !!! Благодарю вас. Dew Kumar

Похожие вопросы