;=----------------------------------------------------------------------------=; ; 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