Перейти к содержанию
    

расположение модуля в памяти системы

Приветствую,

 

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

 

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

 

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

 

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

 

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

 

Вот на всякий случай информация о процессоре:

# 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 должен стать частью ядра и жить в ядерном пространстве.

 

Возможно я ошибаюсь — просьба просветить и поправить. Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

% 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)

 

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

 

% 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));
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...