[OsDev] Source do kursu Wolverine'a (szukam)

0

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.

0

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

0

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)

0

No to przeciez to o czym mowisz masz w tekscie o_O

0

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])

0

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

0

No włąśnie tylko jak skleić? Próbowałęm na parę sposobów i nie wiem jak. ;/

0

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...

0

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.

0

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ć ;]

0

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
0

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.

0

Jak przechodzisz do 32bits to musisz mieć już gdt ;) A ten... No... bez tej etykiety raczej times nie pójdzie na NASM'ie ;)

0

To ma ktoś te source? Bo niestety napisane przez Frubi nie działają. ; /

0

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ś?

0

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
 
0

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ć.

0

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

0

Może ktoś jeszcze ma te sources i mógł by je wysłać? :)

0

Chyba o te chodzi

0

Dziękuje :)
(i sorki za odkop)

1 użytkowników online, w tym zalogowanych: 0, gości: 1