Статьи Галерея Форум Чат Файлы HowTo Ссылки Поиск
Текущее время: 22 сен 2019, 11:55




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Доступ к памяти в Linux
СообщениеДобавлено: 05 апр 2005, 20:35 
Нужно считать из области памяти, выделенной для BIOS, адреса портов. Учитывая, что Linux, не позволяет использовать стандартные прерывания BIOS типа int 14h. Как это сделать?

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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 06 апр 2005, 01:07 
Неотъемлемая часть форума

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

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

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


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 06 апр 2005, 13:23 
Интересующийся
Аватара пользователя

У нас с: 18.07.2003
Сообщения: 56
Помню, в прошлом году пришлось писать патч для какой-то видеокарты на странном устройстве, где не работал 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 
Заглянувший

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


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
[ All resources are available under GNU GPL ] [ Support ] [ Hosted by DataHata | MyCloud.by ] [ Powered by phpBB® Forum Software © phpBB Group ]

LVEE Winter LVEE Rambler's Top100