Вопрос такой: есть плата, которая использует определенные адреса в памяти, типа видеокарты, для которой создается окно в адресном пространстве. Как получить доступ к этому окну ?
1. Запросить у ОС полномочия на доступ к нужным адресам памяти -
системными вызовами ioperm, либо iopl (можно только из-под рута).
2. Далее запись-чтение из портов в/в вызовами outb,outw,inb,inw и др.
Прототяпы этих функций лежат в <sys/io.h>
Если речь идет об обычной памяти ( не 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: 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 .
Я так и понял, что ты /dev/mem имел в виду Про переносимость - по определению /dev/mem - это суть доступ к физической памяти, она вроде везде одинаково устроена. Так что ИМХО переносимость тут абсолютная (т.е. в Линуксе на любой платформе будет работать) В (G)LDT хранятся линейные адреса, которые потом пропускаются через механизм трансляции страниц Хотя как я понимаю, LDT - это тяжелое наследие 80286 и во всех приличных операционках используется flat-модель, т.е. каждой задаче выделяется один сегмент с базой 0 и размером 4G, а внутри него память распределяется с помощью страниц