24. november 2005 - 17:36Der 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.
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.
Jeg kan ikke lige finde noget godt på siden netbsd.org ?
Slet ikke nogle gode links eller bøger ?
Synes godt om
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
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
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 ?
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.
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
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 ?
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
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.
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.
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 ?
"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.
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 ?
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).
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 ?
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"
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 ?
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).
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
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?
; 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
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
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)
ok det kigger jeg på...nu skal du få fred for mine spørgsmål :D
og igen TUSIND tak for hjælpen.
Synes godt om
Slettet bruger
14. august 2006 - 21:48#51
Bliver det til noget?
Synes godt om
Ny brugerNybegynder
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.