Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - BadBeu

Seiten: [1] 2
1
Lowlevel-Coding / Probleme mit Bochs/BIOS disk read
« am: 20. July 2006, 18:25 »
Okay. Endlich hab ich den Fehler gefunden. Nämlich hier:


;; select DISK function (READ SECTOR(S) INTO MEMORY)
   mov   ah, 0x02

   ;; reset disk
   call   disk_reset

   ;; read disk
   .read_disk:
      ;; BIOS interrupt
      int   0x13


Die "disk_reset" Funktion überschreibt mein [AH].

Einfach Instruktionen umgetauscht und jetzt funktionierts perfekt.
2
Lowlevel-Coding / Probleme mit Bochs/BIOS disk read
« am: 19. July 2006, 16:49 »
Also ich zähle 11 Bytes. Außerdem ist die kompilierte Datei auch 512 bytes lang.
Und richtig aus der Struktur auslesen tut er ja auch. Nur der BIOS Interrupt funktioniert nicht.
3
Lowlevel-Coding / Probleme mit Bochs/BIOS disk read
« am: 19. July 2006, 14:44 »
Hallo Leute,

ich habe ein kleines Problem mit meinem Bootloader.

Eigentlich soll er nur einen erweiterten Bootloader in den Speicher laden und ausführen, da das BIOS ja nur 512 bytes läd.
Eigentlich funktioniert das alles auch ganz prima, jedenfalls spuckt er keine Fehler aus. Aber er läd nichts in den Speicher.
Ich weiß jetzt nicht wo der Fehler liegt?
Im Debugger läd er alles in die richtigen Register machten den BIOS int und macht dann normal weiter. Nur das ich an der Speicherstelle nur Nullen hab anstatt mein Programm.

Hier mal mein Code. Ich weiß ... ist ein bischen umfangreich


_start:

;; essential initialization
cli

;; setup a stack
mov ax, 0x9000
mov ss, ax
mov sp, 0xFFFE

sti

;; load boot up message
push cs
pop ds
mov si, msg_bootup
;; print boot up message
call print_string

;; load loaction of position structure
push cs
pop ds
mov si, pos_struct
;; load stage two behind stage one
push 0x7E00
pop es
xor di, di
call load_stage2

;; jump into stage two
push es
push ax
retf

;; loads stage two of the bootloader
;; INPUT:
;; [DS:SI] - location of position structure pointing to bootloader on disk
;; [ES:DI] - location of the bootloader in memory
;; OUTPUT:
;; [ES:DI] - location of the bootloader in memory
;; [AX] - entry point offset of the bootloader
;; AFFECT:
load_stage2:
;; store location of position structure
push si
push ds

;; read header
call read_header

;; restore location of position structure
pop ds
pop si

;; store entry point
push ax

;; load bootloader into memory
mov ax, bx
call disk_read

;; restore entry point
pop ax

;; return to caller
ret

;; loads, verifies and reads values from bootloader header
;; INPUT:
;; [DS:SI] - location of position structure pointing to bootloader header on disk
;; [ES:DI] - location of data buffer
;; OUTPUT:
;; [AX] - entry point
;; [BX] - size of bootloader (in sectors)
;; AFFECT:
;; [AX] - entry point
;; [BX] - size of bootloader (in sectors)
;; [DX] - calculation issue
;; [DS:SI] - end of header
read_header:
;; read header into memory
;; read just one sector
mov ax, 0x0001

;; read from disk
call disk_read

;; move output to input
push di
push es
pop ds
pop si

;; get size of bootloader
lodsw
;; calculate sector count
xor dx, dx
mov bx, 0x0020
div bx
or dx, dx
;; do not increment if even division
jz .no_inc
inc ax

.no_inc:
;; store size
mov bx, ax

;; verify magic number
;; first part
lodsw
xor ax, word [cs:magic_number]
jnz .invalid_header
;; second part
lodsw
xor ax, word [cs:magic_number+2]
jnz .invalid_header

;; get entry point
lodsw

;; return to caller
ret

.invalid_header:
;; load invalid header message
push cs
pop ds
mov si, msg_inv_header
;; panic
call panic

;; reads sectors from disk
;; INPUT:
;; [AX] - number of sectors to read
;; [DS:SI] - location of position structure
;; [ES:DI] - location of data buffer
;; OUTPUT:
;; [AX] - sectors actually read
;; [ES:DI] - location of data
;; AFFECT:
;; [AX] - through function call
;; [ES:DI] - through function call
;; [DS:SI] - through function call
;; [BX] - through function call
disk_read:
;; store number of sectors to read on stack
push ax

;; load drive number from position structure
lodsb
mov dl, al

;; check for floppy
and al, 10000000b
jz .read_floppy

;; read from hard disk
.read_disk:
;; [DS:SI] now already pointing to LBA and [DL] is set correctly
;; restore number of sectors to read from stack
pop ax

;; read from disk
call disk_read_lba

;; return to caller
ret

;; read from floppy disk
.read_floppy:
;; [DL] now already holding drive number

;; [DS:SI] now pointing to CHS value

;; load cylinder number
lodsw
mov bx, ax

;; load head number
lodsb
mov dh, al

;; load sector number
lodsb
mov cl, al

;; restore number of sectors to read
pop ax

;; read from disk
call disk_read_chs

;; return to caller
ret

;; reads sectors from disk via CHS referencing
;; INPUT:
;; [AL] - number of sectors to read
;; [BX] - cylinder number (only bit 0-9 used)
;; [DH] - head number
;; [CL] - sector number (only bit 0-6 used)
;; [DL] - drive number to access
;; [ES:DI] - location of data buffer
;; OUTPUT:
;; [AX] - sectors actually read
;; [ES:DI] - location of data
;; AFFECT:
;; [AX] - sectors actually read
;; [ES:DI] - location of data
;; [BX] - offset of data
disk_read_chs:
;; protect against false input
and bx, 0000001111111111b
and cl, 00111111b

;; pack cylinder and sector number correctly
mov ch, bl
sal bh, 0x06
or cl, bh

;; store data buffer offset in [BX] for function call
mov bx, di

;; select DISK function (READ SECTOR(S) INTO MEMORY)
mov ah, 0x02

;; reset disk
call disk_reset

;; read disk
.read_disk:
;; BIOS interrupt
int 0x13

;; store flags
pushf

;; check for read error
xor ah, 0x04
jz .read_error

;; restore flags
popf

;; retry on error
jc .read_disk

.end_read:
;; store sectors read into [AX]
xor ah, ah

;; return to caller
ret

.read_error:
;; load read error message
push cs
pop ds
mov si, msg_readerror
call print_warning

;; complete function call
jmp .end_read

;; reads sectors from disk via LBA referencing
;; INPUT:
;; [DS:SI] - location of 64 bit LBA
;; [AX] - number of sectors to read into memory
;; [DL] - drive to access
;; [ES:DI] - location of data buffer
;; OUTPUT:
;; [AX] - sectors actually read
;; [ES:DI] - location of data
;; AFFECT:
;; [AX] - sectors actually read
;; [DS:SI] - location of the disk address packet
disk_read_lba:
;; fill in number of sectors to read into DAP
mov [dap_sec2read], ax

;; fill in LBA into DAP
lodsw
mov [dap_lba], ax
lodsw
mov [dap_lba+2], ax
lodsw
mov [dap_lba+4], ax
lodsw
mov [dap_lba+6], ax

;; fill in location of data buffer into DAP
mov [dap_data_buf], di
mov [dap_data_buf+2], es

;; load DAP
push cs
pop ds
mov si, dap

;; reset disk
call disk_reset

;; select DISK function (EXTENDED READ SECTOR(S))
mov ah, 0x42

;; read data from disk
.read_disk:
;; BIOS interrupt (DISK)
int 0x13

;; store flags
pushf

;; check for function error
push ax
xor ah, 0x01
jz .not_available
pop ax

;; check for read error
xor ah, 0x04
jz .read_error

;; restore flags
popf

;; retry on error
jc .read_disk

;; return to caller
.end_read:
;; store sectors actually read to [AX]
mov ax, [dap_sec2read]
;; return
ret

.not_available:
;; load error message
push cs
pop ds
mov si, msg_int13_ex_abs
;; panic
call panic

.read_error:
;; load read error message
push cs
pop ds
mov si, msg_readerror
;; print read error message
call print_warning

;; complete function call
jmp .end_read

;; resets disk drive
;; INPUT:
;; [DL] - dirve number to reset
;; OUTPUT:
;; [AH] - status of operation
;; AFFECT:
;; [AX] - status of operation
disk_reset:
;; select DISK function (RESET DISK SYSTEM)
mov ah, 0x00

.reset_disk:
;; BIOS interrupt (DISK)
int 0x13

;; retry on  error
jc .reset_disk

;; return to caller
ret

;; prints error message to screen and halts CPU
;; INPUT:
;; [DS:SI] - location of error message
;; OUTPUT:
;; none
;; AFFECT:
;; [AX] - through function call
;; [BX] - through function call
;; [SI] - through function call
panic:
;; store location of error message to stack
push si
push ds

;; load panic sign
push cs
pop ds
mov si, msg_panic
;; output panic sign
call print_string

;; restore location of error message from stack
pop ds
pop si
;; output error message
call print_string

;; halt CPU
.halt:
hlt
jmp .halt

;; prints a warning message to screen
;; INPUT:
;; [DS:SI] - location of warning message
;; OUTPUT:
;; none
;; AFFECT:
;; [AX] - through function call
;; [BX] - through function call
;; [SI] - through function call
print_warning:
;; store location of warning message to stack
push si
push ds

;; load warning sign
push cs
pop ds
mov si, msg_warning
;; print warning sign
call print_string

;; restore warning message
pop ds
pop si
;; print warning message
call print_string

;; return to caller
ret

;; prints a zero-terminated, teletype formated string to screen
;; INPUT:
;; [DS:SI] - location of string
;; OUTPUT:
;; none
;; AFFECT:
;; [AX] - BIOS function and character
;; [BX] - page and color selection
;; [SI] - advances during execution
print_string:
;; select VIDEO function (TELETYPE OUTPUT)
mov ah, 0x0E
;; select active page and default color
mov bx, 0x0007

;; process characters
.process_char:
;; load character into [AL]
lodsb

;; check for zero termination
or al, al
jz .end_process

;; BIOS interrupt (VIDEO)
int 0x10

;; process next character
jmp .process_char

;; return to caller
.end_process:
ret

;; data

;; magic number for header verification
magic_number dw 0xE64D, 0xBB40

;; Disk Address Packet for LBA disk access
dap:
dap_size db 0x10
dap_reserved db 0
dap_sec2read dw 0
dap_data_buf dw 0, 0
dap_lba dw 0, 0, 0, 0

;; messages
msg_bootup db "DSMOS bootloader starting...", 13, 10, 0
msg_panic db "BOOTLOADER PANIC: ", 0
msg_warning db "BOOTLOADER WARNING: ", 0
msg_readerror db "Read error encountered!", 13, 10, 0
msg_int13_ex_abs db "BIOS INT13h extensions not available!", 13, 10, 0
msg_inv_header db "Invalid header encountered!", 13, 10, 0

;; fill up to one sector (512 bytes)
times 512-($-$$)-11 db 0

;; position structure pointing to bootloader stage two
pos_struct:
db 0
dw 0
db 0, 0x02
dw 0, 0

;; boot signature
dw 0xAA55


Von besonderem Interesse wird wohl disk_read_chs sein. Da disk_read_lba ja nicht ausgeführt wird bei Disketten.

Ich hoffe der Code ist nicht zu umfangreich.

Schonmal danke für die Hilfe.
4
Lowlevel-Coding / Die INT 13h extensions
« am: 16. July 2006, 15:08 »
Hmm. So ein Mist. Und ich probiere da tagelang rum.
Dann werd ich doch erstmal wieder CHS-Input einbauen müssen.
Danke für deine Hilfe.
5
Lowlevel-Coding / Die INT 13h extensions
« am: 16. July 2006, 13:11 »
Weiß denn keiner, wo hier der Fehler liegt?
Entweder bei mir oder beim Bochs.
6
Lowlevel-Coding / Nullen an Image Datei anhängen
« am: 15. July 2006, 03:41 »
Nunja. Ich hab es immer etwas umständlich gemacht, aber es ging.

Erstmal schauen, wie groß die kompilierte Datei ist. Dann von der gewünschten Grüße abziehen.

Dann

dd bs=<TOTAL_SIZE - EXE_SIZE> count=1 in=/dev/zero out=temp

und dann nur noch zusammenfügen

cat <EXE_FILE> temp > <IMAGE>

Vielleicht gehts auch einfacher aber das klappt.
7
Lowlevel-Coding / Die INT 13h extensions
« am: 14. July 2006, 13:00 »
Ich habe da noch eine Frage zu den INT13h extensions unter Bochs.

In der Docu steht, dass das BIOS EDD v3.0 unterstützt. Das sind ja dann die INT13h extensions, oder?
Denn wenn ich nun die Funktion AH=0x41 (check installation) oder AH=0x42 (extended read sectors) aufrufe bekomme ich nach dem "int 0x13" immer AH=0x01 (function not found) zurück.
Mache ich was falsch.

Hier mal mein Code:

read_disk:

;; select memory location for the DAP
push 0x1000
pop ds
mov si, 0x0000

;; select memory location for the input
push 0x1010
pop es
mov bx, 0x0000

;; push pointer to DAP
push si

;; size of DAP
mov byte [si], 0x10
;; reserved in DAP
inc si
mov byte [si], 0x00
;; sector to read
inc si
mov byte [si], 0x01
;; reserved in DAP
inc si
mov byte [si], 0x00
;; memory location for store
inc si
mov word [si], es
add si, 0x02
mov word [si], bx
;; LBA
add si, 0x02
mov word [si], 0x00
add si, 0x02
mov word [si], 0x00
add si, 0x02
mov word [si], 0x00
add si, 0x02
mov word [si], 0x00

;; pop pointer to DAP
pop si

;; select function
mov ah, 0x42

;; select drive
mov dl, 0x00

;; BIOS interrupt
int 0x13

pushf

;; check for INT13h extensions
xor ah, 0x01
jz .int13_no_support

popf

jc read_disk

ret

.int13_no_support:
  mov si, msg_int13h_no_support
  call print_error


Ich hab mir das auch mal im Debugger angeschaut und er gibt mit AH=0x01 zurück.
Ist meine DAP falsch?
Oder funktioniert das mit Disketten nicht?
Hab ich was übersehen?

Ich schon am verzweifeln.
8
Offtopic / Bootproblem bei VMWare Player
« am: 14. July 2006, 10:23 »
Genau. Ich wollte nur erstmal auf 64bit CPUs coden.
Und da ich keine hab brauche ich halt einen Emulator.
Da ich noch ziemlich am Anfang stehe ist Geschwindigkeit auch noch nicht so wichtig. Es sollte erstmal vernünftig laufen.
Außerdem, wenn es unter Bochs schnell läuft, dann sollte es unter einer realen CPU ja noch schneller laufen ;-)
9
Lowlevel-Coding / Die INT 13h extensions
« am: 13. July 2006, 14:07 »
Super.
Das ist genau das, was ich gesucht habe.

Danke
10
Lowlevel-Coding / Die INT 13h extensions
« am: 13. July 2006, 12:46 »
Hallo Leute,

ich bin grade dabei einen netten Bootloader zu coden. Da ich möchte, dass der viel kann möchte ich, dass er sich Module laden kann.
Als Vorraussetzung sei gesagt, dass er weiß, wo seine Module liegen (LBA-Sector-Referenzierung) und dass er weiß, wie viel er laden muss und wohin.
Nun ist mein Problem, dass diese Module vielleicht nicht in den unteren 8 GByte der Platte liegen.
Nun hab ich von den INT 13h extensions gelesen, bin aber nicht so ganz schlau aus dem geworden, was Google mir da ausgespuckt hat.

1. Ist das wirklich eine BIOS Funktion oder ist das ein OS Treiber, der eben auf dem INT 13h liegt.

2. Ist das ein Standard auf modernen Systemen oder spezifisch für eine BIOS-Software bzw. Kann ich abfragen, ob die Verfügbar sind.

3. Gibt es irgendwo Informationen zum Aufruf, also was für Parameter diese Funktion haben will, etc.

Schonmal Danke für Eure Hilfe.
11
Offtopic / Bootproblem bei VMWare Player
« am: 13. July 2006, 01:04 »
Ist nicht mehr wichtig.
Ich nutze jetzt Bochs mit x86-64 Support.
Ist besser als der VMWare Player, da ich ne Intel Core Duo Maschine laufen hab.
Die .vmx Datei hab ich schon gelöscht.

Aber viel mals Danke für die Hilfe.[/code]
12
Offtopic / Bootproblem bei VMWare Player
« am: 12. July 2006, 19:00 »
Ja. Das stimmt alles.
Allerdings gibt es mir einen Fehler aus, dass er das Image nicht laden/lesen kann. Der Pfad passt aber und lesen müsste er es können. Arbeite unter Windows.
13
Offtopic / Bootproblem bei VMWare Player
« am: 12. July 2006, 17:53 »
Ja. Das ist aber immer noch nicht das Problem, dass ich habe.
Ich bestize ja schon eine funktionierende .vmx-Datei.
Es läuft ja soger Debain unter einer anderen Maschiene, die ich erstellt habe. Alles wunderbar.
Mein Problem ist nur, dass der VMWare Player nicht mein Floppy Image laden will. Eine Maschine hab ich ja schließlich schon. Auf der läuft ja alles.
14
Offtopic / Bootproblem bei VMWare Player
« am: 12. July 2006, 15:29 »
Ja. Das ist nicht mein Problem.
Diese "Info-Datei" hab ich ja.
Ich habe ja auch keine Probleme CD-ROM-Images zu laden oder das Ding einzustellen.
Ich brauche nur ein Programme, dass mir ein Floppy-Image erstellt, dass der VMWare Player auch erkennt. Ein reines Binary nimmt der nicht als Image an. Ansonsten virtualisiert er ja schon gut meinen PC. Aber ich brauche halt ein Image, das er laden kann. Und das bekomme ich nicht hin.
15
Offtopic / Bootproblem bei VMWare Player
« am: 12. July 2006, 11:47 »
Hallo,
ich verzweifel so langsam.
Ich versuche einfach nur ein Boot-Disketten-Image zu erzeugen, dass ich mit VMWare Player starten kann. Das Ding macht noch nicht einmal viel


org 0x7c00

jmp $

times 512-($-$$)-2 db 0
dw 0xAA55


Das ist schon alles. Ist auch mehr zum testen von VMWare gedacht. Aber der liest mein Image nicht. Hab es erst mit der einfach 512 byte bootloader Datei probiert. Klappt unter Bochs nicht unter VMWare.
Dann einfach unter Linux mit /dev/zero zusammengelegt und auf 1.44M gebracht. Das hat auch nix geholfen.
Bei Google finde ich nur Sachen, wie ich Images von Diskette bzw. auf Diskette schreibe. Ich habe aber kein Disketten-Laufwerk und versuche "einfach so" ein Image zu erstellen, das ich mit VMWare booten kann.
Vielleicht kann mir ja einer von Euch dabei helfen.

Schon mal Danke.
16
Lowlevel-Coding / Paging im 64 Bit Modus.
« am: 10. July 2006, 12:33 »
Genau. Du hast nur einen 48bit breiten linearen Adressraum. "Sign extend" bedeutet einfach nur, dass dort das Vorzeichen steht. Also bei den Adressen eigentlich immer 0. Ist nur dazu da, um auf 64bit aufzufüllen.
17
OS-Design / Idee zum 36 bzw. 64 bit großen Addressraum
« am: 10. July 2006, 12:26 »
Japp. Das habe ich mir auch gedacht, dass es dann wieder zuviel Overhead gibt. Tja, schade. Anscheinend überwiegen die Probleme den Nutzen.
Danke für die Tipps.
18
OS-Design / Idee zum 36 bzw. 64 bit großen Addressraum
« am: 07. July 2006, 11:17 »
Nunja. Aber das sind ja auch mehr oder weniger, die Probleme, die man sowieso lösen muss. Bei einem Multiprogramm-System mit meheren Prozessen bzw. Threads gleichzeitig alle mit dynammisch alloziertem Speicher treten ja ähnlich Probleme auf. Zumindest in einem 4GB oder kleineren Adressraum. Außerdem kann man ja auch evtl. Fragmentierten Speicher zulassen. Dann muss man halt die Verwendung von Pointern einschränken und nur über Funktionen, die das OS bereitstellt auf die Dateien zugreifen.
Ist dann natürlich wieder mehr Overhead. Ob es dann noch wirklich schneller ist müsste man halt ausprobieren.
19
OS-Design / Idee zum 36 bzw. 64 bit großen Addressraum
« am: 06. July 2006, 23:46 »
Erstmal Danke für die vielen Antworten.

Also wenn mehrere Programme die gleich Datei öffnen, kann ich die gleich Datei ja mehrmals in den Addressbereich des jeweiligen Programms mappen. Dann schreibe ich nur auf bzw. von Festplatte, wenn es wirklich notwendig ist. Also wenn ich die Page auf Platte schreibe oder wenn ich sie lese.
Man muss halt nur darauf achten, was noch gebraucht wird, und was nicht.

Wieso kriege ich Probleme bei mehreren hundert Dateien? Wie soll ich mit heutigen Festplatten 265TB voll kriegen. Und selbst wenn du soviele bzw. so große Dateien hast, wird es eh viel zu langsam werden, da du nie soviel RAM hast - jedenfalls nicht in absehbarer Zeit.

Und bezüglich der Fragmentierung: Zur Not kann ich ja eine Daemon laufen lassen, der alles Unnütze rausschmeißt bzw. alles kompremiert - das dauert halt nur ziemlich lange.
20
OS-Design / Frage zu UDI
« am: 06. July 2006, 14:36 »
Okay. Danke für die schnelle Antwort.
Dann ist das wohl wirklich "lost cause".
Dann muss ich doch alle Treiber selber schreiben. ;-)
Seiten: [1] 2

Einloggen