Могу ли я загрузить данные из ОЗУ, используя указатель на память с физической адресацией?

Могу ли я загружать данные из ОЗУ, используя указатель на память с физической адресацией (не на виртуальную) из моего драйвера (ядра Linux) без выделения страниц (PDE/PTE) в виртуальной адресации?


person Alex    schedule 03.12.2013    source источник
comment
Что такое ЦП-ОЗУ? Есть процессор и есть оперативная память. Вы имеете в виду кэш-память процессора?   -  person sawdust    schedule 03.12.2013
comment
@sawdust Нет, я имею в виду оперативную память :)   -  person Alex    schedule 04.12.2013
comment
Я не совсем уверен, что это имеет отношение к вашему вопросу. Но, если можете, быстро прочитайте его. tldp.org/LDP/khg/HyperNews/get/devices/addrxlate.html   -  person Guru Prasad    schedule 04.12.2013
comment
@user1761555 user1761555 Должен ли я использовать «ioremap ()», чтобы получить виртуальный адрес в пространстве ядра (выделить PDE / PTE) и получить доступ к этой памяти по виртуальному адресу, или я могу напрямую прочитать физический адрес? И как мне прочитать память напрямую по физическому адресу?   -  person Alex    schedule 04.12.2013


Ответы (1)


Да! «/dev/mem» — это образ физической памяти, и вы даже можете получить к нему доступ из пользовательского пространства.

Например, чтобы получить доступ к физическому адресу 0x7000000, приведенный ниже код суммирует шаги:

fd = open("/dev/mem", O_RDWR);
map = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x7000000);
person vitorafsr    schedule 03.12.2013
comment
Спасибо! А если у меня 8 ГБ ОЗУ, и я сделаю так, как вы написали, то в таблице страниц будут созданы PDE/PTE для 8 ГБ ОЗУ, т.е. 2 миллиона PTE, не так ли? - person Alex; 04.12.2013
comment
Хотя теоретически это возможно, я думаю, вы хотите просто отобразить область физической памяти, и эта область имеет «ограниченный» размер. - person vitorafsr; 04.12.2013
comment
Но в вашем примере мы не указываем размер региона, а указываем только начальный адрес региона — значит ли это, что мы маппируем всю физическую память (8ГБ)? - person Alex; 04.12.2013
comment
Реализация /dev/mem будет временно выделять виртуальные страницы при доступе к ней с помощью read/write. С mmap будут выделены все страницы. - person CL.; 04.12.2013
comment
Нет, он не всегда отображает всю память. В примере размер отображения указан в переменной SIZE. Это не явно в коде. Вы можете увидеть подробности на справочной странице mmap. - person vitorafsr; 04.12.2013