LINUX.ORG.RU

Прогрммирование устройств


0

0

Вопрос такой: есть плата, которая использует определенные адреса в памяти, типа видеокарты, для которой создается окно в адресном пространстве. Как получить доступ к этому окну ?

anonymous

1. Запросить у ОС полномочия на доступ к нужным адресам памяти -
системными вызовами ioperm, либо iopl (можно только из-под рута).
2. Далее запись-чтение из портов в/в вызовами outb,outw,inb,inw и др.
Прототяпы этих функций лежат в <sys/io.h>

NewComer
()

Если речь идет об обычной памяти ( не i/o ), то из user mode делается такой трюк: int fd=open("/dev/zero", O_RDWR); void* mem=mmap((void*)your_base_address_here, your_size_here, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_SHARED, fd, 0); close(fd); Базовый адрес должен быть выровнен по размеру страницы ( 0x10000 байт ).

Hamster
()

2Hamster: можно поширше прокомментировать слово "трюк": переносимость, применимость и ограничения такого способа?

anonymous
()

Hamster: i chego eto rabotaet ? voobsheto u prcessa svoya pamyat i znaya lineyniy adres nuzhnoi tebe oblasti ty ne uznaesh gde eto v tvoem adresnom prostranstve potomu kak k tablice descriptorov mozhno poluchit dostup tolko iz kolca 0 a vse prilozheniya rabotayut v kolce 3 (ya pro Linux) tak chto tvoi sposob budet rabotat tolko na OS bez razdeleniya pamyati .

master
()

2Hamster: объясни пожалуйста, подробнее По-твоему, через /dev/zero можно получить доступ к физической памяти?

anonymous
()

2Hamster: объясни пожалуйста, подробнее Неужто через /dev/zero можно получить доступ к физической памяти?

anonymous
()

Ok, налажался, бывает. Делать правильно примерно так:
int fd=open("/dev/mem", O_RDWR);
void* mem=mmap(0, size_here, PROT_READ|PROT_WRITE, MAP_SHARED, fd, base_here);
close(fd);

Переносимость и применимость аналогична переносимости и применимости X ( там это так делается ). Нужны root'овые привилегии.

2 master: не в курсе, в LDT хранятся линейные или физические адреса?

Hamster
()

Я так и понял, что ты /dev/mem имел в виду Про переносимость - по определению /dev/mem - это суть доступ к физической памяти, она вроде везде одинаково устроена. Так что ИМХО переносимость тут абсолютная (т.е. в Линуксе на любой платформе будет работать) В (G)LDT хранятся линейные адреса, которые потом пропускаются через механизм трансляции страниц Хотя как я понимаю, LDT - это тяжелое наследие 80286 и во всех приличных операционках используется flat-модель, т.е. каждой задаче выделяется один сегмент с базой 0 и размером 4G, а внутри него память распределяется с помощью страниц

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