📄 kstart.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 32-bit kernel startup code;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; macros to handle leading underscores added by DOS/Windows compilers%macro IMP 1%ifdef UNDERBARS EXTERN _%1 %define %1 _%1%else EXTERN %1%endif%endmacroDS_MAGIC equ 3544DA2AhSECTION .textBITS 32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; entry point;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GLOBAL entryentry:; check if data segment linked, located, and loaded properly mov eax,[ds_magic] cmp eax,DS_MAGIC je ds_ok; display a blinking white-on-blue 'D' and freeze mov word [0B8000h],9F44h jmp short $ds_ok:; stop using bootloader GDT, and load new GDT lgdt [gdt_ptr] mov ax,LINEAR_DATA_SEL mov ds,ax mov es,ax mov ss,ax mov fs,ax mov gs,ax jmp LINEAR_CODE_SEL:sbatsbat:; zero the C language BSS; 'bss' and 'end' are defined in the linker script fileEXTERN bss, end mov edi,bss mov ecx,end sub ecx,edi xor eax,eax rep stosb mov esp,stackIMP main call main ; call C code jmp $ ; freeze;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Multiboot header for GRUB bootloader. This must be in the first 8K; of the kernel file. We use the aout kludge so it works with ELF,; DJGPP COFF, Win32 PE, or other formats.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MULTIBOOT_PAGE_ALIGN equ 1<<0MULTIBOOT_MEMORY_INFO equ 1<<1MULTIBOOT_AOUT_KLUDGE equ 1<<16MULTIBOOT_HEADER_MAGIC equ 0x1BADB002MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGEMULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS); these are in the linker script fileEXTERN code, bss, endALIGN 4mboot: dd MULTIBOOT_HEADER_MAGIC dd MULTIBOOT_HEADER_FLAGS dd MULTIBOOT_CHECKSUM; aout kludge. These must be PHYSICAL addresses dd mboot dd code dd bss dd end dd entry;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SECTION .datads_magic: dd DS_MAGICgdt:; NULL descriptor dw 0 ; limit 15:0 dw 0 ; base 15:0 db 0 ; base 23:16 db 0 ; type db 0 ; limit 19:16, flags db 0 ; base 31:24; unused descriptor dw 0 dw 0 db 0 db 0 db 0 db 0LINEAR_DATA_SEL equ $-gdt dw 0FFFFh dw 0 db 0 db 92h ; present, ring 0, data, expand-up, writable db 0CFh ; page-granular (4 gig limit), 32-bit db 0LINEAR_CODE_SEL equ $-gdt dw 0FFFFh dw 0 db 0 db 9Ah ; present,ring 0,code,non-conforming,readable db 0CFh ; page-granular (4 gig limit), 32-bit db 0gdt_end:gdt_ptr: dw gdt_end - gdt - 1 dd gdt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SECTION .bss resd 1024stack:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -