Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Projekt: OS-Development  ::  Ich habe mir die OS-Seite von Erhard Henkes angeshen...  
Gehen Sie zu Seite 1, 2, 3  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
florida
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.11.2010
Beiträge: 22
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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: 12169
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
c++.de :: Projekt: OS-Development  ::  Ich habe mir die OS-Seite von Erhard Henkes angeshen...  
Gehen Sie zu Seite 1, 2, 3  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.