2012-06-09 3 views
7

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

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

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

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

+0

Когда вы «сбрасывали память», вы не получили виртуальные адреса там? –

+0

Память, которую я сбросил, является физическим адресом, я использовал инструмент – Alex

+2

, что такое аппаратная платформа? – shodanex

ответ

7

Согласно Man page of VIRT_TO_PHYS

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

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

Try выделение памяти для 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); 

Вот реализация зЬгсра найдена here:

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

    while ((*dest++ = *src++) != '\0') 
      /* nothing */; 
    return tmp; 
} 
+0

Я использовал это, но есть ошибки. Сначала у kmalloc должно быть два аргумента, поэтому я добавил GEL_KERNEL, второй - в строку strcpy, я думаю, что 'strcpy' не принимается ... так как я могу его решить, спасибо – Alex

+1

Ха-ха, шуты! Простите, прошло около 6 месяцев с тех пор, как я коснулся ядра. Что касается strcpy, вы должны уметь «#include ', если ваш источник ядра предоставляет его. Или вы можете написать свой собственный. – Anthony

+0

спасибо! Много! Но когда я это делаю, есть и две ошибки: одна из них - char * mystring = kmalloc (19, GFP_KERNEL), 'error is' initializer не является константой, другой - 'strcpy (mystring,« this is my address »); 'command, ошибка' ожидается ')' перед строковой константой' Я уже добавил функцию strcpy, которую вы здесь написали, спасибо! – Alex

Смежные вопросы