Адрес в ядре

У меня есть вопрос, когда я нашел адрес в ядре. Я вставляю модуль приветствия в ядро, в этот модуль я помещаю эти вещи:

char mystring[]="this is my address";
printk("<1>The address of mystring is %p",virt_to_phys(mystring));

Я думаю, что могу получить физический адрес mystring, но в системном журнале я нашел его адрес 0x38dd0000. Однако я выгрузил память и обнаружил, что ее реальный адрес - dcd2a000, который сильно отличается от предыдущего. Как это объяснить? Я сделал что-то не так? Спасибо

PS: я использовал инструмент для сброса всей памяти, физических адресов.

1 ответ

Решение

По данным справочной страницы VIRT_TO_PHYS

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

Эта функция не дает сопоставления шины для передач DMA. Почти во всех возможных случаях драйвер устройства не должен использовать эту функцию

Попробуйте выделить память для mystring с помощью kmalloc первый;

char *mystring = kmalloc(19, GFP_KERNEL);
strcpy(mystring, "this is my address"); //use kernel implementation of strcpy
printk("<1>The address of mystring is %p", virt_to_phys(mystring));
kfree(mystring);

Вот реализация strcpy, найденная здесь:

char *strcpy(char *dest, const char *src)
{
    char *tmp = dest;

    while ((*dest++ = *src++) != '\0')
            /* nothing */;
    return tmp;
}
Другие вопросы по тегам