почему модуль запускается с адреса 0xbf000000

#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, который является хорошим местом для поиска ответов на подобные вопросы для других архитектур 🙂