Могу ли я загружать данные из ОЗУ, используя указатель на память с физической адресацией (не на виртуальную) из моего драйвера (ядра Linux) без выделения страниц (PDE/PTE) в виртуальной адресации?
Могу ли я загрузить данные из ОЗУ, используя указатель на память с физической адресацией?
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
Спасибо! А если у меня 8 ГБ ОЗУ, и я сделаю так, как вы написали, то в таблице страниц будут созданы PDE/PTE для 8 ГБ ОЗУ, т.е. 2 миллиона PTE, не так ли?
- person Alex; 04.12.2013
Хотя теоретически это возможно, я думаю, вы хотите просто отобразить область физической памяти, и эта область имеет «ограниченный» размер.
- person vitorafsr; 04.12.2013
Но в вашем примере мы не указываем размер региона, а указываем только начальный адрес региона — значит ли это, что мы маппируем всю физическую память (8ГБ)?
- person Alex; 04.12.2013
Реализация
/dev/mem
будет временно выделять виртуальные страницы при доступе к ней с помощью read
/write
. С mmap
будут выделены все страницы.
- person CL.; 04.12.2013
Нет, он не всегда отображает всю память. В примере размер отображения указан в переменной SIZE. Это не явно в коде. Вы можете увидеть подробности на справочной странице mmap.
- person vitorafsr; 04.12.2013