Resource icon

Ein eigenes kleines Betriebssystem

sheel

I love Asm
Für Sourcecode verwendet man üblicherweise eine IDE.

Weils schon mehrere Fragen gegeben hat, kurz der Ablauf:
-Wie schon gesagt, Source in IDE schreiben.
-Mit Nasm in Binaries übersetzen, aber nicht linken (genauer Shellbefehl im Tut)
-Mit Rawrite etc. ein Img erstellen (oder für CDs ElTorrito (Iso9660 natürlich, aber kein Joliet))
-Mit einer VM-Software testen. Wenn "real" sein soll, Bootloader anpassen (GRUB sehr hilfreich)

...
Im Ernst: Bevor man sowas macht, sollte man einige Jahre programmiert haben.
Deiner Frage entnehme ich, dass du überhaupt keine Erfahrung hast.

Nach sehr langem Probieren schaffst du es ja vielleicht, das Beispiel hier lauffähig zu haben,
aber was dann? Du verstehst nichts und hast überhaupt nichts davon.
 
J

jonas XD

1. Danke für dir schnelle antwort

2. gibt es auch ne fortsetzung um sein sistem weiter zu entwickeln ?

jonas XD
 
U

Ueberdosis

Boot.asm
Code:
; ///////////////////////////////////////////////////
; ---------------------------------------------------
; // GARNIX - Operating System 
; // but more than nothing
; ---------------------------------------------------
; // Version:	0.00.01b
; // Author: 	Ueberdosis
; ---------------------------------------------------
; ///////////////////////////////////////////////////

; -----------------------------------------
; Assembler Syntax [IntelAsm] (!=GNUAsm)
; -----------------------------------------

; 	Syntax				Beschreibung

; Die Reihenfolge der Instruktionsparameter
;	mov b, a 	 		Kopiert a nach b
;	add b, a 			Addiert a auf b (Ergebnis in b)

; Konstanten und Registerkennzeichnung
;	mov reg, konst 		Kopiert Konstante konst in das Register reg
;	add reg, konst 		Addiert Konstante konst auf das Register reg

; Datentypsuffixe
;	mov bl, al 			Kopiert 1 Byte-Register (b=byte)
;	mov bx, ax 			Kopiert 2 Byte-Register (w=word)
;	mov ebx, eax 		Kopiert 4 Byte-Register (l=long)

; Komentare
;	; Kommentar 		Platziert ein Kommentar 

; -----------------------------------------
; GARNIX Bootloader
; -----------------------------------------

org 0x7C00  							; set up start address 

jmp 0x0000:start

start:
  ; setup a stack
  mov ax, 0x9000  						; address of the stack SS:SP
  mov ss, ax      						; SS = 0x9000 (stack segment)
  xor sp, sp      						; SP = 0x0000 (stack pointer)

  ; Segmentregister initialisieren (für Zugriff auf bootdrv notwendig)
  mov ax, 0x0000
  mov es, ax
  mov ds, ax

  mov [bootdrive], dl 					; boot drive from DL
  call load_kernel    					; load kernel
 
  ; Springe zu diesem Kernel
  mov ax, 0x1000 						; Die Adresse des Programms
  mov es, ax     						; Segmentregister updaten
  mov ds, ax
  jmp 0x1000:0x0000

; -------------------------------------------------
; GARNIX Variablen
; -------------------------------------------------

bootdrive db 0      					; boot drive
msg_load db "GARNIX wird geladen...", 0x0D, 0x0A, 0

; -------------------------------------------------
; GARNIX Funktionen
; -------------------------------------------------
 
; Stringausgabe
print_string:
  lodsb             					; grab a byte from SI
  or al, al         					; NUL?
  jz .done          					; if the result is zero, get out
  mov ah, 0x0E
  int 0x10          					; otherwise, print out the character!
  jmp print_string
  
  .done:
	ret
 
; read kernel from floppy disk
load_kernel:
  mov dl, [bootdrive] 					; select boot drive
  xor ax, ax         					; mov ax, 0  => function "reset"
  int 0x13          
  jc load_kernel     					; trouble? try again

load_kernel1:
  mov ax, 0x1000    
  mov es, ax         					; ES:BX = 0x10000
  xor bx, bx         					; mov bx, 0
 
  ; set parameters for reading function
  ; 8-Bit-wise for better overview
  mov ax, 0x020A         				; function "read", read 5 sectors
  mov cx, 0x0002          				; cylinder = 0 sector   = 2
  mov dh, 0x00         					; head     = 0
  mov dl, [bootdrive] 					; select boot drive
  int 0x13
  jc load_kernel1    					; trouble? try again

  ; show loading message
  mov si, msg_load
  call print_string 
  retn

  times 512-($-$$)-2 db 0				; Dateilänge: 512 Bytes
  dw 0xAA55                 				; Bootsignatur

Kernel.asm
Code:
; ///////////////////////////////////////////////////
; ---------------------------------------------------
; // GARNIX - Operating System 
; // but more than nothing
; ---------------------------------------------------
; // Version:	0.00.01b
; // Author: 	Ueberdosis
; ---------------------------------------------------
; ///////////////////////////////////////////////////

; -----------------------------------------
; Assembler Syntax [IntelAsm] (!=GNUAsm)
; -----------------------------------------

; 	Syntax				Beschreibung

; Die Reihenfolge der Instruktionsparameter
;	mov b, a 	 		Kopiert a nach b
;	add b, a 			Addiert a auf b (Ergebnis in b)

; Konstanten und Registerkennzeichnung
;	mov reg, konst 		Kopiert Konstante konst in das Register reg
;	add reg, konst 		Addiert Konstante konst auf das Register reg

; Datentypsuffixe
;	mov bl, al 			Kopiert 1 Byte-Register (b=byte)
;	mov bx, ax 			Kopiert 2 Byte-Register (w=word)
;	mov ebx, eax 		Kopiert 4 Byte-Register (l=long)

; Komentare
;	; Kommentar 		Platziert ein Kommentar 

; ---------------------------------------------------
; GARNIX Kernel
; ---------------------------------------------------
 
mov ax, 0x1000 							; Segmentregister updaten
mov ds, ax
mov es, ax
 
kernelstart:
  mov si, msg_welcome
  call print_string   					; Schicke Bootmessage :)

kernelloop:
  mov si, prompt						; promt (">") anziegen
  call print_string

  mov di, buffer
  call read_string

  mov si, buffer
  cmp byte [si], 0  					; blank line?
  je kernelloop           				; yes, ignore it
  
  mov di, cmd_info  					; "info" command
  call compare_string
  jz .info
  
  mov si, buffer
  mov di, cmd_reboot  					; "reboot" command
  call compare_string
  jz .reboot
  
  mov si, msg_badcommand
  call print_string 
  jmp kernelloop  
  
  .info:
  	mov si, msg_info_osname
  	call print_string
  
  	mov si, msg_info_version
  	call print_string
  	
  	mov si, msg_info_author
  	call print_string
  	
  	mov si, msg_info_cmd
  	call print_string

  	jmp kernelloop						; Springe zurück auf kernelloop
  	
  .reboot:
 	call reboot
 
; -------------------------------------------------
; GARNIX Variablen
; -------------------------------------------------

; db = Define Byte

; Bildschirmtextausgaben
msg_welcome db "Herzlich Willkommen zu GARNIX...", 0x0D, 0x0A, 0
msg_goodbye db "GARNIX wird nun neu gestartet, auf Wiedersehen...", 0x0D, 0x0A, 0

msg_info_osname db  "Name:    GARNIX", 0x0D, 0x0A, 0
msg_info_version db "Version: 0.00.01a", 0x0D, 0x0A, 0
msg_info_author db  "Author:  Daniel Pogodda", 0x0D, 0x0A, 0
msg_info_cmd db     "Befehle: info, reboot", 0x0D, 0x0A, 0

msg_badcommand db "Befehl nicht gefunden.", 0x0D, 0x0A, 0

; Eingabepromt
prompt db "> ", 0

; Befehle
cmd_info db "info", 0
cmd_reboot db "reboot", 0

buffer times 32 db 0

; -------------------------------------------------
; GARNIX Funktionen
; -------------------------------------------------

; Stringausgabe
print_string:
  lodsb            						; Byte laden (Load Sting Byte)
  or al, al
  jz short .done 						; 0-Byte? -> print_string.done!
  mov ah, 0x0E      					; Funktion 0x0E
  mov bx, 0x0007    					; Atrribut-Byte
  int 0x10         						; schreiben
  jmp print_string       				; nächstes Byte

  .done:
	ret

read_string:
  xor cl, cl							; mov cl, 0

  .loop:								; read_string.loop
    xor ah, ah							; mov ah, 0
    int 0x16   							; Tastendruck abwarten

    cmp al, 0x08    					; Wurde backspace gedrückt? (0x08 = backspace)
    je .backspace   					; ja? handle it!

    cmp al, 0x0D  						; enter pressed?
    je .done      						; yes, we're done

    cmp cl, 31  						; 31 chars inputted?
    je .loop    						; yes, only let in backspace and enter

    mov ah, 0x0E
    int 0x10      						; print out character

    stosb  								; put character in buffer
    inc cl
    jmp .loop

  .backspace:
    or cl, cl							; Sind wir noch am Anfang vom String?
    jz .loop							; ja? Dann ignoriere die Eingabe und ab zurück auf read_string.loop!

    dec di								; Decrementiere di um 1 (vergleichbar mit di--)
    mov byte [di], 0					; Zeichen löschen
    dec cl								; Decrementiere cl um 1

    mov ax, 0x0E08
    int 10h								; backspace on the screen

    mov al, ' '
    int 10h								; blank character out

    mov al, 0x08
    int 10h								; backspace again

    jmp .loop							; go to the read_string.loop

  .done:
    xor al, al							; mov al, 0 ; null terminator
    stosb

    mov ax, 0x0E0D						; 0x0D = carriage return
    int 0x10
    mov al, 0x0A						; 0x0A = new line
    int 0x10

    ret

compare_string:
  .loop:								; compare_string.loop
    mov al, [si]   						; grab a byte from SI
    cmp al, [di]   						; are SI and DI equal?
    jne .done							; if no, we're done.

	or al, al      						; zero?
  	jz .done       						; if yes, we're done.

    inc di     							; increment DI
    inc si     							; increment SI
    jmp .loop  							; looooop!

  .done: 	
    ret

reboot:
  mov si, msg_goodbye
  call print_string
  jmp 0xffff:0x0000
  
shutdown:
; tba...
 
Zuletzt bearbeitet von einem Moderator:

üäpöol

Erfahrenes Mitglied
Um eine .img in eine .iso zu verwandeln, brauchst du ein Programm wie mkisofs. Ich werde demnächst mal hier mein OS hochladen.
 

ComFreek

Mod | @comfreek
Moderator
Um HTML darzustellen, brauchst du eine Rendering Engine. Du kannst sie entweder selbst bauen (sehr kompliziert, nicht zu empfehlen) oder eine bestehende nutzen. Allerdings musst du bei Letzterem schauen, ob du eine binärkompatible Version zu deinem Betriebssystem erzeugen kannst.
 

DerMensch

Grünschnabel
Hallo, ich versage leider beim lezten Schritt, wo man die .bin Datein über die cmd zu einer .img datei machen soll, habe ich gemacht, aber ich bekommeimmer den gleichen fehler, von VirtualBox, ich kann die .img datei auch nicht öffnen, wenn ich aber nur die Boot.bin rein"kopiere", bootet er, kann mir wer helfen?

Mit freundlichen Grüden derMensch
 

DerMensch

Grünschnabel
Ok, Ich glaube, ich habe die boot.bin liegt nicht auf Sektor 0, kann deswegen auch nicht booten, wenn die andere Datei nicht vorhanden ist, Weiß jemand wie ich die boot.bin geziehlt auf den ersten Sektor bekomme?