*UNDER CONSTRUCTION*
Beste GoT'ters,
Dit topic gaat over hoe een OS in elkaar zit en we gaan er ook zelf een maken. Ik hoop dat er veel mensen geïntresseerd zijn in dit topic. Hierbij dank ik alle GoT'ters die me helpen oa PrisonerOfPain
Allereerst neem ik aan dat je x86 assembler kent.
Een paar tutorials:
The Art Of Assembly Raad ik ten strengste aan als je niet in asm kan programmeren.
Programmers Heaven
Verder heb je de Intel docs nodig om te leren hoe een x86-omgeveing werkt:
AsmHelp - Met alle opcodes en schema over de x86 processor famillie
IntelDocs
Articles
Verder heb je natuurlijk een assembler nodig. Wij gaan nasm gebruiken:
Nasm - officiele site
Een programma om je bootloader op diskette te zetten:
Rawrite Als je een referrer error krijgt moet je ff googlen
En natuurlijk een emulator, want we hebben geen zin om telkens de pc opnieuw op te starten wanneer we iets willen proberen
:
Bochs
Als je alles hebt dan kunnen we aan de slag. Ik ga voortborduren op dit topic:
[rml][ tutorial] how to write your own OS[/rml]
We gaan dus een OS schrijven. Wat? Een Operating System, oftewel in plain dutch: besturingssysteem
Voorbeelden zijn Dos, Windows, Linux, BeOS enz, enz...
(Er komen veel stukken uit het topic van JayTaph, ik heb zijn toestemming niet kunnen vragen want zijn mailadres werkt niet. Als je er bezwaar tegen hebt, mail me aub
)
Bootstrapping:
--------------
Moeilijkheidsgraad: makkelijk
Voorkennis: matige i386 assembly
Referenties: zie links hierboven
Tools: bochs, rawrite, nasm
Bootstrapping is het process dat gestart wordt als je je computer hebt aangezet en nadat de BIOS zijn tests heeft uitgevoerd (de zogenaamde POST - power on self test). Je BIOS laadt vanaf de boot-drive 1 sector (512 bytes) in zijn geheugen en springt naar dat stukje code. Dat stukje code zorgt voor het laden van de rest van het OS (of voor andere dingen, zoals het verzorgen voor virussen of spelletjes als tetris). De sector van de schijf waarop dit stukje code staat heet de bootsector en staat per definitie op de eerste sector (sector 1) van de schijf.
Op een harddisk kun je meestal meerdere partities kwijt, met elk een eigen bootsector. Hierdoor kan de bootsector van partitie 2 nooit op de eerste sector van de schijf staan (omdat hier al de bootsector van partitie 1 staat). Om dit op te lossen staat op de eerste sector van een harddisk meestal geen bootsector, maar een master boot record (MBR). Dit is ook een stuk code dat wordt ingeladen door de bios, maar bevat extra informatie over de partities op de schijf (de partitie table). Dit moet ook allemaal in 512 bytes gebeuren, dus een MBR heeft minder ruimte voor programma-code dan een bootsector.
Een MBR en bootsector worden allebei beeindigd door 0xAA55 op plaats 510. Dit is de bootsector terminator en je bios *KAN* (maar hoeft niet altijd) kijken of dit bestaat. Als het niet bestaat, dan kan je bios zeggen dat er geen legale bootsector is en stoppen met booten. Dit moet er dus altijd instaan wil je je OS laten booten op verschillende computers (en BIOS'en).
Ook kunnen sommige file-systemen kunnen in de bios een header zetten waarin gegevens staan over de schijf (volume naam, fat-type etc). Hiermee gaan we pas in het volgend hoofdstuk aan de gang. Hierdoor is het mogelijk om bijvoorbeeld je OS en de benodigde files te kopieren naar een normale DOS-floppy.
In dit hoofdstuk gaan we een bootsector maken die geen OS inlaad, maar wat text laat zien op het beeldscherm. We gaan op dit moment nog geen enge en moeilijke dingen doen zoals het inladen van sectoren etc. Als je geen assembly kent, dan worden sommige dingen hieronder al best pittig, maar ik probeer zoveel mogelijk uitleg te geven in wat ik doe, en als je er dan nog niet uitkomt, dan heb je altijd nog the gathering...
Het eerste wat we moeten weten is dat de bootsector normale, ruwe code is zonder headers (zoals exe-files). We weten dat de laatste 2 bytes van de code 0xAA55 moet zijn, en dat de code precies 512 bytes lang moet zijn (we kunnen heel makkelijk de code uitvullen met 00'tjes of NOP'jes).
We weten dat de bootsector door de BIOS geladen word op positie 0000:7C00 of 07C0:0000. Alletwee zijn mogelijk, dus moeten wij er zelf voor zorgen dat dit op elk systeem gelijk is.
Wat ook handig is, is dat de BIOS in het DL-register het ID van de drive laad waarvan we booten. Floppy drives beginnen bij 0: 00 is de A:, 01 is de B:, en harde schijven (fixed disks) beginnen bij 0x80: 80 is de C:, 81 de D: etc etc..
Hou er rekening mee dat wanneer je in de bootsector zit, je niet alles kunt gebruiken wat je normaal wel kunt. Je kunt niet alle interrupts die je wilt aanspreken, en dingen zoals de muis werken nog niet. Je moet dus zo minimaal mogelijk gebruik maken van interrupts, en zoveel mogelijk zelf doen (zover dat dat kan).
Nu krijgen we een hele simpele bootloader:
We beginnen bij het begin:
Vaste regels zijn:
; is commentaar teken (alles wat hierachter staat wordt niet gecompiled)
Regel 1: De naam van het bestand
Regel 2: Beschrijving van het progje
Regel 3: Leeg
Regel 4: dit is een label, je kan een label maken door een naam te typen gevolgd door een dubbele punt :
Regel 5: Dit is de eerste instrucite in ons progje, jmp komt komt van jump en het springt naar een ander deel van het progje, in dit geval naar ons label hang:
Regel 6: Leeg
Regel 7: Aangezien een bootloader 512 bytes moet zijn vullen we de rest van onze 512 bytes op met nullen
Regel 8: En aan het eind op plaats 510 komt de waarde AA55h zodat het bootable wordt (lees de bios het kan laden)
Sla dit op in hang.asm
compile hem met nasm:
nasmw hang.asm -o hang.bin
Nu moet je nog met rawrite de bootloader op diskette zetten:
rawrite
RaWrite 1.2 - Write disk file to raw floppy diskette
Enter source file name: hang.bin
Enter destination drive: a
Plaats nu een geformatteerde diskette in je floppydrive en druk op enter. Et Voilá, je eerste boot loader
Het enige wat het doet is in een oneindige loop zitten. In het volgende hoofdstuk gaan we daar verandering in brengen 
Natuurlijk kan je hang.bin ook gebruiken met bochs zodat je je pc niet opnieuw hoeft te starten. Je moet dan even in de configuratiebestand van bochs deze regel aanpassen:
floppya: 1_44=a.bin, status=inserted
veranderen in:
floppya: 1_44=hang.bin, status=inserted
en bochs opstarten.
Dit wordt nog bijgewerkt, dus aub geen commentaar op mijn startpost want hij's nog lang niet af
Prisoner Of Pain heeft nog wat leuke links opgezocht
FAQ's
http://www.mega-tokyo.com/os/os-faq.html
http://www.overwhelmed.org/shawn/faq.html
http://www.linuxgazette.com/issue82/raghu.html
http://osdev.neopages.net/tutorials/gettingstarted.php
http://phantom.urbis.net.il/bphantom/pmode-l_FAQ.html
http://www.codeguru.com/forum/showthread.php?threadid=260686
Tutorial's
http://www.acm.uiuc.edu/sigops/roll_your_own/
http://www.cse.unl.edu/~jgompert/OS/TableOfContents.htm
http://www.linuxgazette.com/issue79/krishnakumar.html
http://nocturnalnetwork.com/os.htm
http://osdev.neopages.net.../tutorial_01.php?the_id=8
http://www.delorie.com/dj...errupts/inthandlers1.html
http://www.delorie.com/dj...errupts/inthandlers2.html
http://webster.cs.ucr.edu/Page_asm/ArtOfAsm.html
http://www.osjournal.hopt...tion=viewfile&file=14
http://x86.ddj.com/articles/pmbasics/tspec_a1_doc.htm
http://membres.lycos.fr/placr/pmode/tutor.html
http://my.execpc.com/CE/AC/geezer/osd/cons/
http://www.alumni.caltech.edu/~pje/iso9660.html
http://www.programmershea...5/articles/article157.htm
http://www.opengroup.org/onlinepubs/007904975/toc.htm
http://osdev.neopages.net/tutorials.php?cat=0&sort=1
http://osdev.neopages.net/docs.php?cat=0&sort=1
http://www.wikipedia.org/wiki/FAT
http://alexfru.chat.ru/eindex.html
Link List's
http://www.azillionmonkeys.com/qed/os.html
http://directory.google.c...amming/Operating_Systems/
http://www.geocities.com/SiliconValley/Park/9784/tut.html
http://www.osdev.org/links.jsp
http://my.execpc.com/~geezer/os/
http://aarongray.members....ks/operating-systems.html
http://akson.sgh.waw.pl/~bart/tinos-links.html
http://l4ka.org/publications/
http://aarongray.members.beeb.net/OSPrimer.html
http://www.cmcrossroads.com/bradapp/links/os-links.html
De Interrupt list
http://www.ctyme.com/rbrown.htm
Source voorbeelden
http://newos.sourceforge.net/download.php
http://my.execpc.com/~geezer/osd/boot/a20.asm
http://www.nondot.org/sabre/os/files/Booting/nasmBoot.txt
http://www.alumni.caltech.edu/~pje/rdcf2.txt
http://www.nondot.org/sabre/os/articles
http://my.execpc.com/CE/AC/geezer/osd/
http://my.execpc.com/CE/AC/geezer/os/
Linux
http://linux.ctyme.com/
http://www.kernelhacking.org/docs/kernelhacking-HOWTO/
http://www.kernel.org/pub/linux/kernel/v1.0/
http://members.lycos.nl/oguzdiary/linux-0.01.tar.bz2
Overige Os'en
http://www.cybertrails.com/~fys/fysos.htm
http://www.groovyweb.uklinux.net/index.php?page_name=easyos
http://ansanest.com/josh/
http://users.rcn.com/eaj.pizzi/pizzios/index.html
http://www.theosfiles.com/general/osf_other_sites.htm
http://alexfru.narod.ru/
http://tunes.org/Review/OSes.html
http://www.cse.ogi.edu/DISC/projects/synthetix/related.html
http://www.uw-pc.com/os.html
http://minnie.tuhs.org/UnixTree/
FAT
http://home.no.net/tkos/info/fat.html
http://www.microsoft.com/whdc/hwdev/hardware/fatgendown.mspx
EXT2
http://www.nongnu.org/ext2-doc/
http://uranus.it.swin.edu.au/~jn/explore2fs/es2fs.htm
Geschiedenis
http://www.dei.isep.ipp.pt/docs/unix.html
http://cm.bell-labs.com/cm/cs/who/dmr/hist.html
http://cm.bell-labs.com/cm/cs/who/dmr/cacm.html
Intel Specs
http://x86.ddj.com/intel.doc/inteldocs.htm
http://x86.ddj.com/articles/articles.htm
Newsgroups
alt.os.development
comp.os.linux.development.system
linux.kernel
Als iemand dr meer heeft lijkt het me handig om ze dr gewoon bij te zetten, zodat het niet onoverzichtelijk wordt
Beste GoT'ters,
Dit topic gaat over hoe een OS in elkaar zit en we gaan er ook zelf een maken. Ik hoop dat er veel mensen geïntresseerd zijn in dit topic. Hierbij dank ik alle GoT'ters die me helpen oa PrisonerOfPain
Allereerst neem ik aan dat je x86 assembler kent.
Een paar tutorials:
The Art Of Assembly Raad ik ten strengste aan als je niet in asm kan programmeren.
Programmers Heaven
Verder heb je de Intel docs nodig om te leren hoe een x86-omgeveing werkt:
AsmHelp - Met alle opcodes en schema over de x86 processor famillie
IntelDocs
Articles
Verder heb je natuurlijk een assembler nodig. Wij gaan nasm gebruiken:
Nasm - officiele site
Een programma om je bootloader op diskette te zetten:
Rawrite Als je een referrer error krijgt moet je ff googlen
En natuurlijk een emulator, want we hebben geen zin om telkens de pc opnieuw op te starten wanneer we iets willen proberen
Bochs
Als je alles hebt dan kunnen we aan de slag. Ik ga voortborduren op dit topic:
[rml][ tutorial] how to write your own OS[/rml]
We gaan dus een OS schrijven. Wat? Een Operating System, oftewel in plain dutch: besturingssysteem
(Er komen veel stukken uit het topic van JayTaph, ik heb zijn toestemming niet kunnen vragen want zijn mailadres werkt niet. Als je er bezwaar tegen hebt, mail me aub
Bootstrapping:
--------------
Moeilijkheidsgraad: makkelijk
Voorkennis: matige i386 assembly
Referenties: zie links hierboven
Tools: bochs, rawrite, nasm
Bootstrapping is het process dat gestart wordt als je je computer hebt aangezet en nadat de BIOS zijn tests heeft uitgevoerd (de zogenaamde POST - power on self test). Je BIOS laadt vanaf de boot-drive 1 sector (512 bytes) in zijn geheugen en springt naar dat stukje code. Dat stukje code zorgt voor het laden van de rest van het OS (of voor andere dingen, zoals het verzorgen voor virussen of spelletjes als tetris). De sector van de schijf waarop dit stukje code staat heet de bootsector en staat per definitie op de eerste sector (sector 1) van de schijf.
Op een harddisk kun je meestal meerdere partities kwijt, met elk een eigen bootsector. Hierdoor kan de bootsector van partitie 2 nooit op de eerste sector van de schijf staan (omdat hier al de bootsector van partitie 1 staat). Om dit op te lossen staat op de eerste sector van een harddisk meestal geen bootsector, maar een master boot record (MBR). Dit is ook een stuk code dat wordt ingeladen door de bios, maar bevat extra informatie over de partities op de schijf (de partitie table). Dit moet ook allemaal in 512 bytes gebeuren, dus een MBR heeft minder ruimte voor programma-code dan een bootsector.
Een MBR en bootsector worden allebei beeindigd door 0xAA55 op plaats 510. Dit is de bootsector terminator en je bios *KAN* (maar hoeft niet altijd) kijken of dit bestaat. Als het niet bestaat, dan kan je bios zeggen dat er geen legale bootsector is en stoppen met booten. Dit moet er dus altijd instaan wil je je OS laten booten op verschillende computers (en BIOS'en).
Ook kunnen sommige file-systemen kunnen in de bios een header zetten waarin gegevens staan over de schijf (volume naam, fat-type etc). Hiermee gaan we pas in het volgend hoofdstuk aan de gang. Hierdoor is het mogelijk om bijvoorbeeld je OS en de benodigde files te kopieren naar een normale DOS-floppy.
In dit hoofdstuk gaan we een bootsector maken die geen OS inlaad, maar wat text laat zien op het beeldscherm. We gaan op dit moment nog geen enge en moeilijke dingen doen zoals het inladen van sectoren etc. Als je geen assembly kent, dan worden sommige dingen hieronder al best pittig, maar ik probeer zoveel mogelijk uitleg te geven in wat ik doe, en als je er dan nog niet uitkomt, dan heb je altijd nog the gathering...
Het eerste wat we moeten weten is dat de bootsector normale, ruwe code is zonder headers (zoals exe-files). We weten dat de laatste 2 bytes van de code 0xAA55 moet zijn, en dat de code precies 512 bytes lang moet zijn (we kunnen heel makkelijk de code uitvullen met 00'tjes of NOP'jes).
We weten dat de bootsector door de BIOS geladen word op positie 0000:7C00 of 07C0:0000. Alletwee zijn mogelijk, dus moeten wij er zelf voor zorgen dat dit op elk systeem gelijk is.
Wat ook handig is, is dat de BIOS in het DL-register het ID van de drive laad waarvan we booten. Floppy drives beginnen bij 0: 00 is de A:, 01 is de B:, en harde schijven (fixed disks) beginnen bij 0x80: 80 is de C:, 81 de D: etc etc..
Hou er rekening mee dat wanneer je in de bootsector zit, je niet alles kunt gebruiken wat je normaal wel kunt. Je kunt niet alle interrupts die je wilt aanspreken, en dingen zoals de muis werken nog niet. Je moet dus zo minimaal mogelijk gebruik maken van interrupts, en zoveel mogelijk zelf doen (zover dat dat kan).
Nu krijgen we een hele simpele bootloader:
code:
1
2
3
4
5
6
7
8
| ; HANG.ASM ; Een minimale bootstrap! hang: ; Hang! jmp hang times 510-($-$$) db 0 ; Vul het bestand met nullen dw 0AA55h ; Eindig het bestand met AA55 |
We beginnen bij het begin:
Vaste regels zijn:
; is commentaar teken (alles wat hierachter staat wordt niet gecompiled)
Regel 1: De naam van het bestand
Regel 2: Beschrijving van het progje
Regel 3: Leeg
Regel 4: dit is een label, je kan een label maken door een naam te typen gevolgd door een dubbele punt :
Regel 5: Dit is de eerste instrucite in ons progje, jmp komt komt van jump en het springt naar een ander deel van het progje, in dit geval naar ons label hang:
Regel 6: Leeg
Regel 7: Aangezien een bootloader 512 bytes moet zijn vullen we de rest van onze 512 bytes op met nullen
Regel 8: En aan het eind op plaats 510 komt de waarde AA55h zodat het bootable wordt (lees de bios het kan laden)
Sla dit op in hang.asm
compile hem met nasm:
nasmw hang.asm -o hang.bin
Nu moet je nog met rawrite de bootloader op diskette zetten:
rawrite
RaWrite 1.2 - Write disk file to raw floppy diskette
Enter source file name: hang.bin
Enter destination drive: a
Plaats nu een geformatteerde diskette in je floppydrive en druk op enter. Et Voilá, je eerste boot loader
Natuurlijk kan je hang.bin ook gebruiken met bochs zodat je je pc niet opnieuw hoeft te starten. Je moet dan even in de configuratiebestand van bochs deze regel aanpassen:
floppya: 1_44=a.bin, status=inserted
veranderen in:
floppya: 1_44=hang.bin, status=inserted
en bochs opstarten.
Dit wordt nog bijgewerkt, dus aub geen commentaar op mijn startpost want hij's nog lang niet af
Prisoner Of Pain heeft nog wat leuke links opgezocht
FAQ's
http://www.mega-tokyo.com/os/os-faq.html
http://www.overwhelmed.org/shawn/faq.html
http://www.linuxgazette.com/issue82/raghu.html
http://osdev.neopages.net/tutorials/gettingstarted.php
http://phantom.urbis.net.il/bphantom/pmode-l_FAQ.html
http://www.codeguru.com/forum/showthread.php?threadid=260686
Tutorial's
http://www.acm.uiuc.edu/sigops/roll_your_own/
http://www.cse.unl.edu/~jgompert/OS/TableOfContents.htm
http://www.linuxgazette.com/issue79/krishnakumar.html
http://nocturnalnetwork.com/os.htm
http://osdev.neopages.net.../tutorial_01.php?the_id=8
http://www.delorie.com/dj...errupts/inthandlers1.html
http://www.delorie.com/dj...errupts/inthandlers2.html
http://webster.cs.ucr.edu/Page_asm/ArtOfAsm.html
http://www.osjournal.hopt...tion=viewfile&file=14
http://x86.ddj.com/articles/pmbasics/tspec_a1_doc.htm
http://membres.lycos.fr/placr/pmode/tutor.html
http://my.execpc.com/CE/AC/geezer/osd/cons/
http://www.alumni.caltech.edu/~pje/iso9660.html
http://www.programmershea...5/articles/article157.htm
http://www.opengroup.org/onlinepubs/007904975/toc.htm
http://osdev.neopages.net/tutorials.php?cat=0&sort=1
http://osdev.neopages.net/docs.php?cat=0&sort=1
http://www.wikipedia.org/wiki/FAT
http://alexfru.chat.ru/eindex.html
Link List's
http://www.azillionmonkeys.com/qed/os.html
http://directory.google.c...amming/Operating_Systems/
http://www.geocities.com/SiliconValley/Park/9784/tut.html
http://www.osdev.org/links.jsp
http://my.execpc.com/~geezer/os/
http://aarongray.members....ks/operating-systems.html
http://akson.sgh.waw.pl/~bart/tinos-links.html
http://l4ka.org/publications/
http://aarongray.members.beeb.net/OSPrimer.html
http://www.cmcrossroads.com/bradapp/links/os-links.html
De Interrupt list
http://www.ctyme.com/rbrown.htm
Source voorbeelden
http://newos.sourceforge.net/download.php
http://my.execpc.com/~geezer/osd/boot/a20.asm
http://www.nondot.org/sabre/os/files/Booting/nasmBoot.txt
http://www.alumni.caltech.edu/~pje/rdcf2.txt
http://www.nondot.org/sabre/os/articles
http://my.execpc.com/CE/AC/geezer/osd/
http://my.execpc.com/CE/AC/geezer/os/
Linux
http://linux.ctyme.com/
http://www.kernelhacking.org/docs/kernelhacking-HOWTO/
http://www.kernel.org/pub/linux/kernel/v1.0/
http://members.lycos.nl/oguzdiary/linux-0.01.tar.bz2
Overige Os'en
http://www.cybertrails.com/~fys/fysos.htm
http://www.groovyweb.uklinux.net/index.php?page_name=easyos
http://ansanest.com/josh/
http://users.rcn.com/eaj.pizzi/pizzios/index.html
http://www.theosfiles.com/general/osf_other_sites.htm
http://alexfru.narod.ru/
http://tunes.org/Review/OSes.html
http://www.cse.ogi.edu/DISC/projects/synthetix/related.html
http://www.uw-pc.com/os.html
http://minnie.tuhs.org/UnixTree/
FAT
http://home.no.net/tkos/info/fat.html
http://www.microsoft.com/whdc/hwdev/hardware/fatgendown.mspx
EXT2
http://www.nongnu.org/ext2-doc/
http://uranus.it.swin.edu.au/~jn/explore2fs/es2fs.htm
Geschiedenis
http://www.dei.isep.ipp.pt/docs/unix.html
http://cm.bell-labs.com/cm/cs/who/dmr/hist.html
http://cm.bell-labs.com/cm/cs/who/dmr/cacm.html
Intel Specs
http://x86.ddj.com/intel.doc/inteldocs.htm
http://x86.ddj.com/articles/articles.htm
Newsgroups
alt.os.development
comp.os.linux.development.system
linux.kernel
Als iemand dr meer heeft lijkt het me handig om ze dr gewoon bij te zetten, zodat het niet onoverzichtelijk wordt
[ Voor 233% gewijzigd door Oguz286 op 02-09-2003 18:56 ]