; --------------------------- loader和kernel -------------------------------------------------------------------------------------------------------------------- LOADER_BASE_ADDR equ 0x900 ; loader 在内存中的位置 LOADER_START_SECTOR equ 0x2 ; loader 在硬盘上的逻辑扇区地址,即 LBA 地址 PAGE_DIR_TABLE_POS equ 0x100000 ; 页目录表物理地址 KERNEL_START_SECTOR equ 0x9 ; kernel 在硬盘上的逻辑扇区地址 KERNEL_BIN_BASE_ADDR equ 0x70000 ; kernel 在内存中的位置 KERNEL_ENTRY_POINT equ 0xc0001500 ; ---------------------------- GDT 描述符属性 ----------------------------------------------------------------------------------------------------------------------- ; 段描述符格式 ; 31~24 23 22 21 20 19~16 15 14~13 12 11~8 7~0 ; ---------------------------------------------------------- ; |Base | G | D | L |AVL| Limit | P | DPL | S | TYPE | Base | ; ---------------------------------------------------------- ; 31~16 15~0 ; ---------------------------------------------------------- ; | Base | Limit | ; ---------------------------------------------------------- DESC_G_4K equ 1000_0000_0000_0000_0000_0000b ; 第23位G 表示4K或者1MB位 段界限的单位值 此时为1则为4k DESC_D_32 equ 100_0000_0000_0000_0000_0000b ; 第22位D/B位 表示地址值用32位EIP寄存器 操作数与指令码32位 DESC_L equ 00_0000_0000_0000_0000_0000b ; 第21位 设置成0表示不设置成64位代码段 忽略 DESC_AVL equ 0_0000_0000_0000_0000_0000b ; Reserved for future use DESC_LIMIT_CODE2 equ 11110000000000000000b ; 第16-19位 段界限的最后四位 全部初始化为1 因为最大段界限*粒度必须等于0xffffffff DESC_LIMIT_DATA2 equ DESC_LIMIT_CODE2 DESC_LIMIT_VIDEO2 equ 00000000000000000000b DESC_P equ 1000000000000000b ; 段是否存在。由 CPU 来检查,如果为 0,CPU 将抛出异常 ; DPL 表示 4 种特权级,分别是 0、1、2、3 级特权,数据越小,特权越大 DESC_DPL_0 equ 000000000000000b DESC_DPL_1 equ 010000000000000b DESC_DPL_2 equ 100000000000000b DESC_DPL_3 equ 110000000000000b DESC_S_CODE equ 1000000000000b ; s 为 0 表示系统段,S 为 1 表示非系统段 DESC_S_DATA equ DESC_S_CODE DESC_S_SYS equ 0000000000000b DESC_TYPE_CODE equ 100000000000b ; x=1,c=0,r=0,a=0 代码是可执行的,非一致性,不可读,已访问位 a 清 0 DESC_TYPE_DATA equ 001000000000b ; x=0,e=0,w=1,a=0 数据段是不可执行的,向上扩展,可写,已访问位 a 清 0 DESC_CODE_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_CODE2 + DESC_P + DESC_DPL_0 + DESC_S_CODE + DESC_TYPE_CODE + 0x00 DESC_DATA_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_CODE2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x00 DESC_VIDEO_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_VIDEO2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x0b ; ------------------------------------- 选择子属性 --------------------------------------------------------------------------------------------------------------- RPL0 equ 00b RPL1 equ 01b RPL2 equ 10b RPL3 equ 11b TI_GDT equ 000b TI_LDT equ 100b ; ---------------------- 页表相关属性 ---------------------------------------------------------------------------------------------------------------------------- PG_P equ 1b PG_RW_R equ 00b PG_RW_W equ 10b PG_US_S equ 000b PG_US_U equ 100b ; -------------------------------- 程序中的段类型 p_type ----------------------------------------------------------------------------------------------------------- PT_NULL equ 0 PT_LOAD equ 1 ; 可加载程序段 PT_DYNAMIC equ 2 ; 动态链接信息 PT_INTERP equ 3 ; 动态加载器名称 PT_NOTE equ 4 ; 一些辅助的附加信息 PT_SHLIB equ 5 ; 保留 PT_PHDR equ 6 ; 程序头表