Witam! Poszukuję source'ów do "Pisanie systemów operacyjnych", części 2, autorstwa Wolverine'a. Jeżeli ktoś takowe ma, bardzo proszę o udostępnienie ich.
http://download.4programmers.net/Draco
Z tego OSa byly wycinane kawalki kodu ktore sa w kursach.
Licencja pulic domain - czyli rob z nim co chcesz :P
Popatrzyłem na te source i niestety nie znalazłem tam plików które potrzebuje. (bootloadera w asm i inicjalizacji gdt z poziomu asma, ogółem tych rzeczy z 2 części)
No to przeciez to o czym mowisz masz w tekscie o_O
No tak, ale chodzi mi głównie o plik oraz miejsce wklepiania tego kodu. Kombinowałem parę razy, i ciągle nie tak. Jakbyś mógł, to podaj/napisz co w którym pliku i w jakiej kolejności. (Z góry przepraszam za to "zróbcie mi cośtam", ale jestem zielony jeśli chodzi o asemblera [koduje głównie c/c++ + directx])
Pierw ladujesz jajko (poki masz dostepnego biosa), potem ustawiasz gtd i ustawiasz flage pmode. Na wszystko to sa gotowe kawalki kodu, wystarczy to skleic w jeden plik i skompilowac :P
No włąśnie tylko jak skleić? Próbowałęm na parę sposobów i nie wiem jak. ;/
Nie potrafisz szukać, w dodatku nie myślisz logicznie... po kiego w ogóle się za to bierzesz? Wejście w pmode to zamiana 1 bitu, inicjalizacja gdt jest równie banalna - jedyny co może być problemem to odpowiednie deskryptory, ale to kwestia przeczytania dokumentacji...
A ty nie wiesz gdzie wkleić kod...
Przejrzałem sporo stron forum Inne, 50 stron downloadu, parenaście projektów na sf.net ale nic nie znalazłem (osy były albo na grubie, albo tak jak w przypadku starej wersji linuxa umieszczonej w downloadzie było jakoś dziwnie to robione). Co do reszty - banalne jest może dla Ciebie, bo już trochę w tym siedzisz. Ja z asemblerem dopiero zacząłem przygodę, i nie sądzę, żebym w nim dłużej posiedział.
Mam bootloadera tak:
[16 bitowa czesc]
(ustawiam stos)
(tryb wideo)
(ustawienie gdt)
(pmode)
(skok)
(funkcje gdt)
[32 bitowa czesc]
(skok do jadra)
I na pewno coś źle jest, bo nie ma zamierzonego efektu.
Nie potrafisz szukać, w dodatku nie myślisz logicznie... po kiego w ogóle się za to bierzesz?
Może dlatego żeby się czegoś nauczyć ;]
Nie wiem czy poprawnie ale ja to skleciłem w ten sposób:
[org 0x7C00]
; w tybie rzeczywistym uzywamy 16 bitowego kodu
[BITS 16]
start:
; ustawiamy stos dla trybu rzeczywistego
mov ax, 0x1000
mov ss, ax
xor esp, esp
; inicjujemy tryb wideo 80x25 (tekstowy)
xor ah, ah
mov al, 3
int 0x10
; ladujemy jadro pod adres 0x1000
xor ah, ah
int 0x10
mov ah, 2 ;funkcja 2 przerwania 13h
mov al, 10 ;ilosc sektorow do przeczytania (10*512 = 5kb)
xor ch, ch ;cylinder
mov cl, 2 ;sektor (w 1 jest bootsector)
mov dh, 0 ;glowica
mov bx, 1000h ;gdzie zaladowac kernel (es:bx)
mov es, bx ;dane do ES mozemy umiescic tylko przez inny rejestr
xor bx, bx ;bx rĂłwny 0
int 13h ;wywolujemy przerwanie
lgdt [gdt_descr] ;ladujemy tablice gdt
;wlanczamy PMODE
mov eax, cr0
or eax, 1
mov cr0, eax
mov ax, 0x10 ; deksryptor danych (8 * 2 = 16 = 0x10)
mov ss, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
jmp 0x08:start32 ; uzywamy segmentu kodu z GDT
[BITS 32]
start32:
jmp 0x08:0x10000
;***zmienne***
gdt:
; NULL Descriptor
dd 0
dd 0
; kod, baza: 0, limit: 4GB, DPL: 0
dw 0xFFFF ; mlodsze slowo limitu
dw 0 ; mlodsze slowo bazy
db 0 ; wlodszy bajt starszego slowa bazy
db 10011010b ; kod / exec-read
db 11001111b ; flagi i 4 bity limitu
db 0 ; najstarszy bajt bazy
; dane (odczyt/zapis), baza: 0, limit: 4GB, DPL: 0
dw 0xFFFF
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end:
; naglowek
gdt_descr:
dw gdt_end - gdt - 1 ; rozmiar gdt
dd gdt ; adres pierwszego deskryptora
zakonczenie_bootsektora:
times 510-($-$$) db 0
db 55h
db 0AAh
Wklepałem ten kod (po dodaniu do 4 od dołu linijki średnika na początek)- powodował błąd systemu. Po przekopiowaniu funkcji gdt przed [bits 32], również wywalało błąd.
Jak przechodzisz do 32bits to musisz mieć już gdt ;) A ten... No... bez tej etykiety raczej times nie pójdzie na NASM'ie ;)
To ma ktoś te source? Bo niestety napisane przez Frubi nie działają. ; /
Co Ci nie działa? :/ Może źle kompilujesz lub źle nagrywasz na dyskietkę lub jej obraz? Napisz czym się objawia "nie działanie" może będę w stanie coś pomóc. Może kernel'a źle skleciłeś?
To od początku. Kompiluje poprawnie, bo w trybie rzeczywistym wszytko działało. Podobnie z zapisem na dyskietce. Nie działanie objawia się błędem przy bootowaniu (na VMWare) o treści:
- Virtual machine kernel stack fault (hardware reset) ***
The virtual machine just suffered a stack fault in kernel mode. On a real computer, this would amount to a reset of the processor. It can be caused by an incorrect configuration of the virtual machine, a bug in the operating system, or a problem in the VMware Workstation software. Press OK to reboot virtual machine or Cancel to shut it down.
Czyli innymi słowy coś jest w kodzie nie tak.
Edit:
Może dam jeszcze kod kernela:
[BITS 32]
start32: ; próbowałem z start: i bez tej linijki
hlt ; po wyjsciu z kernela zatrzymujemy komputer
Ok. zakładamy, że wcześniej wszystko masz dobrze.
load_gdt: lgdt [gdt_header]
pmode: mov eax, cr0
or eax, 1
mov cr0, eax ; jesteśmy w Protect Mode
jmp 08h:start32 ; zakładając, że 08h jest odpowiednio opisana w gdt_header
[BITS 32]
[EXTERN kmain]
start32: mov ax, 10h
mov ss, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov esp, 8000h ; ustawienie stosu
call kmain ; mój kod skacze sobie do kernela w ce.
jmp $
hlt
; ------------------
gdt:
dd 0, 0
;code
dw 0FFFFh
dw 0
db 0
db 10011010b
db 11001111b
db 0
;data
dw 0FFFFh
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end:
gdt_header:
dw gdt_end - gdt - 1
dd gdt
W moim kodzie to wszystko działa pięknie. A z uwagi na pewne niezgodności kod nasm <--> kernel w c musiałem trochę nad tym posiedzieć.
A mógłbyś dać więcej kodu? Najlepiej cały bootloader. Wiem, że to brzmi głupio ale naprawdę nie mam pojęcia jak zrobić żeby to działało. ; / Aktualnie mam taki kod:
[ORG 0x7C00]
[BITS 16]
start:
mov ax, 0x1000
mov ss, ax
xor esp, esp
xor ah, ah
mov al, 3
int 0x10
;xor ah, ah
;int 0x10
mov ah, 2
mov al, 10
xor ch, ch
mov cl, 2
mov dh, 0
mov bx, 0x1000
mov es, bx
mov bx, 0
int 0x13
lgdt [gdt_header]
mov eax, cr0
or eax, 1
mov cr0, eax
mov ax, 0x10
mov ss, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
jmp 08h:start32
[BITS 32]
start32:
jmp start32
;jmp 0x08:0x10000
gdt:
dd 0, 0
;code
dw 0FFFFh
dw 0
db 0
db 10011010b
db 11001111b
db 0
;data
dw 0FFFFh
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end:
gdt_header:
dw gdt_end - gdt - 1
dd gdt
times 510 - ($ - $$) db 0
db 55h
db 0AAh
A bochs daje taki log:
http://nopaste.gamedev.pl/?id=556
Może ktoś jeszcze ma te sources i mógł by je wysłać? :)
Chyba o te chodzi
Dziękuje :)
(i sorki za odkop)
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.