99 lines
6.4 KiB
NASM
99 lines
6.4 KiB
NASM
|
;=----------------------------------------------------------------------------=;
|
||
|
; GNU GPL OS/K ;
|
||
|
; ;
|
||
|
; Authors: spectral` ;
|
||
|
; NeoX ;
|
||
|
; ;
|
||
|
; Desc: Basic Memory Realmode Driver ;
|
||
|
; (x86_64 architecture only) ;
|
||
|
;=----------------------------------------------------------------------------=;
|
||
|
|
||
|
[BITS 16]
|
||
|
|
||
|
;; GDT WITH DOC
|
||
|
GDT64:
|
||
|
NULL_SELECTOR: ;; null selector within 64 bits
|
||
|
dw GDT_LENGTH ; limit of GDT
|
||
|
dw GDT64 ; linear address of GDT
|
||
|
dd 0x0 ;
|
||
|
|
||
|
CODE_SELECTOR: ;; 32-bit code selector (ring 0)
|
||
|
dw 0x0000FFFF ; Segment Limit
|
||
|
db 0x0, 0x0, 0x0 ; Base Address
|
||
|
db 10011010b ; |7|6|5|4|3|2|1|0|
|
||
|
; | | | | | | | `----- 1 when segment used.
|
||
|
; | | | | | | `------ 1 when writable.
|
||
|
; | | | | | `------- 1 if "conformant". Don't know what is it... spectral ? xD
|
||
|
; | | | | `-------- 1 always
|
||
|
; | | | `--------- 1 for segment descriptor, 0 for system descriptor
|
||
|
; | | `---------- DPL !!! 0 for ring 0
|
||
|
; | `----------- DPL (2/2)
|
||
|
; `------------ 1 if in physical memory, 0 if page fault
|
||
|
db 11001111b ; |7|6|5|4|3|2|1|0|
|
||
|
; | | | | | | | `----- Limit 16
|
||
|
; | | | | | | `------ Limit 17
|
||
|
; | | | | | `------- Limit 18
|
||
|
; | | | | `-------- Limit 19
|
||
|
; | | | `--------- available for use
|
||
|
; | | `---------- 0 always
|
||
|
; | `----------- size of data. 1 for 32bits
|
||
|
; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko)
|
||
|
db 0x0 ; Base Address
|
||
|
|
||
|
DATA_SELECTOR: ;; flat data selector (ring 0)
|
||
|
dw 0x0000FFFF ; Segment Limit
|
||
|
db 0x0, 0x0, 0x0 ; Base Address
|
||
|
db 10010010b ; |7|6|5|4|3|2|1|0|
|
||
|
; | | | | | | | `----- 1 when segment used.
|
||
|
; | | | | | | `------ 1 when writable.
|
||
|
; | | | | | `------- expansion direction. 1 for a LIFO
|
||
|
; | | | | `-------- 1 always
|
||
|
; | | | `--------- 1 for segment descriptor, 0 for system descriptor
|
||
|
; | | `---------- DPL !!! 0 for ring 0
|
||
|
; | `----------- DPL (2/2)
|
||
|
; `------------ 1 if in physical memory, 0 if page fault
|
||
|
db 10001111b ; |7|6|5|4|3|2|1|0|
|
||
|
; | | | | | | | `----- Limit 16
|
||
|
; | | | | | | `------ Limit 17
|
||
|
; | | | | | `------- Limit 18
|
||
|
; | | | | `-------- Limit 19
|
||
|
; | | | `--------- available for use
|
||
|
; | | `---------- 0 always
|
||
|
; | `----------- size of data. 1 for 32bits
|
||
|
; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko)
|
||
|
db 0x0 ; Base Address
|
||
|
|
||
|
LONG_SELECTOR: ;; 64-bit code selector (ring 0)
|
||
|
dw 0x0000FFFF ; Segment Limit
|
||
|
db 0x0, 0x0, 0x0 ; Base Address
|
||
|
db 10011010b ; |7|6|5|4|3|2|1|0|
|
||
|
; | | | | | | | `----- 1 when segment used.
|
||
|
; | | | | | | `------ 1 when writable.
|
||
|
; | | | | | `------- 1 if "conformant". Don't know what is it... spectral ? xD
|
||
|
; | | | | `-------- 1 always
|
||
|
; | | | `--------- 1 for segment descriptor, 0 for system descriptor
|
||
|
; | | `---------- DPL !!! 0 for ring 0
|
||
|
; | `----------- DPL (2/2)
|
||
|
; `------------ 1 if in physical memory, 0 if page fault
|
||
|
db 10101111b ; |7|6|5|4|3|2|1|0|
|
||
|
; | | | | | | | `----- Limit 16
|
||
|
; | | | | | | `------ Limit 17
|
||
|
; | | | | | `------- Limit 18
|
||
|
; | | | | `-------- Limit 19
|
||
|
; | | | `--------- available for use
|
||
|
; | | `---------- 0 always
|
||
|
; | `----------- size of data. 1 for 32bits
|
||
|
; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko)
|
||
|
db 0x0 ; Base Address
|
||
|
GDT_LENGTH:
|
||
|
|
||
|
;; TEXT
|
||
|
|
||
|
set_a20:
|
||
|
push ax
|
||
|
in al, 0x92
|
||
|
or al, 2
|
||
|
out 0x92, al
|
||
|
pop ax
|
||
|
ret
|