Avatar billede datasource Nybegynder
24. november 2005 - 17:36 Der er 48 kommentarer og
3 løsninger

Styresystem i C ?

Hej eksperter.

Jeg har programmeret i C i et godt stykke tid nu, og nu vil jeg gerne videre.
Jeg har tænkt på at skrive mit eget OS, men jeg aner ikke noget om hvordan, og hvor jeg skal starte. Er der nogle der kunne beskrive kort, hvordan det fungere ?

Jeg ved at man skal skrive en kernel, men så heller ikke mere.

Evt nogle der har nogle gode guides eller bøger ?

PS. Jeg aner ingen ting om det, kun om C.
Avatar billede james_t_dk Juniormester
24. november 2005 - 17:46 #1
bare en tanke.

Hvorfor kikker du ikke på Linux og eventuelt bruger dine evner til at hjælpe med at forbedre en eksisterende Kernel og alt det der ligger omkring en kernel.

Hvis du laver dit eget styrresystem fra bunden af skal du jo også selv lave alle de programmer der skal bruges til.
Avatar billede james_t_dk Juniormester
24. november 2005 - 17:50 #2
Måske du skal starte med at kikke her: http://kernelnewbies.org/
Avatar billede datasource Nybegynder
24. november 2005 - 17:57 #3
Jeg havde sandelig ikke tænkt mig at lave et grafisk styresystem, med vinduer osv.
Det skal bare være lidt ligesom DOS !
Avatar billede datasource Nybegynder
24. november 2005 - 18:25 #4
Ikke nogen der kan beskrive det bare meget kort. Eller nogle gode links/bøger ?
Avatar billede Slettet bruger
24. november 2005 - 18:54 #5
Check NetBSD www.netbsd.org er et rigtigt godt sted at starte
Avatar billede datasource Nybegynder
24. november 2005 - 19:15 #6
Jeg kan ikke lige finde noget godt på siden netbsd.org ?

Slet ikke nogle gode links eller bøger ?
Avatar billede Slettet bruger
25. november 2005 - 08:00 #7
Det er bare et OS, som du kunne bruge til inspiration hvis du ville se lidt omkring rækkeviden af det projekt du påtænker.

En årsag til at kigge på BSD'er istedet for Linux er at her set du et helt OS og ikke blot kernen (bevars du kan kigge på en sigen distro af en Linux og så et helt OS) der er bare mere konsistens i BSD'erne specielt til dit formål, IMHO
Avatar billede conrad Nybegynder
25. november 2005 - 08:18 #8
Jeg havde engang et kursus hvor vi "legede" med MINIX. Det er et lille OS, vist nok skrevet af TanenBaum, som er forholdsvis overskueligt. Det er nogle år siden, så jeg skal ikke kunne sige om det er vokset. Det kom med bogen "Operating Systems Design and Implementation" af Andrew S. Tanenbaum og Albert S.Woodhull, som i øvrigt er glimrende
Avatar billede dgydesen Nybegynder
25. november 2005 - 08:32 #9
Du kan prøve at se http://www.openbg.net/sto/os/
Avatar billede datasource Nybegynder
26. november 2005 - 01:19 #10
Jo det er da nogle udemærkede links, men jeg kommer bare til at kigge på noget jeg overhovedet ikke forstår.
Findes der ikke nogen guide på internettet eller en god bog ?
Avatar billede bertelbrander Novice
26. november 2005 - 01:38 #11
Jeg tvivler på at du finder en guide der i 12 lette trin lærer dig at lave et OS. At lave et OS er kompliceret.
Start med at lære noget assembler, det er nødvendigt for at lave et OS.
Derpå skal du have fundet en assembler der kan lave standalone programmer, det er programmer der ikke kræver noget OS, og for en intel PC er det også et program hvor code og data max kan fylde 64 kbyte (når du har lært noget assembler forstår du hvorfor). Normalt bruger man nasm, til dette.
Så putter du dette program ned på boot-sektoren på en floppy-disk som du så booter PC'en på. Når du har fået dette program til at skrive "Hello World" på skærmen har du nået langt (husk der er ingen printf før du har lavet den). De første programmer du laver vil skrive til skærmen ved at skrive til nogle faste addresse og/eller ved at generere nogle interrupts.
Avatar billede datasource Nybegynder
26. november 2005 - 02:23 #12
se det var noget jeg kunne bruge bertelbrander. Nu ved jeg ikke helt men når du siger at jeg skal starte med lidt assembler mener du så at jeg skal lære det totalt fra bunden eller kan jeg nøjes med at lære det jeg skal bruge ?
Evt nogle gode bøger om det ?
Hvordan laver jeg det standalone program i assembler når jeg ikke ved hvordan jeg gør ? :P
Avatar billede datasource Nybegynder
26. november 2005 - 02:31 #13
og når man skriver et styresystem, skal men så skrive drivere til hvert enkelt stykke hardware altså fx hvis systemet skal fungere med et nvidia g-kort så en driver til den og hvis et ati så skal man lave en driver til den ?
Avatar billede bertelbrander Novice
26. november 2005 - 02:34 #14
Jeg vil mene at du skal starte med at studere assembler grundigt, for det får du brug for.
Du skal også sætte dig ind i interrupts, for de bruges til at styre hardwaren, f.ex. læse fra tastatur. Læs og forstå f.ex: http://www.ctyme.com/rbrown.htm

Når du skal lave dit første del af din OS skal du bruge:
http://sourceforge.net/projects/nasm

Men til at eksperimentere og lære om assembler og interrupts kunne en gammel TurboC++ fra borland bruges, eller bedre version 3.1 hvis du kan finde den.
Avatar billede bertelbrander Novice
26. november 2005 - 02:37 #15
Og ja, du skal lave en driver for hvert grafikkort, eller finde en metode så dit OS kan bruge en Linux eller Windows driver, hvis du vil bruge de lidt mere avancerede features på kortet

Men der går mindst et år inden du behøver at bekymre dig om hvilket grafikkort du bruger, til det grundlæggende (tekst mode og vga mode) er grafikkort ens.
Avatar billede datasource Nybegynder
26. november 2005 - 02:55 #16
Ok jeg har fundet lidt litteratur på forskellige sider og bibliotek. Men nogle af dem har en titel der indeholder ordet Embedded System. Hvad er det ? Er det det samme som OS ?
Avatar billede james_t_dk Juniormester
26. november 2005 - 08:02 #17
Et embedded system er normalt et styrresystem, der afvikles fra en chip. Det er ikke nødvendigvis et styrresystem der viser noget på en skærm.
Avatar billede datasource Nybegynder
26. november 2005 - 13:44 #18
Hedder den der første del af et OS noget specielt, og findes der noget om hvordan man laver sådanen og får den ned nå bootsektoren af en floppy-disk ?

Læg et svar bertelbrander !
Avatar billede datasource Nybegynder
26. november 2005 - 13:46 #19
Er det den såkaldte kernel, og hvad er en kernel forresten og hvornår kommer den ind i billedet ? :D
Avatar billede bertelbrander Novice
26. november 2005 - 15:19 #20
"Embedded System" system er normal noget der kører på mindre, lukkede platforme, f.ex. en mobil telefon eller en vaskemaskine.

Den første del af OS'et, dvs. den del der starter, kaldes også en boot loader, da den afvikles ved boot (opstart) og loader det "rigtige" system.

Kernel er det mest centrale i et OS, det er lidt flydende hvad man kalder kernel, men normalt er memory-håndtering og taskswitching en del af kernel, at skrive til skærmen i grafik mode er ikke.

Jeg samler ikke på point.
Avatar billede datasource Nybegynder
26. november 2005 - 16:08 #21
ok hvem skal så have pointene ?
Avatar billede datasource Nybegynder
26. november 2005 - 16:09 #22
men jeg går ud fra at du samler på meget god karma ;)
Avatar billede datasource Nybegynder
26. november 2005 - 17:30 #23
når jeg har skrevet den boot loader og har den i .asm, hvordan får jeg den så ned på en diskette ?
og skal den først kompileres ? - med hvad og hvordan ?
Avatar billede bertelbrander Novice
26. november 2005 - 17:37 #24
Du oversætter assembler koden med nasm, men du skal også bruge en linker.
Jeg tror at du skal google lidt for at finde en, og også for at finde ud af hvordan du får koden ned på boot-sektorern. Jeg kan godt prøve at søge lidt når jeg får tid i aften.
(Så vidt jeg ved kan man på nyere PC'er også boot fra en usb-stick).
Avatar billede datasource Nybegynder
26. november 2005 - 19:23 #25
nu har jeg fundet denne super side:
http://www.osdever.net/tutorials.php?cat=0&sort=1
med en masse gode guides.

Jeg mangler bare noget forklaring med at få min asm fil til det såkaldte bin (binære) fil !
og hvilke stykker software jeg skal bruge, om i evt kunne anbefale nogle ?
Avatar billede datasource Nybegynder
26. november 2005 - 19:36 #26
hvilken af disse nasm skal jeg bruge:
http://www.osdever.net/downloads.php
Avatar billede bertelbrander Novice
26. november 2005 - 19:52 #27
Det må være denne: "Nasm 0.98.35 for Windows(ZIP, 218KB)"
Og så denne C compiler: "DJGPP bin utils with ELF support(3MB)."
Og så ville jeg nok kikke på "Cottontail Bootloader"
Avatar billede datasource Nybegynder
26. november 2005 - 20:10 #28
ok jeg siger mange gange tak, nu vil jeg gå igang med at læse.
Jeg bliver nok ikke færdig før om lang lang tid.
når jeg gør vil jeg lægge den (inkl kildekode) op på min side www.datasource.frac.dk

Du er HELT sikker på at du ikke vil have points ? Jeg aner ikke hvem der skal have pointene ?
Avatar billede bertelbrander Novice
26. november 2005 - 20:18 #29
Ja, jeg er helt sikker på at jeg ikke vil have point.

Der er et par andre der har deltaget, jeg synes at du skal give dem (nogle af) pointene (, du kan tage nogen af pointene tilbage ved at lave et svar selv, og accpetere det).
Avatar billede datasource Nybegynder
26. november 2005 - 20:28 #30
ok jeg håber det er iorden at jeg tager nogle af pointene selv
Avatar billede datasource Nybegynder
26. november 2005 - 20:29 #31
så deler jeg pointene mellem mig og james_t_dk da jeg synes han også har skrevet noget brugbart.
Avatar billede datasource Nybegynder
26. november 2005 - 20:30 #32
og tusind tak for svarene !
Avatar billede datasource Nybegynder
26. november 2005 - 23:40 #33
lige EN ting til..
nu har jeg fået min bootloader (downloadet) ned på en diskette og bootet fra den, og det lykkedes !

Hvordan clearer jeg skærmen ?

Hvordan skal jeg ligge min kernel ned på disketten ?
Avatar billede bertelbrander Novice
26. november 2005 - 23:55 #34
Nu er vi ude i noget jeg ikke er helt sikker på, men:

I readme.txt for bootloaderen (cuttontail) står der:
The 1st stage bootloader is written entirely in assembly and simply looks for the file "CBL.BIN" in the drive's root directory. When it find it, it loads it beginning at 0:0800, then jumps to it. The second stage bootloader then begins to execute.

Som jeg forstår det er cuttontail en 1. stage boot loader, og du laver så 2. stage bootloader, der således skal hedder cbl.bin og der er blot en fil på samme disk som cuttontail.

Med hensyn til at cleare skærmen; det kan gøres på to måder, ved at fylde skærmen med space i ens farver, eller med et interrupt, se f.ex: http://www.ctyme.com/rbrown.htm
Avatar billede datasource Nybegynder
26. november 2005 - 23:58 #35
nu er det ikke cuttontail jeg bruger og jeg skriver Hello World i selve bootloaderen.
jeg kigger lige på det der interrupts !
Avatar billede datasource Nybegynder
27. november 2005 - 00:01 #36
ok jeg kan overhovedet ikke finde rundt i alle disse interrups og jeg aner ikke hvad jeg skal lede efter ?
Avatar billede bertelbrander Novice
27. november 2005 - 00:06 #37
Jeg sidder lige og studerer...
Så vidt jeg lige kan se er der ikke noget clear screen interrupt, du er nok nød til at scrolle skærmen, og så flytte cursoren til øverste venstre hjørne.

Hvordan skriver du Hello World?
Hvilken bootloader bruger du?
Avatar billede datasource Nybegynder
27. november 2005 - 00:10 #38
jeg bruger denne:

[BITS 16]      ; 16 bit code generation
[ORG 0x7C00]  ; Origin location

; Main program
main:        ; Label for the start of the main program

mov ax,0x0000    ; Setup the Data Segment register
        ; Location of data is DS:Offset
mov ds,ax    ; This can not be loaded directly it has to be in two steps.
        ; 'mov ds, 0x0000' will NOT work due to limitations on the CPU

        xor  dx,dx
      xor  bh,bh
      mov  ah,2
      int  10h    ; clear screen

mov si, HelloWorld    ; Load the string into position for the procedure.
call PutStr    ; Call/start the procedure

jmp $        ; Never ending loop

; Procedures
PutStr:        ; Procedure label/start
; Set up the registers for the interrupt call
mov ah,0x0E    ; The function to display a chacter (teletype)
mov bh,0x00    ; Page number
mov bl,0x07    ; Normal text attribute

.nextchar    ; Internal label (needed to loop round for the next character)
lodsb        ; I think of this as LOaD String Block
        ; (Not sure if thats the real meaning though)
        ; Loads [SI] into AL and increases SI by one
; Check for end of string '0'
or al,al    ; Sets the zero flag if al = 0
        ; (OR outputs 0's where there is a zero bit in the register)
jz .return    ; If the zero flag has been set go to the end of the procedure.
        ; Zero flag gets set when an instruction returns 0 as the answer.
int 0x10    ; Run the BIOS video interrupt
jmp .nextchar    ; Loop back round tothe top
.return        ; Label at the end to jump to when complete
ret        ; Return to main program

; Data

HelloWorld db 'Hello World',13,10,0

; End Matter
times 510-($-$$) db 0    ; Fill the rest with zeros
dw 0xAA55        ; Boot loader signature
Avatar billede datasource Nybegynder
27. november 2005 - 00:10 #39
xor  dx,dx
xor  bh,bh
mov  ah,2
int  10h    ; clear screen

det virker fint nok men det sletter ikke den tekst der er.
Det skriver bare hello world oven på det gamle tekst :S
Avatar billede bertelbrander Novice
27. november 2005 - 00:17 #40
Jeg tror at det letteste er at skrive 25 tomme linier og så flytte cursoren til starten.

For at flytte cursor:
dl = x
dh = y
ah = 2
bh = 0
int 10

Men det er lettere at teste dette på PC under windows, det kan gøres men TurboC++ fra Borland.
Avatar billede datasource Nybegynder
27. november 2005 - 00:21 #41
ok det prøver jeg !
Avatar billede datasource Nybegynder
27. november 2005 - 00:22 #42
hvordan printer jeg 25 tomme linjer ? :P
Avatar billede bertelbrander Novice
27. november 2005 - 00:25 #43
På samme måde som du skriver Hello World, bare med 80 mellemrum.
Du kan forsøge at lave det i en loop.
Avatar billede datasource Nybegynder
27. november 2005 - 00:28 #44
ok men jeg får en fejl ved

dl = x
dh = y
ah = 2
bh = 0
int 10

?
Avatar billede bertelbrander Novice
27. november 2005 - 00:32 #45
Hvilke fejl? Du skal oversætte det til assembler, du kan se under PutStr: ca. hvordan
Prøv først med 1,1 (eller 0,0?)
(Og så er det måske på tide at lære assembler)
Avatar billede datasource Nybegynder
27. november 2005 - 00:37 #46
jo jeg har også været nede og hente 3 bøger på biblioteket så det er jeg snart igang med :P

jeg får flg fejl:

error: label or instruction exepted at start of line

og den fejl får jeg 5 gange !
Avatar billede bertelbrander Novice
27. november 2005 - 00:41 #47
Jeg vil tro at du kan bruge:
mov dl, 1
mov dh, 1
mov ah, 2
mov bh, 0
int 0x10

For at gå til 1,1 Jeg kan ikke huske om skærmen starter i 1,1 eller 0,0
Avatar billede datasource Nybegynder
27. november 2005 - 01:06 #48
tak det virker...en sidste ting inden bøgerne skal give mig svar på resten

hvis jeg nu har en kernel fx kernel.bin og jeg gerne vil have bootsector til at loade den, hvordan gør jeg så det ?
Avatar billede bertelbrander Novice
27. november 2005 - 01:10 #49
Du kunne kikke på cuttontail, der er (så vidt jeg kan se) netop det den gør.

(eller skal du kikke på hvordan man læser en sektor fra en disk, kopiere dette til en addresse i hukommelsen og så hoppe til den addresse.)
Avatar billede datasource Nybegynder
27. november 2005 - 01:12 #50
ok det kigger jeg på...nu skal du få fred for mine spørgsmål :D

og igen TUSIND tak for hjælpen.
Avatar billede Slettet bruger
14. august 2006 - 21:48 #51
Bliver det til noget?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester