Hat leider nix gebracht.
Egal.
Ich hab jetzt einen Code, der scheint zu funktionieren:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Enable "unreal" mode
; This code is public domain (no copyright).
; You can do whatever you want with it.
;
; Unreal mode is identical with real mode with one exception: 32-bit
; addresses are allowed (they do not cause INT 0Dh, as they do in real mode)
;
; This code will fail if run in virtual 8086 mode (Windows DOS box
; or EMM386 loaded). Oh yeah, a 32-bit CPU is required (386+)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; we're in real mode
use16
DATA_SEL equ 8
jmp 07c0h:start
start:
mov ax, cs
mov ds, ax
mov es, ax
; ...
push ds
push es
xor eax,eax ; point gdt_ptr to gdt
mov ax,ds
shl eax,4
add eax,gdt ; EAX=linear address of gdt
mov [gdt_ptr + 2],eax
cli ; interrupts off
lgdt [gdt_ptr]
mov eax,cr0
or al,1
mov cr0,eax ; partial switch to 32-bit pmode
mov bx,DATA_SEL ; selector to segment w/ 4G limit
mov fs,bx
mov gs,bx ; set seg limits in descriptor caches
dec al
mov cr0,eax ; back to (un)real mode
pop es ; segment regs back to old values,
pop ds ; but now 32-bit addresses are OK
; ...
mov ds, bx
mov ah, 0eh
mov al, "k"
int 10h
mov edi,0B8000h ; point to screen
mov cx,160 ; just two lines
mov ah,1Eh ; yellow on blue screen attrib
mov al, 1
loops:
mov [gs:edi], AX
inc ax
inc edi
loop loops
jmp $
gdt: dw 0 ; limit 15:0
dw 0 ; base 15:0
db 0 ; base 23:16
db 0 ; access byte (descriptor type)
db 0 ; limit 19:16, flags
db 0 ; base 31:24
DATA_SEL equ $-gdt
dw 0FFFFh
dw 0
db 0
db 92h ; present, ring 0, data, expand-up, writable
db 0CFh ; page-granular, 32-bit
db 0
gdt_end:
gdt_ptr:
dw gdt_end - gdt - 1 ; GDT limit
dd 0 ; linear adr of GDT (set above)
db 510-$ dup(0)
dw 0aa55h
Bochs sagt dazu:
00034788000p[WGUI ] >>PANIC<< POWER button turned off.
00034788000i[SYS ] Last time is 1158674124
00034788000i[CPU0 ] real mode
00034788000i[CPU0 ] CS.d_b = 16 bit
00034788000i[CPU0 ] SS.d_b = 16 bit
00034788000i[CPU0 ] | EAX=00001ea1 EBX=00000008 ECX=000f0000 EDX=00000000
00034788000i[CPU0 ] | ESP=0000fffe EBP=00000000 ESI=0000733c EDI=000b80a0
00034788000i[CPU0 ] | IOPL=0 NV UP DI PL NZ AC PE NC
00034788000i[CPU0 ] | SEG selector base limit G D
00034788000i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D
00034788000i[CPU0 ] | CS:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0
00034788000i[CPU0 ] | DS:0008( 0000| 0| 0) 00000080 0000ffff 0 0
00034788000i[CPU0 ] | SS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00034788000i[CPU0 ] | ES:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0
00034788000i[CPU0 ] | FS:0008( 0001| 0| 0) 00000000 000fffff 1 1
00034788000i[CPU0 ] | GS:0008( 0001| 0| 0) 00000000 000fffff 1 1
00034788000i[CPU0 ] | EIP=00000058 (00000058)
00034788000i[CPU0 ] | CR0=0x00000010 CR1=0 CR2=0x00000000
00034788000i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00034788000i[ ] restoring default signal behavior
00034788000i[CTRL ] quit_sim called with exit code 1
Müsste also alles glatt laufen.
Allerdings einige Fragen:
1. CS steht ja weiterhin auf 07c0h.
AUf den Speicher über 1 MB kann ich jetzt nur mittels FS und GS zUgreifen.
Wenn ich jetzt aber z.b. irgendwelche Daten mit CS addressiere?
Z.B.: MOV AX; [CS:0B8000H]
Dann tritt wohl ein ganz normaler Fehler auf (Speicherzugriffsfehler o.ä.)?
2. Ich kann also sowohl mit dem ganz normalen Segmentregister Zeugs auf den 1MB Speicher zugreifen, als auch mit dem Selektor auf den Teil über 1MB?
Der User (auch Anwendugsprogrammierer) merkt also praktisch nix davon?
3. Kann ich auch Programme in dem Speicher ausführen?
Weil:
CS steht ja weiterhon auf 07c0h.
Wenn ich nun den Kernel an z.b. 0x20000 lade, wie kann ich diesen anspringen?
4. Angenommen ich will jetzt mit dem INT13H einen Sektor über die 1MB hinaus kopieren.
Mit dem BIOS INT dürfte das ja wohgl nicht gehen?
Ich müsste wohl zuerst den Sektor in das untere MB laden und anschliesend die 512Byte irgendwo über die 1MB hinaus kopieren?
Ich weis, dass all dies eigentlich Fragen sind, die ich durch Ausprobieren selber rausfinden könnte, aber ich bin, wies leider so ist, zu faul
Ich denke, das kennt ihr auch und hoffe, ihr helft mir trotzdem.