LINUX.ORG.RU

physical memory access


0

0

Почему не работает (я конечно знаю, что потому, что я что-то неправильно сделал; надеюсь объясните что...) ?

#include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h>

int main (void) { int fd; char *base;

int i;

fd = open ("/dev/mem", O_RDWR);

base = mmap ( 0, 65536, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0xB8000 );

for (i = 0; i < 80 * 25; ++i) { *(base + i * 2) = 'A'; *(base + i * 2 + 1) = 0x55; }

return (0); }

P. S. Запускаю под рутом, выполняется, но ничего не изменяет...

anonymous

У меня меняет. :)

Может у тебя консоль на кадровом буфере?

Murr ★★
()

> 0xB8000

это что-то вроде vga memory? должно работать...

> выполняется, но ничего не изменяет...

что значит, ничего не меняет? содержимое памяти
не меняется, или на экране ничего не видно?

в своей программе сделайте повторный mmap() туда же,
и распечатайте, что там лежит. если там именно то, что
и было записано - разбирайтесь с видео платой.

если нет, значит 0xB8000 не Reserved, посмотрите, что
пишет setup про e820 map при загрузке. 

idle ★★★★★
()

Все, отбой. Пример работает. Не framebuffer был. Просто, когда сказали что у вас работает, я проверил на нормальной линуховой тачке (до этого я проверял в vmware - там не работал. Вот такие у меня условия работы - сделал в vmware, тогда неси на Linux сервер).

Всем большое спасибо ...

anonymous
()
Ответ на: комментарий от Murr

> copy_e820_map должно предотвращать подобные случае...

действительно, я и не знал. то есть, 400K всегда
теряются?

idle ★★★★★
()
Ответ на: комментарий от idle

idle:

А ты встречал чтобы от 640 Кб до 1 Мб была память? :) Там же по какой-то спецификации видео-память, биосы и прочая ерунда живет :)

Murr ★★
()
Ответ на: комментарий от anonymous

anonymous:

При обращениям к памяти (load/store команды) процессор генерирует шинные (физические) адреса на шине :) Эти адреса разбираются чипсетом и направляются по шине нужным устройствам (ОЗУ, видео-карта, etc).

Ядро разбирает карту шинных адресов (они в реальном режиме получаются через int 15h, e820) и выделяет из них адреса ОЗУ. Эти адреса используются для хранения данных... в основном page cache, но еще для для некоторых структур ядра. Page cache не разрешается дважды отображать через mmap: /dev/mem, только зарезервированные адреса (не ОЗУ). ОЗУ через /dev/mem достается через read/write (mmap запрещается).

Murr ★★
()

Как узнать, является ли адрес зарезервированным?

Мне ведь вообще-то надо обратиться к 0x40000000.

Если он не зарезервирован, то мне прийдется open/lseek/read/write ?

anonymous
()

Подскажите литературу, чтобы во всем этом разобраться и поясните какая база (знаний) для этой литературы нужна...

Весьма благодарен...

anonymous
()
Ответ на: комментарий от anonymous

> Как узнать, является ли адрес зарезервированным?

грубо говоря, если по какому-то _физическому_ адресу
какое-то устройство, то все будет хорошо.

не стоит только называть этот адрес резервированным,
такого термина нет. просто некоторые страницы реальной
памяти (то есть pfn_valid) имеют флаг PageReserved, и
к ним можно достучаться через /dev/mem.

> Мне ведь вообще-то надо обратиться к 0x40000000.

а что это за адрес такой подозрительно круглый?
напоминаю, /dev/mem рабоает с физическими адресами.
что вы собраетесь делать?

idle ★★★★★
()
Ответ на: комментарий от Murr

Murr:
> А ты встречал чтобы от 640 Кб до 1 Мб была память? :)

я - нет. но я думал, всякие embedded штучки могут.
впрочем, я про них ничего не знаю.

idle ★★★★★
()
Ответ на: комментарий от anonymous

anonymous:
cat /proc/iomem :)

разобраться в этом сложно, т.к. очень много моментов или слабо формализованы или не всеми поддерживаются и т.п.
Как это сделано в Linux проще всего посмотреть в его коде.
Есть еще вроде какие-то спецификации BIOS от AMI и Award, PnP и ACPI спецификации от Intel и ко. Точных ссылок, к сожалению, не дам, т.к. давно всем этим занимался.

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.