#linux #linux-kernel #arm #device-driver
#linux #linux-ядро #arm #драйвер устройства
Вопрос:
я использую insmod hello.ko
для запуска модуля, который я создаю. и используйте lsmod
для поиска этого модуля.Затем я обнаружил странную проблему, я увидел, что модуль запускается с адреса 0xbf000000. Как я знал, адрес ядра начинается с 0xc0000000, модуль драйвера является частью ядра.Но его адрес находится в пространстве пользователя.Это довольно странно.
Кстати, он находится на платформе ARM.
Комментарии:
1. Что это за платформа? arm x86 x86_64 ppc? виртуальные адреса могут быть совершенно разными для разных платформ…
2. @gby ARM, и пространство ядра также должно начинаться с 0xc0000000
Ответ №1:
Схема, по которой весь код ядра находится по виртуальному адресу 0xc0000000, на самом деле ограничена только x86, и даже там только при использовании опции конфигурации по умолчанию с разделением адреса памяти 3: 1 между пользовательским пространством и ядром.
В Arm схема адресации пространства виртуальной памяти отличается, и загружаемые в ядро модули сопоставляются из констант TASK_SIZE в PAGE_OFFSET-1, где PAGE_OFFSET — это адрес, с которого начинается прямое сопоставление физической памяти 1: 1.
Полное представление о том, что и куда происходит в Arm, смотрите в этом документе: http://www.arm.linux.org.uk/developer/memory.txt
Он также находится где-то в каталоге документации ядра Linux в подкаталоге Arm, который является хорошим местом для поиска ответов на подобные вопросы для других архитектур 🙂