Programowanie OS - problem - nie uruchamia się


(Paulikpro) #1

Ostatnio zrobiłem proste jądro systemowe. Nie wiem czemu nie chce mi otworzyć na żadnym komputerze i emulatorze. Kod:

boot.asm

use16org 0x7C00start:push 0x0010 ;segment 0x0010pop esmov ax,0x0201 ;funkcja czytania sektorow, 1 sektor do odczytaniamov cx,2 ;numer sektoraxor dx,dx ;glowica 0,dysk 0 = dyskietka axor bx,bx ;adres 0x0010:0000int 0x13jc blad unlock_a20:;fast a20 unlockin al,0x92test al,2jnz @f ;juz ustawionaor al,2out 0x92,al@@: jmp 0x0010:0000blad:hlttimes 510 - ($ - start) db 0dw 0aa55h include 'os.asm'

os.asm

include '%fasminc%/os.inc'include 'macro.asm' org 0use16cli ;wylacz przerwaniacldmov ax, 0x0010mov ds, ax;ustaw prawidlowy, linearny adres gdtadd dword [gdt_descriptor+2], 0x100lgdt [gdt_descriptor] mov eax, cr0or eax, 1;przejscie do pmodemov cr0, eaxjmp (1 shl 3):pm ;ustawienie cs na 32 bitowy selektor segmentu ;descriptor seg_limit*,base_address*,type*,system*,dpl*,present*,avl*,_64*,d_b*,granularity*gdt:dq 0 ;null segmentgdt_ldt 0xffff,0,execute_ro,1,0,1,1,0,32,1gdt_ldt 0xffff,0,rw,1,0,1,1,0,32,1gdt_end: gdt_descriptor: dw gdt_end - gdt - 1 dd gdt org 0x0100+$use32START:pm: ;ustaw poprawne segmentymov ax, (2 shl 3)mov ss,axmov ds,axxor edx,edxmov fs,dxmov es,axmov gs,dxmov esp,0x000A0000 ;wyczysc ekranmov edi,[ekran]xor eax,eaxmov ecx,(80*25)/2rep stosd ;ustaw jasnobłękitny kolorstdcall setcolor,9 ;wypisz tekststdcall puts,witajhlt ;funkcja ustawia zmienna oznaczajaca kolor na podany argumentsetcolor: ;(kolor)mov al,byte[esp+4]mov byte[kolor],alret 4 ;funkcja puts wyswietla lancuch znakow (zakonczony znakiem zerowym),;na ekranputs: ;(asciiz *napis)push esimov esi,[esp+8]push edimov edi,0xb8000 ;0xb8000 = adres pierwszego znaku ekranumov ah,[kolor]@@:lodsbtest al,aljz @fstoswjmp @b@@:mov [ekran],edipop edipop esiret 4 ;daneekran dd 0xb8000witaj db "Witaj w moim systemie operacyjnym!",0kolor db ?

macro.asm

macro gdt_ldt seg_limit*,base_address*,type*,system*,dpl*,present*,avl*,_64*,d_b*,granularity* { local _db if d_b eq 16 _db=0 else if d_b eq 32 _db=1 else display "Bad default operation size",0x0d,0x0a err end if if granularity > 1 | granularity < 0 display "Bad granularity",0x0d,0x0a err end if if _64 > 1 | _64 < 0 display "Bad 64 bit code segment",0x0d,0x0a err end if if avl > 1 | avl < 0 display "Bad available bit",0x0d,0x0a err end if if present > 1 | present < 0 display "Bad present bit",0x0d,0x0a err end if if dpl > 3 | dpl < 0 display "Bad descriptor privilege level",0x0d,0x0a err end if if system > 1 | system < 0 display "Bad system bit",0x0d,0x0a err end if if type > 15 | type < 0 display "Bad type",0x0d,0x0a err end if if seg_limit > 0xfffff display "Bad system bit",0x0d,0x0a err end if dw (seg_limit and 0xffff) dw (base_address and 0xffff) db ((base_address shr 16) and 0x00ff) db (present shl 7) or (dpl shl 5) or (system shl 4) or type db (granularity shl 7) or (_db shl 6) or (_64 shl 5) or (avl shl 4) or ((seg_limit shl 16) and 0x0F) db (base_address shr 24) };dataro equ 0accessed equ 1rw equ 2ro_expand_down equ 4rw_expand_down equ 6;codeexecute equ 8execute_ro equ 10conforming_execute equ 12conforming_execute_ro equ 14

os.inc

include '/macro/if.inc'include '/macro/struct.inc'include '/macro/proc32.inc'macro allow_nesting{ macro pushd value \{ match ,value \\{ pushx equ \\} match =pushx =invoke proc,pushx value \\{ allow_nesting invoke proc purge pushd,invoke,stdcall,cinvoke,ccall push eax pushx equ \\} match =pushx =stdcall proc,pushx value \\{ allow_nesting stdcall proc purge pushd,invoke,stdcall,cinvoke,ccall push eax pushx equ \\} match =pushx =cinvoke proc,pushx value \\{ allow_nesting cinvoke proc purge pushd,invoke,stdcall,cinvoke,ccall push eax pushx equ \\} match =pushx =ccall proc,pushx value \\{ allow_nesting ccall proc purge pushd,invoke,stdcall,cinvoke,ccall push eax pushx equ \\} match =pushx,pushx \\{ pushd <value> pushx equ \\} restore pushx \} macro invoke proc,[arg] \{ \reverse pushd <arg> \common call [proc] \} macro stdcall proc,[arg] \{ \reverse pushd <arg> \common call proc \} macro cinvoke proc,[arg] \{ \common size@ccall = 0 if ~ arg eq \reverse pushd <arg> size@ccall = size@ccall+4 match =double any,arg \\{ size@ccall = size@ccall+4 \\} \common end if call [proc] if size@ccall add esp,size@ccall end if \} macro ccall proc,[arg] \{ \common size@ccall = 0 if ~ arg eq \reverse pushd <arg> size@ccall = size@ccall+4 match =double any,arg \\{ size@ccall = size@ccall+4 \\} \common end if call proc if size@ccall add esp,size@ccall end if \} } macro pushd value{ match first=,more, value \{ \local ..continue call ..continue db value,0 ..continue: pushd equ \} match pushd =addr var,pushd value \{ \local ..opcode,..address virtual at 0 label ..address at var mov eax,dword [..address] load ..opcode from 0 end virtual if ..opcode = 0A1h push var else lea edx,[..address] push edx end if pushd equ \} match pushd =double [var],pushd value \{ push dword [var+4] push dword [var] pushd equ \} match pushd =double =ptr var,pushd value \{ push dword [var+4] push dword [var] pushd equ \} match pushd =double num,pushd value \{ \local ..high,..low virtual at 0 dq num load ..low dword from 0 load ..high dword from 4 end virtual push ..high push ..low pushd equ \} match pushd,pushd \{ \local ..continue if value eqtype '' call ..continue db value,0 ..continue: else push value end if pushd equ \} restore pushd } allow_nesting

Bardzo proszę o pomoc! Inaczej nie zdam!


(Frankfurterium) #2

 

A nie przepisałeś stąd?


(Paulikpro) #3

Tak! I w tym jest błąd. Chodzi mi o to, żeby się uruchomiło. Później będę programował sam.


(Frankfurterium) #4

 

Artykuł, z którego skopiowałeś kod, zawiera informacje o konfiguracji emulatora. Czego próbowałeś i co dokładnie nie działa? Sformułuj porządnie swój problem, bo na razie nawet nie wiadomo, w czym ci pomóc.

 

Nieco inne spojrzenie zaprezentowano tutaj. Gdzieś w połowie jest opisane, jak przygotować obraz bootowalnej dyskietki i jak go uruchomić w emulatorze.


(rgabrysiak) #5

Dlatego też proszę, korzystając z przycisku EDYTUJ , który znajdziesz w prawym dolnym rogu swojego posta i opcji Użyj pełnego edytora, dokonać korekty tytułu, tak aby konkretnie mówił o problemie.

W przeciwnym razie trafi on do Kosza.


(Paulikpro) #6

Ty mnie chyba nie rozumiesz. Z emulatorem wszystko w porządku. Coś jest nie tak z kodem źródłowym. Ani emulator, ani komputer nie wykrywają go jako system. Rozumiesz?

Bardzo proszę o pomoc! Czas mi się kończy…


(Frankfurterium) #7

 

Tak. I gdybyś dokładnie przeczytał oba teksty, też byś rozumiał. W tekstach masz wyraźnie napisane, co trzeba, żeby emulator/system uznał program za bootowalny (po twojemu - żeby uznał go za system).