Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: расположение модуля в памяти системы
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
romez777
Приветствую,

ядро 2.6.31.8 сконфигурировано с включенным CONFIG_VMSPLIT_3G, т.е. 1G под ядерную память и 3G под юзер спейс — соответственно ядро занимает пространство 0xc0000000 - 0xffffffff, а пользовательские процессы живут в диапазоне 0x00000000 - 0xbfffffff.

Однако наблюдаю следующее:

CODE
# cat /sys/module/mydrv/sections/.data
0xbf00b4f4
# cat /sys/module/mydrv/sections/.text
0xbf006000


И это поведение всех драйверов на этой системе, вот так расположен марвеловский драйвер ethernet свитча на этой же платформе:

CODE
# cat /sys/module/mvPpDrv/sections/.text /sys/module/mvPpDrv/sections/.data /sys/module/mvPpDrv/sections/.bss
0xbf006000
0xbf00b4f4
0xbf00c3a4


Вот на всякий случай информация о процессоре:
CODE
# cat /proc/cpuinfo
Processor       : Feroceon 88FR131 rev 1 (v5l)
BogoMIPS        : 799.53
Features        : swp half thumb fastmult edsp
CPU implementer : 0x56
CPU architecture: 5TE
CPU variant     : 0x2
CPU part        : 0x131
CPU revision    : 1

Hardware        : Feroceon-KW
Revision        : 0000
Serial          : 0000000000000000


Не понимаю как получается что ядерный модуль оказался загружен по user space адресам? Я предполагал, что модуль после insmod должен стать частью ядра и жить в ядерном пространстве.

Возможно я ошибаюсь — просьба просветить и поправить. Спасибо!
romez777
В вопросе разобрался, нашел где в ядре задаются адреса по которым будут грузиться модули (это архитектурно специфичные настройки):

CODE
% more arch/arm/include/asm/memory.h
...
/*
* PAGE_OFFSET - the virtual address of the start of the kernel image
* TASK_SIZE - the maximum size of a user space task.
*/
#define PAGE_OFFSET             UL(CONFIG_PAGE_OFFSET)
#define TASK_SIZE               (UL(CONFIG_PAGE_OFFSET) - UL(0x01000000))

/*
* The module space lives between the addresses given by TASK_SIZE
* and PAGE_OFFSET - it must be within 32MB of the kernel text.
*/

#define MODULES_VADDR           (PAGE_OFFSET - 16*1024*1024)


А вот выделение памяти под модуль:

CODE
% more arch/arm/kernel/module.c
...
void *module_alloc(unsigned long size)
{
        return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
                                GFP_KERNEL, PAGE_KERNEL_EXEC, -1,
                                __builtin_return_address(0));
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.