| Autor |
Nachricht |
florida
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.11.2010
Beiträge: 22
|
florida Mitglied
19:14:00 20.07.2011 Titel: |
Ich habe mir die OS-Seite von Erhard Henkes angeshen... |
Zitieren |
und bin positiv überrascht.
Ich teste das Betriebssystem unter Virtual PC und habe mir eine vfd (Virtual Disk)-Datei erstellt. Dann habe ich die boot.bin und die kernel.bin in die Datei myos.img anhand des Cmd-Befehls "copy" kopiert. Die Datei myos.img habe ich dann per RawDisk auf die virtuelle Diskette geschrieben.
Als ich das Betriebssystem dann testen wollte, hing sich der Computer stets auf... Selbst der Bootloader wurde nicht geladen.
Woran könnte das liegen? Bei den Tutorials davor - als noch Bootloader und Kernel in einer asm-Datei lagen - hatte ich keine Probleme. Da lief noch das Betriebssystem. |
|
|
|
 |
Mr X
Mitglied
Benutzerprofil
Anmeldungsdatum: 18.09.2007
Beiträge: 1231
|
Mr X Mitglied
19:57:39 20.07.2011 Titel: |
|
Zitieren |
Kommt denn irgendeine (Fehler-)Meldung?
Ansonsten würde ich es einfach mal in der von ehenkes geschilderten Art und Weise versuchen (also keine vfd-Datei), und diese in VPC laden. |
|
|
|
 |
florida
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.11.2010
Beiträge: 22
|
florida Mitglied
20:06:00 20.07.2011 Titel: |
Ich habe mir die OS-Seite von Erhard Henkes angeshen... |
Zitieren |
Eine Fehlermeldung erscheint nicht. Das Betriebssystem hängt sich lediglich dabei auf und es erscheint überhaupt keine Meldung. Wie meinst du das ohne vfd-Datei? Ein Diskettenlaufwerk habe ich jetzt nicht. |
|
|
|
 |
Jonas OSDever
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.08.2010
Beiträge: 694
|
Jonas OSDever Mitglied
20:34:17 20.07.2011 Titel: |
|
Zitieren |
Zeig mal deinen Code und beschreib genau wie du das zusammenkopierst. Vielleicht ist da irgendwo ein kleiner Fehler. |
_________________ Hier koennte eine Signatur stehen
|
|
 |
florida
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.11.2010
Beiträge: 22
|
florida Mitglied
20:43:59 20.07.2011 Titel: |
|
Zitieren |
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | ;boot.asm
org 0x7C00 ; set up start address
; 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)
; start
mov [bootdrive], dl ; boot drive from DL
call load_kernel ; load kernel
; jump to kernel
jmp 0x1000:0x0000 ; address of kernel
bootdrive db 0 ; boot drive
loadmsg db "bootloader message: loading kernel ...",13,10,0
; print string
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 dl,[bootdrive] ; select boot drive
mov al,10 ; read 10 sectors
mov ch, 0 ; cylinder = 0
mov cl, 2 ; sector = 2
mov dh, 0 ; head = 0
mov ah, 2 ; function "read"
int 0x13
jc load_kernel1 ; trouble? try again
; show loading message
mov si,loadmsg
call print_string
ret
times 510-($-$$) hlt
db 0x55
db 0xAA | |
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | ;kernel.asm
mov ax, 0x1000 ; set up segments
mov ds, ax
mov es, ax
mov si, welcome
call print_string
loop:
mov si, prompt
call print_string
mov di, buffer
call get_string
mov si, buffer
cmp byte [si], 0 ; blank line?
je loop ; yes, ignore it
mov di, cmd_hi ; "hi" command
call strcmp
jz .helloworld
mov si, buffer
mov di, cmd_help ; "help" command
call strcmp
jz .help
mov si, buffer
mov di, cmd_questionmark ; "?" command
call strcmp
jz .help
mov si, buffer
mov di, cmd_exit ; "exit" command
call strcmp
jz .exit
mov si,badcommand
call print_string
jmp loop
.helloworld:
mov si, msg_helloworld
call print_string
jmp loop
.help:
mov si, msg_help
call print_string
jmp loop
.exit:
mov si, msg_exit
call print_string
jmp 0xffff:0x0000 ; Reboot
welcome db 'HenkesSoft 0.01 (version from Mar 14, 2009)', 13, 10, 0
msg_helloworld db 'Hello World!', 13, 10, 0
badcommand db 'Command unknown.', 13, 10, 0
prompt db '>', 0
cmd_hi db 'hi', 0
cmd_help db 'help', 0
cmd_questionmark db '?', 0
cmd_exit db 'exit', 0
msg_help db 'Commands: hi, help, ?, exit', 13, 10, 0
msg_exit db 'Reboot starts now.', 13, 10, 0
buffer times 32 db 0
; ================
; calls start here
; ================
print_string:
lodsb ; grab a byte from SI
or al, al ; logical or AL by itself
jz .done ; if the result is zero, get out
mov ah, 0x0E
int 0x10 ; otherwise, print out the character!
jmp print_string
.done:
ret
get_string:
xor cl, cl
.loop:
xor ah, ah ; mov ah, 0
int 0x16 ; wait for keypress
cmp al, 8 ; backspace pressed?
je .backspace ; yes, handle it
cmp al, 13 ; 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 ; zero? (start of the string)
jz .loop ; if yes, ignore the key
dec di
mov byte [di], 0 ; delete character
dec cl ; decrement counter as well
mov ax, 0x0E08
int 0x10 ; backspace on the screen
mov al, ' '
int 0x10 ; blank character out
mov al, 8
int 0x10 ; backspace again
jmp .loop ; go to the main loop
.done:
mov al, 0 ; null terminator
stosb
mov ax, 0x0E0D
int 0x10
mov al, 0x0A
int 0x10 ; newline
ret
strcmp:
.loop:
mov al, [si] ; fetch 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 ; goto .loop
.done:
stc
ret | | |
Zuletzt bearbeitet von florida am 20:44:33 20.07.2011, insgesamt 1-mal bearbeitet |
|
 |
Mr X
Mitglied
Benutzerprofil
Anmeldungsdatum: 18.09.2007
Beiträge: 1231
|
Mr X Mitglied
20:56:43 20.07.2011 Titel: |
Re: Ich habe mir die OS-Seite von Erhard Henkes angeshen... |
Zitieren |
| florida schrieb: | | Eine Fehlermeldung erscheint nicht. Das Betriebssystem hängt sich lediglich dabei auf und es erscheint überhaupt keine Meldung. Wie meinst du das ohne vfd-Datei? Ein Diskettenlaufwerk habe ich jetzt nicht. |
Ich weiß nicht, wie ehenkes das macht, aber ich nehme an, er hat irgendwo mal ein Diskettenabbild erstellt (roh, kein vfd). |
|
|
|
 |
Erhard Henkes
Mitglied
Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 12168
|
Erhard Henkes Mitglied
22:53:41 20.07.2011 Titel: |
|
Zitieren |
http://www.henkessoft.de/OS_Dev/OS_Dev1.htm#mozTocId427538
| Code: | nasm boot.asm -f bin -o boot.bin
nasm kernel.asm -f bin -o kernel.bin
cmd /c copy /b boot.bin + kernel.bin MyOS.bin
partcopy MyOS.bin 0 400 -f0 | |
1) Schau dir MyOS.bin mit dem Hex-Editor an, ob alles dabei ist.
2) Achte darauf, dass die Daten nach dem Kopieren wirklich im Bootsektor anfangen (da liegt offensichtlich dein Fehler)
Probiere es mal mit http://www.chrysocome.net/dd anstelle rawwrite (Das verwende ich nicht mehr)
So kopiere ich z.B. das aktuelle Image auf eine Floppy zum Booten:
| Code: | | dd if=FloppyImage.img of=\\.\A: | |
Vielleicht kann man das auf die virtuelle Floppy übertragen.
Ansonsten verwende qemu: | Code: | | qemu.exe -fda MyOS.bin | |
... oder bochs: (Bochs config-Datei)
| Code: | | floppya: 1_44=MyOS.bin, status=inserted | | oder
| Code: | | floppya: 1_44=G:\OSDev\Test\MyOS.bin, status=inserted | |
Umkopieren ist auf jeden Fall falsch. Dieses Binärformat ist bereits Rohformat, also die binären Daten, Byte für Byte, wie sie auf den ersten beiden Sektoren (jeweils 512 == 0x200 Byte) auftauchen sollen.
Geübter Umgang mit den Tools ist bei OSDev wichtig. Probiere also bitte die ganze Kiste durch. Es gibt auch noch VBox und VMWare Player. |
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 23:07:22 20.07.2011, insgesamt 5-mal bearbeitet |
|
 |
florida
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.11.2010
Beiträge: 22
|
florida Mitglied
08:33:51 21.07.2011 Titel: |
|
Zitieren |
Bei Qemu kommt jetzt "Lade Kernel..." und dann hängt sich gleich das OS auf.
... Hab den Fehler gefunden ...
| Code: | ;kernel.asm
times 510-($-$$) hlt ; as alternative to db 0 | | |
Zuletzt bearbeitet von florida am 08:53:08 21.07.2011, insgesamt 3-mal bearbeitet |
|
 |
florida
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.11.2010
Beiträge: 22
|
florida Mitglied
16:02:34 21.07.2011 Titel: |
|
Zitieren |
Könnte man den Kernel anstatt mit C vielleicht auch in Pascal schreiben? |
|
|
|
 |
taljeth
Mitglied
Benutzerprofil
Anmeldungsdatum: 11.09.2009
Beiträge: 149
|
taljeth Mitglied
16:29:41 21.07.2011 Titel: |
|
Zitieren |
Ja, kann man. Du kannst das hier als Ansatz dafür nehmen. Alles weitere läuft so ähnlich wie in C, nur eben mit anderer Syntax. Die Pascal-Runtime steht dir erstmal nicht zur Verfügung - wenn der Compiler meckert, dass er irgendeine Funktion aus der Runtime brauch, aber nicht findet, dann musst du in der system.pas die entsprechenden Funktionen implementieren. |
_________________ Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.
Lowlevel - die deutschsprachige OS-Dev-Community
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|