Linux.by
https://forum.linux.by/

Доступ к памяти в Linux
https://forum.linux.by/viewtopic.php?f=6&t=4857
Страница 1 из 1

Автор:  Anonymous [ 05 апр 2005, 20:35 ]
Заголовок сообщения:  Доступ к памяти в Linux

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

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

Автор:  Aleksey Kondratenko [ 06 апр 2005, 01:07 ]
Заголовок сообщения: 

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

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

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

Автор:  satanic_mechanic [ 06 апр 2005, 13:23 ]
Заголовок сообщения: 

Помню, в прошлом году пришлось писать патч для какой-то видеокарты на странном устройстве, где не работал 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 [ 19 апр 2012, 08:07 ]
Заголовок сообщения:  Re: Доступ к памяти в Linux

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/