Assembly 16-bit operativ system

Tags:    programmering

<< < 123 > >>
Hej allesammen!
Jeg har besluttet mig for at lave mit eget lille fritids 16-bit operativ system, der har en Assembly boot loader og en kernel som er udviklet i C.
Men jeg har to problemer: Jeg har lige skrevet koden til min C kernel, men jeg kommer lige i tanke om at jeg har slettet gcc.exe og ld.exe. Og jeg har virkelig svært ved at finde det nogen steder på Google. Så hvis nogen lige kunne give mig et link som giver adgang til disse to filer, ville det bare være super.
Mit andet problem er at jeg får en fejl når jeg assembler nedenstående program med NASM:
Fold kodeboks ind/udKode 

Dette var koden, og dette er fejlen:
Fold kodeboks ind/udKode 

Hvis der er nogen som kan hjælpe mig med disse to problemer, vil jeg være meget taknemmelig.
-På forhånd tak, for hjælpen :).



21 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 6 karma
Sorter efter stemmer Sorter efter dato
Du kan ikke bruge aout formatet. Første byte i filen skal være en instruktion. Prøv at disassemble den færdige fil og se, om den kan eksekveres fra første byte.
Fold kodeboks ind/udKode 


Derudover har du nok problemer med at tilgå hukommelsen som du gør i din C kode, for når maskinen booter er hukommelsen segmenteret. Du skal lave et skift til 32 bit flat memory model (http://en.wikipedia.org/wiki/Flat_memory_model). Man tag et kig på de to artikler, jer refererede til.

Hvorfor skulle jeg skifte til 32-bit flat memory model, når jeg programmerer et 16-bit operativ system? Jeg forstår heller ikke rigitgt hvorfor jeg skulle få problemer med min C kode.. det eneste kernel.c gør ind til videre er jo at fjerne og skrive bytes til min video hukommelse. Jeg har jo desværre heller ikke noget at disassemble da jeg ikke kan assemble bootloader.asm, pga. fejlen.
Men mange tak for dit engagement i mit problem :).



Du tilgår hukommelsen i en linear facon ved bruge af pointere:
Fold kodeboks ind/udKode 

Det er 32 bit flat memory kode.

16 bit kode kræver brugen af segment registre og et offset, hvilke du ikke rigtig kan modellere i C.

gcc kan ikke generere kode til segmented memory model.

Og by the way, så ligger videohukommelsen på 0xb800, ikke 0xb8000.

Her er den assembly kode som gcc genererer for print() funktionen:
Fold kodeboks ind/udKode 




By the way, så bliver koden fra din C fil aldrig indlæst af din bootloader. Maskinen indlæser jo kun den første sektor, og det er her din bootloader ligger. Dens ansvar er så at indlæse resten af systemet og eksekvere det.



By the way, så bliver koden fra din C fil aldrig indlæst af din bootloader. Maskinen indlæser jo kun den første sektor, og det er her din bootloader ligger. Dens ansvar er så at indlæse resten af systemet og eksekvere det.

Vil det sige, at min boot loader ikke kommer til at virke selv hvis jeg opklarer "org problemet" og linker mit C program og mit Assembly program sammen til en BIN fil som bliver kørt som en ISO af Microsoft Virtual Machine?



By the way, så bliver koden fra din C fil aldrig indlæst af din bootloader. Maskinen indlæser jo kun den første sektor, og det er her din bootloader ligger. Dens ansvar er så at indlæse resten af systemet og eksekvere det.

Vil det sige, at min boot loader ikke kommer til at virke selv hvis jeg opklarer "org problemet" og linker mit C program og mit Assembly program sammen til en BIN fil som bliver kørt som en ISO af Microsoft Virtual Machine?


Ja. Din bootloader skal indlæse nogle flere sektorer (som indeholder din kerne) og derefter springe til start rutinen.

Du kan jo også tage den "nemme" vej og se på, hvordan Grub og Lilo virker, og så bruge en af dem som bootloader.



By the way, så bliver koden fra din C fil aldrig indlæst af din bootloader. Maskinen indlæser jo kun den første sektor, og det er her din bootloader ligger. Dens ansvar er så at indlæse resten af systemet og eksekvere det.

Vil det sige, at min boot loader ikke kommer til at virke selv hvis jeg opklarer "org problemet" og linker mit C program og mit Assembly program sammen til en BIN fil som bliver kørt som en ISO af Microsoft Virtual Machine?


Ja. Din bootloader skal indlæse nogle flere sektorer (som indeholder din kerne) og derefter springe til start rutinen.

Du kan jo også tage den "nemme" vej og se på, hvordan Grub og Lilo virker, og så bruge en af dem som bootloader.

Ok tak.. jeg vil helst skrive alting selv da der ikke er nogen deadline til hvornår det skal være færdigt da det er et fritids projekt.
Men kunne du for eksempel vise mig noget kode som ville virke, så jeg kan studere og prøve at forstå det?



Anden artikel viser, hvordan man indlæser endnu en sektor og derefter springer dertil:

http://linuxgazette.net/issue79/krishnakumar.html

Men for at kunne bruge C kode bliver du nok nødt til at springe over i protected mode.



Anden artikel viser, hvordan man indlæser endnu en sektor og derefter springer dertil:

http://linuxgazette.net/issue79/krishnakumar.html

Men for at kunne bruge C kode bliver du nok nødt til at springe over i protected mode.

Mange tak for linket! :)
Desværre er denne tutorial jo for Linux, men jeg må jo bare finde ud af at 'converte' det til NASM :D.
Men mange tak for hjælpen.. jeg tror at vi kan sige at dette spørgsmål er løst. Jeg vil prøve at fordele point'ene så retfærdigt som muligt..



Han bruger skam også nasm som assembler og teorien er den samme.

Jeg bruger ikke points, så giv dem til en anden eller behold dem selv.



Indlæg senest redigeret d. 27.02.2010 20:04 af Bruger #2695
Han bruger skam også nasm som assembler og teorien er den samme.

Jeg bruger ikke points, så giv dem til en anden eller behold dem selv.

Er det på en anden side han bruger NASM for jeg kan ikke se nogle NASM eksempler på den side jeg kigger på nu..



Indlæg senest redigeret d. 27.02.2010 20:31 af Bruger #15718
<< < 123 > >>
t