Доступ к памяти в Linux

Все о программировании под *nix
Anonymous

Доступ к памяти в Linux

Сообщение Anonymous »

Нужно считать из области памяти, выделенной для BIOS, адреса портов. Учитывая, что Linux, не позволяет использовать стандартные прерывания BIOS типа int 14h. Как это сделать?

Обычно на C используют ссылки типа far*, но чего-то у меня не получается это под Linux. Возможно, из памяти (например, 0000:0040h) это как-то можно сделать с помощью Inline-asm, типа mov (%%esp:%%ebp),%%edx. Может, кто подскажет?

Aleksey Kondratenko
Неотъемлемая часть форума
Сообщения: 250
Зарегистрирован: 12 авг 2003, 03:55
Контактная информация:

Сообщение Aleksey Kondratenko »

Забудь о "дальних" указателях. Все уже давно живут в мире 32-ух и более битных систем.

Доступ к физической памяти можно делать через /dev/mеm. См. man mem, man mmap.

Вызов функций биос можно делать через vm86. В коде mplayer и svgalib можно найти как это делается.

Аватара пользователя
satanic_mechanic
Интересующийся
Сообщения: 56
Зарегистрирован: 18 июл 2003, 01:36
Контактная информация:

Сообщение 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");
}



Удачи ...
а по ночам, девушка, я программы пишу ...

sitesv
Заглянувший
Сообщения: 1
Зарегистрирован: 19 апр 2012, 08:01

Re: Доступ к памяти в Linux

Сообщение sitesv »

Добрый день!
Нахожусь на начальном этапе освоения работы с файлом памяти /dev/mem
Есть диапазон адресов 0xD0000-0xDFFFF памяти.
Этим адресам соответствует такая же позиция в файле устройства?

Ответить