Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> аналог dos.h в linux 
:(
    Опции темы
v4567
Дата 18.7.2012, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Подскажите пожалуйста аналог, библиотеки в которой есть заголовочный файл dos.h, в linux.
Необходимо работать с видеоадаптером на низком уровне, писать в видеопамять и т.д. Скорее всего в linux эта библиотека называется не так как в windows? Подскажите пожалуйста её название.
PM MAIL   Вверх
bsa
Дата 18.7.2012, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



эта библиотека называется libc. в ней есть open/read/write/close/ioctl. для работы с аппаратурой большего и не надо. Если для адаптера нет драйвера в ядре, то надо его написать.

Добавлено через 2 минуты и 49 секунд
Кстати, работать с ресурсами аппаратуры может ТОЛЬКО ядро. В *nix все известные ядру устройства, предполагающие работу с пользовательским ПО, представлены в виде файлов, которые находятся в каталоге /dev. Чтобы ядро могло работать с устройством, необходим драйвер. Если устройство относительно стандартное, то драйвер давно есть. Если самопальное, то придется писать самому.
PM   Вверх
500mhz
Дата 19.7.2012, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



Эта библиотека называется svgalib (нужен рут для работы).


--------------------

PM MAIL ICQ   Вверх
v4567
Дата 19.7.2012, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Цитата

Эта библиотека называется svgalib

наверное не совсем то

вот есть код под дос
Код

#include <dos.h>
unsigned char types1A[] = { 0,1,2,4,5,6,7,8,10,11,12,0xff };
char *stypes1A[] = { "нет дисплея","MDA,моно","CGA,цв.",
  "EGA,цв.","EGA,моно","PGA,цв.","VGA,моно,анал.",
  "VGA,цв.,анал.","MCGA,цв.,цифр.","MCGA,моно,анал.",
  "MCGA,цв.,анал.","неизвестный тип",
  "непредусмотренный код"  };
unsigned char b[64];     /* буфер данных VGA */
struct SREGS sr;
union REGS rr;
int i;
main() {
  /* Предположим, VGA */
  rr.h.ah=0x1a;
  rr.h.al=0;
  int86(0x10,&rr,&rr);
  if (rr.h.al==0x1a) {
    printf("Поддерживается ф-ция 1Ah прерывания 10h\n");
    for (i=0; i<12; i++) if (rr.h.bl==types1A[i]) break;
    printf("%s",stypes1A[i]);
    if (i>0 && i<12) {
      rr.h.ah=0x1b;
      rr.x.bx=0;
      sr.es=FP_SEG(b); rr.x.di=FP_OFF(b);
      int86(0x10,&rr,&rr);
      printf(",%dКбайт\n",((int)b[49]+1)*64);
      }
    else printf("\n");
    }
  else {
    /* Предположим, EGA */
    rr.h.ah=0x12;
    rr.h.bl=0x10;
    int86(0x10,&rr,&rr);
    if (rr.h.bl!=0x10) {
      printf("Поддерживается ф-ция 12h прерывания 10h\n");
      printf("EGA,");
      if (rr.h.bh) printf("моно"); else printf("цв.");
      printf(",%dКбайт\n",((int)rr.h.bl+1)*64);
      }
    else printf("MDA или CGA, можно уточнить по INT 11h\n");
    }
}



вот ещё

Код

#include <dos.h>
#include <conio.h>
#define byte unsigned char
byte getmode();
int x_modes();
byte nmode,mode;  /* Номеp, код pежима */
union REGS rr;
byte k;
int i;
main()
{
  /* заполнение экрана */
  clrscr(); textcolor(2);
  for(i=1; i<2000; i++) cprintf("*");
  getch();
  for (k=0; k<2; k++)
    /* при k=0 - обычный режим, при k=1 - с сохранением */
    for (nmode=0; nmode<4; nmode++) {
      mode = (k) ? nmode|0x80 : nmode;
      rr.h.ah=0;     /* функция 0 */
      rr.h.al=mode;  /* код режима */
      int86(0x10,&rr,&rr);
      textcolor(nmode+3);
      cprintf("EGA текстовый режим - %02Xh (%02Xh)  %dx25",
        mode,getmode(),x_modes());
      getch();
      for (i=39; i<x_modes()*25; i++) cprintf("*");
      getch();
      }
  textattr(0x0f);
}
/*==== Номер режима - выбирается из памяти BIOS ====*/
byte getmode() {
  return(peekb(0x40,0x49));
}
/*==== Число символов в строке - из памяти BIOS ====*/
int x_modes() {
  return(peek(0x40,0x4a));
}


мне его надо в linux реализовать

я тут поспрашивал и понял что один в один не получится сделать, в libc есть функции для записи в порт в память и прерывания, делать на низком уровне придётся через них, но один в один код на linux перенести не получится.
Или я ошибаюсь?

PM MAIL   Вверх
bsa
Дата 20.7.2012, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Цитата(v4567 @  19.7.2012,  19:47 Найти цитируемый пост)
 в libc есть функции для записи в порт в память и прерывания

очень странно. по идее, это быть не должно. так как в отличие от DOS все современные ОС защищают доступ к аппаратным ресурсам системы от пользовательских процессов. Таким образом, даже если ты и попытаешься это сделать, то ядро твой процесс моментально прибьет с сообщением segmentation fault.
Если хочешь запустить свою программу на современной ОС, тебе необходимо переписать все функции работы с видеокартой на какие-нибудь библиотечные. Думаю, тебе стоит взглянуть на библиотеку SDL.
PM   Вверх
Kekek
Дата 21.7.2012, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 19.8.2007
Где: Северодонецк

Репутация: нет
Всего: 3



В Юниксах работа с текстовой консолью обычно осуществляется через библиотеки ncurses или slang. Работать в графике лучше через X-Window. Причём, лучше использовать какую-нибудь высокоуровневую библиотеку, например, GTK+ или QT. Прямое обращение к портам ввода-вывода возможно только из ядра, для прикладной программы невозможно.
PM MAIL WWW Jabber   Вверх
rsm
Дата 24.7.2012, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 3
Всего: 62



Цитата(Kekek @  21.7.2012,  15:10 Найти цитируемый пост)
Прямое обращение к портам ввода-вывода возможно только из ядра, для прикладной программы невозможно

Вообще-то возможно: iopl (2), хотя и с ограничениями. Другое дело, что попытка порулить видеопамятью напрямую может обрушить всю систему.
PM MAIL   Вверх
ller
Дата 29.8.2012, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: нет
Всего: 4



ну с правами рута можно писать в порты  outb,  outw,  outl. Только это очень черевато
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0754 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.