Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: GCC Inline Assembler & Bios Interrupts  (Прочитано 4275 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Robotex

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
GCC Inline Assembler & Bios Interrupts
« : 20 Октября 2008, 20:34:19 »
Есть тут программисты, которые разбираются в ассемблере?

Есть код, помогите до ума довести. Нужна функция для чтения сектора диска в LBA режиме с помощью прерываний. Вот наклепал немного, но знаний пока не хватает, чтобы самому доделать... А функция нужна срочно...

#include <stdio.h>

#define FP_SEG(fptr) ((unsigned)((unsigned long)(fptr) >> 16))
#define FP_OFF(fptr) ((unsigned)(fptr))

#define BYTE unsigned char
#define WORD unsigned short
#define DWORD unsigned int

#define SECTOR_SIZE 512

struct disk_packet //needed for int13 42h
{
BYTE size_pack; //size of packet must be 16 or 16+
BYTE reserved1; //reserved
BYTE no_of_blocks; //nof blocks for transfer
BYTE reserved2; //reserved
WORD offset; //offset address
WORD segment; //segment address
DWORD lba1;
DWORD lba2;
} disk_pack;

void LBASectorRead(void *buffer/*, unsigned long lba */)
{
unsigned char bError = 0;
disk_pack.size_pack=16; //set size to 16
disk_pack.no_of_blocks=1; //1 block ie read one sector
disk_pack.reserved1=0; //reserved word
disk_pack.reserved2=0; //reserved word
disk_pack.segment=FP_SEG(buffer); //segment of buffer
disk_pack.offset=FP_OFF(buffer); //offset of buffer
disk_pack.lba1=0; //lba first 32 bits
disk_pack.lba2=0; //last 32 bit address

asm(".intel_syntax noprefix \n\t"
    "mov dl, 0x80 \n\t"
    "mov %1, ds \n\t"
    "mov si, %3 \n\t"
    "mov ah, 0x42 \n\t"
    "int 0x13 \n\t"
    ".att_syntax noprefix \n\t");

/*_asm
{
mov dl, 80h;
mov [disk_pack.segment], ds;
mov si, disk_pack;
mov ah, 42h;
int 13h
jc NoError ; //No error, ignore error code
mov bError, ah ; // Error, get the error code
NoError:
}

printf( "%d", bError);*/

}

void PrintSector(char * buffer)
{
  int i;
  for(i = 0; i < SECTOR_SIZE; i++)
  {
    printf("%d ", *(buffer+i));
    if((i+1)%12==0) printf("\n");
  }
  printf("\n");
}

int main(void)
{
static unsigned char currentMBR[SECTOR_SIZE] = {0};
printf("\n\n");
LBASectorRead(&currentMBR );
PrintSector(currentMBR); //function to print buffer in hex
}

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #1 : 21 Октября 2008, 06:36:24 »
Прерывания int 13h со товарищи увы в защищенном режиме процессора не работают. Ну или надо очень сильно извращаться чтобы они заработали.
Лучше сразу убеся об стенку или иди читать что-нибудь типа "пишем свою мега кульную ОС".

Весь твой диск представлен в виде блочного устройства в каталоге /dev/ (что-то типа /dev/sda) так что вооружаешься простым read (man 2 read) и вперед и с песней.

Оффлайн Robotex

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #2 : 21 Октября 2008, 18:09:50 »
Нету у меня файла /dev/устройство. Потому что это моя собственная ОСь (преподы заставили написать)

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #3 : 22 Октября 2008, 06:50:09 »
« Последнее редактирование: 22 Октября 2008, 06:53:50 от Yurror »

Оффлайн Robotex

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #4 : 22 Октября 2008, 21:08:40 »
Мне чтение сектора с флешки в защищенном режиме...

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #5 : 23 Октября 2008, 14:13:44 »
му ха ха ... тебе придется реализовать весь USB стек :)
удачи =) бери исходники linux ищи подсистему USB и копай...
1) выясни какой именно драйвер обрабатывает именно твою флешку
2) дальше смотри зависимости этого драйвера (какие системы требует, что можно выкинуть)

P.S. лучше убей препода который заставил тебя так извращаться =)

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #6 : 23 Октября 2008, 14:16:55 »
Решение номер два (не делайте так, дети):
Процессор умеет выходить из защищённого режима обратно в реальный режим.
Если сильно постараться можно сделать функцию которая будет выходить из PM, пользоваться услугами int 13h, возвращаться снова в PM.
« Последнее редактирование: 23 Октября 2008, 14:20:35 от Yurror »

Оффлайн Robotex

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #7 : 25 Октября 2008, 16:53:53 »
А как использовать виртуальный режим V86? Мне это кажется наиболее разумным...

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #8 : 26 Октября 2008, 08:10:28 »
Robotex, почему-то мне кажется это бредом... виртуальный режим не является отдельной виртуальной машиной. это всего лишь задача которая исполняется в многозадачной ОС работающей в защищенном режиме. Естественно все прерывания перехватываются ОС работающей в P-Mode и эмулируется работа прерываний BIOS'а средствами этой самой ОС.
Robotex, может тебе перевестить на эконом (там самое сложное это написать программу которая методом трапеций посчитает определнный интеграл) или вообще на филфак. будешь рассуждать быть или не быть. моё мнение не быть тебе программистом пока не начнешь читать документацию.
http://sasm.narod.ru/ на вот прочти это если не смог осилить оригинальную документацию от Intel

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #9 : 26 Октября 2008, 08:18:37 »
Тебе именно из защищенного режима читать флешку надо?
Может тебе просто написать бутор кторый средствами BIOS вычитает заранее большой объем даных и выгрузит в память. И после этого переходить в защищенный режим. Так делают все современные загрузчики ОС.

P.S. собственно задачку ты не описал как следует. это я так к слову. навеяло тем что ты вообще ни читаешь документацию. вдруг тебе именно это надо.

Оффлайн Robotex

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #10 : 27 Октября 2008, 13:26:34 »
Мне нужно реализовать файловую систему в мой ОСи. Сама ФС пустяк, но для ее создания мне необходимы функции чтения сектора с флешки и записи сектора на флешку.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #11 : 27 Октября 2008, 14:09:31 »
Если тебе именно ФС реализовать. Потренируйся на HDD сначала. для них я тебе код дал. когда получится с HDD будешь подключать работу с флешками.

Оффлайн Robotex

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #12 : 02 Ноября 2008, 23:27:38 »
Если тебе именно ФС реализовать. Потренируйся на HDD сначала. для них я тебе код дал. когда получится с HDD будешь подключать работу с флешками.

выбора нет. Нужно либо с дискетами, либо с cd, либо с флешками. Можно попробывать на фиртуальной машине с флопиком, как с ним работать?

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #13 : 06 Ноября 2008, 14:23:56 »
Ну как, герой? Справился?

Оффлайн Robotex

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: GCC Inline Assembler & Bios Interrupts
« Ответ #14 : 13 Ноября 2008, 00:53:17 »
Нет, не справился  :-[ В реальном режима запросто, а вот в защищенном - хрен. Решено ограничится одними только дискетами (в виртуальной машине буду запускать). Работа через порты. Уже неделю читаю, голова пухнет, а результата нет (((
Вот почему нет такого кода, который можно было бы просто вставить в код своей ОСи и не задумываться больше о диске )))

 

Страница сгенерирована за 0.073 секунд. Запросов: 25.