Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[asm] Bootloader wywala

Ostatnio zmodyfikowano 2012-10-29 19:50
Autor Wiadomość
bingo009
Temat założony przez niniejszego użytkownika
» 2012-10-27 18:25:36
Ja czytałem kursy programowania OS, potem poczytałem trochę o trybie rzeczywistym, następnie poduczyłem się Asma i tak pewnego dnia usiadłem i napisałem taki bardzo prosty i prymitywny system(klon DOS'a z jedną komendą). Jeśli chodzi o narzędzia, to wziąłem je z kursu(jest tam prosty linker, który umieszcza bootloader na pierwszym sektorze i kernel na drugim, czyli tworzy obraz dysku). A oto lektury:
http://pl.wikibooks.org/wiki/Pisanie_OS/Ok%C5%82adka - bardzo dobry kurs, który objaśnia wszystko, ale autor używa w nim GRUB'a
http://4programmers.net/OS_Programming/Pisanie_system%C3%B3w_operacyjnych_-_tryb_rzeczywisty - prosty kurs tworzenia OS(stamtąd wziąłem ten linker)
http://cc-team.org/index.php?name=artykuly&show=189 - kurs pisania bootloadera, jest tam opis linji A20, przechodzenie w PMode

Wystarczy pokazać funkcje przerwań trybu rzeczywistego i można działać. Pisanie OS w trybie rzeczywistym na przerwaniach nie jest jakoś specjalnie skomplikowane, ale to nie znaczy, że jest proste. Gorzej jest w trybie chronionym, do którego zamierzam przejść niedługo. A co do Bochs'a, to używam obrazu dyskietki. Biorę plik utworzony przez ten linker, używam programu Virtual Floppy Driver, aby stworzyć wirtualną stację dyskietek B:(na czystym obrazie dyskietki, można go utworzyć programem bximage dołączonym do Bochs'a, należy zamontować ten plik) i następnie nagrywam RaWrite'm obraz dysku na wirtualną dyskietkę i za pomocą Bochs'a uruchamiam ją. Tutaj mój plik uruchomieniowy:

# no floppyb
ata0: enabled=0
ata0-master: type=disk, mode=growing, translation=auto, path="F:\Pliki Kamila\Bochs\MSDOS.img", cylinders=166, heads=16, spt=63, biosdetect=auto, model="Generic 1234"
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0
ata3: enabled=0
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=5
cpu: count=1, ips=4000000, model=bx_generic, reset_on_triple_fault=1, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
cpuid: family=6, model=0x03, stepping=3, mmx=1, apic=xapic, sse=sse2, sse4a=0, sep=1, aes=0, xsave=0, xsaveopt=0, movbe=0, adx=0, smep=0, x86_64=1, 1g_pages=0, pcid=0, fsgsbase=0, mwait=1
cpuid: vendor_string="GenuineIntel"
cpuid: brand_string="              Intel(R) Pentium(R) 4 CPU        "

print_timestamps: enabled=0
port_e9_hack: enabled=0
private_colormap: enabled=0
clock: sync=slowdown, time0=local, rtc_sync=0
# no cmosimage
# no loader
log: -
logprefix: %t%e%d
panic: action=ask
error: action=report
info: action=report
debug: action=ignore
keyboard: type=mf, serial_delay=250, paste_delay=100000, keymap=
user_shortcut: keys=none
mouse: enabled=0, type=ps2, toggle=ctrl+mbutton
parport1: enabled=1, file=""
parport2: enabled=0
com1: enabled=1, mode=null, dev=""
com2: enabled=0
com3: enabled=0
com4: enabled=0
P-67694
crash
» 2012-10-28 01:30:41
Jak skonfigurowałeś bochs'a, jak go odpalasz z przekazanym bootloaderem, tzn jakimi komendami :)

PS: mówiłem że kod wrzucę, wrzucę za dnia wraz ze swoim tematem
P-67778
bingo009
Temat założony przez niniejszego użytkownika
» 2012-10-29 19:50:03
Jeśli chodzi o bootloader, to najprostszy szkielet wygląda tak:

org 07C0h ;bootloader zostaje umieszczony przez bios w segmencie 0000h:07C0h

boot:
;tutaj kod
jmp boot ;Nieskonczona petla, aby procek nie powedrowal w sina dal

times 510-($-$$) db 0 ;to musi byc na koncu, dopelniamy bootloader 0, aby zajmowal dokladnie 510b
dw AA55h ;2 ostatnie bajty, musza wynosic AA55h, jest to znacznik bootloadera

Taki bootloader nagrywamy RaWrite'm na dyskietkę(traktując go jako obraz) i mamy swój bootloader. Bootloader piszemy jak zwykły program(oczywiście nie ma czegoś takigo, jak przerwanie 21h, mamy np.10h, tryb 13h itp.).
P-67951
1 « 2 »
Poprzednia strona Strona 2 z 2