Нужно считать из области памяти, выделенной для BIOS, адреса портов. Учитывая, что Linux, не позволяет использовать стандартные прерывания BIOS типа int 14h. Как это сделать?
Обычно на C используют ссылки типа far*, но чего-то у меня не получается это под Linux. Возможно, из памяти (например, 0000:0040h) это как-то можно сделать с помощью Inline-asm, типа mov (%%esp:%%ebp),%%edx. Может, кто подскажет?
Доступ к памяти в Linux
- satanic_mechanic
- Интересующийся
- Сообщения: 56
- Зарегистрирован: 18 июл 2003, 01:36
- Контактная информация:
Помню, в прошлом году пришлось писать патч для какой-то видеокарты на странном устройстве, где не работал 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
Добрый день!
Нахожусь на начальном этапе освоения работы с файлом памяти /dev/mem
Есть диапазон адресов 0xD0000-0xDFFFF памяти.
Этим адресам соответствует такая же позиция в файле устройства?
Нахожусь на начальном этапе освоения работы с файлом памяти /dev/mem
Есть диапазон адресов 0xD0000-0xDFFFF памяти.
Этим адресам соответствует такая же позиция в файле устройства?