Страница 1 из 1
Доступ к памяти в Linux
Добавлено: 05 апр 2005, 20:35
Anonymous
Нужно считать из области памяти, выделенной для BIOS, адреса портов. Учитывая, что Linux, не позволяет использовать стандартные прерывания BIOS типа int 14h. Как это сделать?
Обычно на C используют ссылки типа far*, но чего-то у меня не получается это под Linux. Возможно, из памяти (например, 0000:0040h) это как-то можно сделать с помощью Inline-asm, типа mov (%%esp:%%ebp),%%edx. Может, кто подскажет?
Добавлено: 06 апр 2005, 13:23
satanic_mechanic
Помню, в прошлом году пришлось писать патч для какой-то видеокарты на странном устройстве, где не работал DPMS. Вот куски кода - теперь разберешься без проблем:
Код: Выделить всё
void set_defaults (void)
{
int fd;
if (verbose >= LOG_DEBUG_MESSAGES)
log (LOG_FILE, "[set_defaults] start");
fd = open ("/dev/mem", O_RDWR);
if (fd == -1) {
if (verbose >= LOG_CRITICAL_ERRORS)
log (LOG_FILE, "[set_defaults] open error");
exit (1);
}
GXBASE = mmap (
0,
65536,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd,
0x40000000
);
if (GXBASE == MAP_FAILED) {
if (verbose >= LOG_CRITICAL_ERRORS)
log (LOG_FILE, "[set_defaults] mmap error");
exit (1);
}
close (fd);
if (verbose >= LOG_DEBUG_MESSAGES)
log (LOG_FILE, "[set_defaults] finish");
}
void enable_display (int blankmode)
{
unsigned int saveregister;
if (verbose >= LOG_DEBUG_MESSAGES)
log (LOG_FILE, "[enable_display] start");
if (verbose >= LOG_DEBUG_MESSAGES)
log (LOG_FILE, "[enable_display] blankmode = %d", blankmode);
if (blankmode) {
*(GXBASE + (0x8300 / 4)) = 0x4758;
saveregister = *(GXBASE + (0x8308 / 4));
saveregister |= 0x0000000E;
*(GXBASE + (0x8308 / 4)) = saveregister;
} else {
*(GXBASE + (0x8300 / 4)) = 0x4758;
saveregister = *(GXBASE + (0x8308 / 4));
saveregister &= 0xFFFFFFF1;
*(GXBASE + (0x8308 / 4)) = saveregister;
}
if (verbose >= LOG_DEBUG_MESSAGES)
log (LOG_FILE, "[enable_display] finish");
}
Удачи ...
Re: Доступ к памяти в Linux
Добавлено: 19 апр 2012, 08:07
sitesv
Добрый день!
Нахожусь на начальном этапе освоения работы с файлом памяти /dev/mem
Есть диапазон адресов 0xD0000-0xDFFFF памяти.
Этим адресам соответствует такая же позиция в файле устройства?