Курсач по ТОС
Да и вот какое дело: если я пишу функцию на асме и объявляю ее глобальной, то как потом в С, ей параметры передать?
Связь C-Asm как организуешь?
но никто после этого не мешает писать в коде процедуры всех остальных конвенций вызова, самостоятельно разбирая местоположение параметров в них. Разве что с директивой слегка проще..
Вот к примеру есть функция на асме:
global _increment
_increment:
add eax, 1
ret
Тогда в С указываем прототип
increment(int i)
и можно вызывать функцию?
я учу ассемблер всего месяц, так что мало что понял )) как должным образом прототип объявить?
Если извлекать параметры из стека, то код выглядит так?
global _increment
_increment:
pop eax
add eax, 1
ret
И в С указываем прототип
increment(int i)
Оно?
а можно так чтоб я понял? )))))) Что значит вернулся по параметру? И почему ip? Я ведь передавал при вызове i? Разве его не поместило в стек?
{
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
{
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);
}
int main(void)
{
static unsigned char currentMBR[SECTOR_SIZE] = {0};
printf("\n\n");
LBASectorRead(currentMBR );
PrintSector(currentMBR); //function to print buffer in hex
}
Ядро позволяет вызывать прерывания...
Читать из /dev/hda нельзя, ибо я пишу СВОЮ ОСь. А там я такой файл пока не реализовал.
Когда говорил, что нужно портировать под linux, подразумевал сишный код (ассемблерные вставки в gcc по другому выглядят, да и типов BYTE, WORD, DWORD нету, нужно создать файл, где они будут определены).
Это собственная ОСь, поэтому нельзя пользоваться чужими файлами и нельзя подключать библиотеки
Это я понял, мне просто показалось что вы хотите линуксом прочитать сектор - вот и предложил другой метод. Тогда объясните что не работает в данном примере, а то у меня линукса с GCC под рукой нету. На первый взляд LBA-пакет корректно заполняется и прерывание корректно вызывается. Если это не так, можно найти документацию по этому прерыванию, проверить.
section .data
msg_error db "Error!"
dap:
packet_size db 10h
reserved db 00h
N_SEC dw 01h
buff_seg dw 00h
buff_off dw buff
X_SEC dd 0
dd 0
section .bss
buff resb 512
section .text
global _start
_error:
mov al, 0x28
call _kputchar
jmp _exit
_kputchar:
pusha
mov ah, 0x0E
int 0x10
popa
ret
_start:
mov ah, 42h
mov dl, 80h
mov si, dap
int 13h
jc _error
mov ah, 0x0E
mov al, 0x29
int 0x10
_exit: jmp _exit
#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(¤tMBR );
PrintSector(currentMBR); //function to print buffer in hex
}
section .text
xor ax,ax
mov ds,ax
mov es,ax
_start:
mov ah, 42h
mov dl, 81h
mov si, dap
int 13h
jc _error
mov ah, 0x0E
mov al, 0x29
int 0x10
_exit: jmp _exit
global _start
_error:
mov al, 0x26
call _kputchar
jmp _exit
_kputchar:
pusha
mov ah, 0x0E
int 0x10
popa
ret
section .data
msg_error db "Error!"
dap:
packet_size db 10h
reserved db 00h
N_SEC dw 01h
buff_seg dw 00h
buff_off dw buff
X_SEC dd 0
dd 0
section .bss
buff resb 512
Мне обьяснили, что для реализации подобного в защищенном есть два способа:
1. Вернуться в реальный, считать, вернуться в защищенный. Чем это чревато? Что случиться с процссами в памяти?
2. Реализовать режим виртуального V86. Как это осуществляется?
1. Вернуться в реальный, считать, вернуться в защищенный. Чем это чревато? Что случиться с процссами в памяти?
2. Реализовать режим виртуального V86. Как это осуществляется?
зачем его реализовывать в защищенном???!!
1. Из под Linux? Она не должна дать тебе перейти в реальный
2. Опять же, в какой среде реализовывать V86?
Я пишу свою собственную ось. В ней нужно сделать чтение сектора. Вот я сделал код для реального режима, но ОСь моя должна работать в защищенном. Вот я и спрашиваю как сделать подобное в защищенном...
порты ж для флешки это очень сложно (((
Просто интересно, ато VirtualPC 2007 + ядерный отладчик (Debugging tools for Windows) - неплохая связка для отладки ОС.
Не знаю как у вас, но у нас темы выбираются по номеру варианта, а не добровольно...
Просто интересно, ато VirtualPC 2007 + ядерный отладчик (Debugging tools for Windows) - неплохая связка для отладки ОС.
Писать ОС в Windows это извращение. Тем более этой самой Windows у меня нету. Пользуюсь VMware.
:D
Писать ОС самостоятельно - вот извращение.
А ту пару я как пример привел (имел с ними дело), мало ли чего под Линупсом есть (VMware + gdb ?) - без отладчика всяко хреново.
1. Отправить в порт ЖД сектор который хочешь прочитать
2. Прочитать из порта ЖД байты этого сектора
Я ж давал тебе ссылки для просветления? Ты чего-то не просветился!
Есть где нибудь нормальный исходник в котором реализованы чтение сектора с дискеты и запись сектора на дискету, который можно просто втавить в свою ОСь и пользоваться не задумываясь?