Hallo,
ich habe noch nicht ganz mit gekriegt, ob Ihr über das Programm oder über Grundlagen
philosophiert.
Hier ein Ausschnitt vom Long Mode Programm.
<asm>
;Version_03.03.1_alpha_50s
;-----------------------------------------------
;nasm -f bin -o nasmA64_ioa.bin nasmA64_ioa.asm
;-----------------------------------------------
;Super I/O ->Up (call super_io ; call super_io_exit
;Chip IT8716F (IT8712)
;-----------
;KBC->Register auslesen (später manipulieren)
;call super_io_LDN_05_lesen
;-----------------------------------------------
;Programm_06 TEST-1 USB BAR-OHCI_0 (BAR FE02E000h)
;FE02E004h HcControl Register 04-07 IR-> Bit-8 Interrupt Routing
;
;amd64_longmode_Interface_00
;Tastatur_eingabe abfragen (64-bit 8-bit-schritte) dezimal oder hex
;Tastatur eingabe abfrage ja ,nein , Enter
;Funktions_tasten F1-10
;F1->Programm_Funktionsauswahl PROGRAMM_01-10 Programme in Arbeit
;Auswahl PROGRAMM_XX mit Zahlen->hier von 01-10
;PROGRAMM_01 : Auswahl Floppy lesen oder schreiben
;PROGRAMM_02: Speicherinhalt auf BWS anzeigen
;Adresse Quelldaten Eingabe mit Tastatur (64-bit)
;POGRAMM_03: Speicherinhalt auf BWS anzeigen
;-Adresse Quelldaten Eingabe mit Tastatur (32-bit)
;-Abfrage ja nein enter
;F2-F6 frei
;F7->FDC-schreiben
;F8->FDC-lesen
;F9->FDC-reset
;FDC_polling/Parameter-Eingabe-> PROGRAMM_01 sector und Wiederholung Xmal
;oder indirekt mit Assembler
;F10->anzeige_auf_bws
ORG 08000h
[BITS 16] ;
mov ah, 0x02
mov bh, 0x0
mov dh, 24 ; Zeile BWS
mov dl, 79 ; Spalte BWS
int 10h ; Cursor-Position
cli ; keine maskierbaren interrupt
lgdt [cs:gdtr] ; lade GDT Register
mov eax,cr0 ; Aktivierung protected mode
or al,1
mov cr0,eax
in al,92h ; enable A20
or al,02h
out 92h,al
jmp CODE_SELECTOR:pm_start
gdtr: ; Desktiptortabelle
dw gdt_end-gdt-1 ; Limit
dq gdt ; Basisadresse;;;dd -->dq
gdt:
dd 0,0 ; Null-Deskriptor
DATA_SELECTOR equ $-gdt
dw 0xFFFF ; Segmentgrösse 0..15
dw 0x0000 ; Segmentadresse 0..15
db 0x00 ; Segmentadresse 16..23
db 0x92 ; Zugriffsberechtigung und Typ
db 0x8F ; Zusatzinformationen und Segmentgrösse 16...19
db 0x00 ; Segmentadresse 24..31
CODE_SELECTOR equ $-gdt
dw 0xFFFF ; Segmentgrösse 0..15
dw 0x0000 ; Segmentadresse 0..15
db 0x00 ; Segmentadresse 16..23
db 0x9A ; Zugriffsberechtigung und Typ
db 0xCF ; Zusatzinformationen und Segmentgrösse 16...19
db 0x00 ; Segmentadresse 24..31
LONG_SELECTOR equ $-gdt
dw 0xFFFF ; Segmentgrösse 0..15
dw 0x0000 ; Segmentadresse 0..15
db 0x00 ; Segmentadresse 16..23
db 0x9A ; Zugriffsberechtigung und Typ
db 0xAF ; Zusatzinformationen und Segmentgrösse 16...19
db 0x00 ; Segmentadresse 24..31
gdt_end:
[BITS 32]
pm_start:
mov eax,DATA_SELECTOR ; load 4 GB data descriptor
mov ds,ax ; to all data segment registers
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
mov eax,cr4
or eax,00000000000000000000000000100000b; byte +0x20 ; or eax,1 shl 5
; or eax, 10100000b
mov cr4,eax ; enable physical-address extensions
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
mov edi,010000h
mov ecx,0xF000 ;mov ecx,4000h shr 2
xor eax,eax
rep stosd ; clear the page tables
;--------------------------------------------------------------------------------
mov dword [010000h],011000h + 111b ; first PDP table
mov dword [010008h],011008h + 111b ; zweite
mov dword [010010h],011010h + 111b ; dritte
mov dword [010018h],011018h + 111b ; vierte
mov dword [011000h],012000h + 111b ; first page directory
mov dword [011008h],013000h + 111b ; zweite
mov dword [011010h],014000h + 111b ; dritte
mov dword [011018h],015000h + 111b ; vierte
;-------------------------------------------------------------------
mov edi,12000h ;page table
mov eax,1000000h +111b
mov ecx, 2048 ;190 ;1mal 2MB
page_table:
stosd
add edi,0x4
add eax,0x1000
loop page_table
mov edi,1000000h ; address of first page table
mov eax,0 + 111b
mov ecx, 512*2048 ;512*1=2MB ;256 ; number of pages to map (1 MB)
make_page_entries: ;Bemerkung: 512*4=2048-->800h
stosd
add edi,4
add eax,1000h
loop make_page_entries
;------------------------------------------------------------------------------
mov eax,10000h ;010FF7h ;siehe first PDP table hier 10000h
mov cr3,eax ; load page-map level-4 base
mov ecx,0C0000080h ; EFER MSR
rdmsr
or eax, 0x100 ;or eax,1 shl 8 ; enable long mode
wrmsr
mov eax,cr0
or eax,10000000000000000000000000000000b ;0x80000000 ;or eax,1 shl 31
mov cr0,eax ;enable paging
jmp LONG_SELECTOR:long_start
[BITS 64] ;
long_start:
mov rsp, 0x200000 ;0x20000 ;stack /hat gefehlt 0x60 INT8 Double Fault
;0x80 geht gerade so
xor edi,edi ; create IDT (at linear address 0)
mov ecx,32 ;21
make_exception_gates: ; make gates for exception handlers
mov esi,exception_gate
movsq
movsq
loop make_exception_gates
mov ecx,256-32 ;21
make_interrupt_gates: ; make gates for the other interrupts
mov esi,interrupt_gate
movsq
movsq
loop make_interrupt_gates
;------------------------------------------------------------------------------
lidt [IDTR] ; load IDT register
;---------------------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;IDTR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IDTR: ; Interrupt Descriptor Table Register
dw 256*16-1 ; limit of IDT (size minus one)
dq 0 ; linear address of IDT
exception_gate:
dw 0x0 ; exception ; and 0FFFFh ;dw exception and 0FFFFh,LONG_SELECTOR
dw 0018h ;LONG_SELECTOR ;dw 8E00h,exception shr 16
dw 8E00h ;dd 0,0
dw 0x0 ;exception shr 16
dw 0x0 ; dd 0,0
dw 0x0
interrupt_gate:
dw 0x0 ; interrupt ; and 0FFFFh ;dw interrupt and 0FFFFh,LONG_SELECTOR
dw 0018h ;LONG_SELECTOR
dw 8F00h ;dw 8F00h,interrupt shr 16
dw 0x0 ;interrupt shr 16
dw 0x0 ; dd 0,0 ;dd 0,0
dw 0x0
;;;;;;;;;;;;;;;;;;;;;;;;;;IDTR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov word [0x00],softw_int0 ; exception divide
mov word [0x10],softw_int1 ; Software-Unterbrechung int 0x1
mov word [0x20],softw_int2 ; Software-Unterbrechung int 0x2
mov word [0x30],softw_int3 ; Software-Unterbrechung int 0x3
Hier weiter mit: mov word [0F6h*16],IRQ_22 ; set IRQ 22 handler
mov word [0F7h*16],IRQ_23 ; set IRQ 23 handler
;------------------------------------------------------------------
mov word [0xF80],softw_int80 ; Software-Unterbrechung int 0x80
mov word [0xF90],softw_int80 ; Software-Unterbrechung int 0x80
mov word [0xFA0],softw_int80 ; Software-Unterbrechung int 0x80
mov word [0xFB0],softw_int80 ; Software-Unterbrechung int 0x80
mov word [0xFC0],softw_int80 ; Software-Unterbrechung int 0x80
mov word [0xFD0],softw_int80 ; Software-Unterbrechung int 0x80
mov word [0xFE0],softw_int80 ; Software-Unterbrechung int 0x80
mov word [0xFF0],softw_int80 ; Software-Unterbrechung int 0x80
;------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;IDTR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IO_APIC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r8, 0xFEC00000
;-------------------------
mov byte [r8],0x10 ;select data register
mov r8, 0xFEC00010
mov dword [r8],0x100E0 ;8 bit-16->1 maskiert! ;0x0090 ;Vector (7:0) 10h - FEh /90h-Clock
;----------------------------------------------------------------------------------
mov r8, 0xFEC00000
;-------------------------
mov byte [r8],0x12 ;select data register
mov r8, 0xFEC00010
mov dword [r8],0x00E1 ;Vector (7:0) 10h - FEh /91h-Keyboard IRQ1
;--------------------------------------------------------------------------------
mov r8, 0xFEC00000
<asm>
Gruß Relbmessa