Как загружаемые во время выполнения модули ядра узнают адреса основных функций ядра?

#c #linux-kernel #kernel

#c #linux-ядро #ядро

Вопрос:

Мне были бы интересны ответы как для Linux, так и для NT (или любого другого, если на то пошло)

Редактировать:

Спасибо Laurion за ответ.

Дополнительная информация здесь:

Комментарии:

1. Адреса основных функций ядра могут отличаться… по крайней мере, в Windows en.wikipedia.org/wiki/Address_space_layout_randomization

Ответ №1:

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

Комментарии:

1. Кто мог догадаться? Решение проблемы с другим уровнем косвенности!

Ответ №2:

Ранее я написал загрузчик как для ядра Windows (так и для пользовательского пространства Windows): он работает одинаково. по сути, все двоичные файлы имеют нечто, называемое IAT (например, http://msdn.microsoft.com/en-us/magazine/cc301808.aspx это вечная классическая статья). Когда загрузчик выделит память для библиотеки DLL, он скопирует туда библиотеку DLL и прочитает IAT библиотеки DLL для всех необходимых символов (по имени), а затем выполнит поиск по именам в разделе экспорта библиотеки DLL Windows core (например, kernel32.dll ) и заполните его прочитанным адресом. все необходимые файлы должны быть прочитаны и заполнены адресом, прежде чем DLL сможет продолжить выполнение.

Linux работает таким же образом too…..be это пользовательское пространство или ядро. Структура ELF называет это таблицей перемещения.

http://www.bravegnu.org/gnu-eprog/linker.html

Надеюсь на помощь 🙂 (детали аналогичны для x86 arch).