首页 > 编程知识 正文

嵌入式系统硬件开发工具(windows loader)

时间:2023-05-04 23:00:53 阅读:73811 作者:2381

带你写操作系统-Loader 0.当前代码结构

1. Loader程序需要做什么? Loader必须打开保护模式。 必须准备GDT以打开保护模式。 Loader需要加载Kernel程序。 2 .什么是保护模式? 以前操作的内存只有1M以内,而当前操作系统通常是4G或更高内存,因此需要处理更多内存。 以前的程序可以在任何地方更改。 运行这种没有安全限制的操作用户程序是不安全的。 集中打开1M以上的内存区域,安全检查内存区域。 3 .将内存区域划分为不同级别,内核区域不允许用户程序操作。 如何在块中标记内核代码还是用户代码? 全局描述表(GDT )用于描述内存空间的详细信息,GDT很容易理解是谁在数组的每个元素项中记录了内存权限和其他信息,然后进行信息检查。 CPU实现了这些信息的验证,但需要根据CPU要求的GDT格式进行全局存储器的计划。 为了向CPU传达如何划分存储器权限的总结,需要向CPUCPU提供GDT记述表。 利用GDT检测各操作是否有权限的4. GDT的结构GDT结构如下图所示。 照片来源于《操作系统真象还原》

具体字段的说明

低位32位0-15 :表示当前所指存储器段的边界的高位16位,即从段基地址开始可利用的存储器大小,16-31 :段基地址的高位16位,当前段是从存储器的何处开始的高位32位0-7 :段基地址16-23位类型:表示当前段是什么类型,该字段需要与s字段协作,在s为1的情况下,表示非系统段(在此,非系统是CPU的外观我们写的操作系统也是非系统代码段) s为0,系统段S:0为系统段,1为非系统段DPL :访问当前段所需的权限,2位时为4个级别01 ) 2、数字越小权限越大p :表示当前描述符描述的内存段是否实际存在16-19 )段边界AVL )课堂上任意使用的l )表示当前段是否为64位代码,现在b )如果代码段,则这里d、d是有效地址位数,0是16位1是32位,如果堆栈段,则这里b、b是0是16位,如果1是32位,则G:是段边界的单位,0是字节,1是字节准备GDT描述符表现在准备以下3个描述符代码段描述符段基址。0x0段限制大小: 4G数据段描述符段基址:0x0段限制大小:0xb8000段限制大小:0xbffff减去0xb80000后的代码以下代码文件名common _ ining ----------------loader和kernel------------ loader _ base _ add requ0x 600 loader _ start _ sector equ -----------GDT描述符属性从第0位开始---------; 23位g,限制单位0=1byte1=4k desc _ g _ 4k equ1_ 000 _ 0000 _ 0000 _ 0000 _ 0000 _ 0000 _ 0000 b; 22位D/B 1是32代码操作数desc _ d _ 32 equ1_ 00 _ 0000 _ 0000 _ 0000 _ 0000 _ 0000 _ 0000 _ 0000 b; 21位L 64位代码标记,这里标记为0即可。 desc _ lequ0_0_ 0000 _ 0000 _ 0000 _ 0000 _ 0000 b; 20位AVL cpu不使用该位,暂时为0 desc _ AVL equ0_ 0000 _ 0000 _ 0000 _ 0000 _ 0000 _ 0000 _ 0000 b; 16-19位,段限制为1 desc _ limit _ code 2e qu 1111 _ 0000 _ 0000 _ 0000 _ 0000 _ 0000 b; 16-19位,段限制为1 desc _ limit _ data2equ desc _ limit _ code2desc _ limit _ video 2e qu 000 _ 0000 _ 0000 _ 0000 DESC_P equ 1000_0000_0000_0000b; 4个不同的权限desc _ DPL _0equ 000 _ 0000 _ 0000 _ 0000 b desc _ DPL _1equ 010 _ 0000 _ 0000 b desc _ DPL _ 2e qu100 _ 0000 _ 占用系统段时不使用DESC_S_sys equ 0_0000_0000_0000b; x=1、c=0、r=0、a=0的代码段是可执行的、无关的、不可读的,访问了位a清0.desc _ type _ code equ 1000 _ 0000 _ 0000 b; x=0,e=0

,w=1,a=0 数据段是不可执行的,向上扩展的,可写的,已访问位a清0.DESC_TYPE_DATA equ 0010_0000_0000b; 构造不同内存段类型的高32位; 代码段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_DATA2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x00; 显存段,注意最后的不是0, 而是0x0bDESC_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 00bRPL1 equ 01bRPL2 equ 10bRPL3 equ 11bTI_GDT equ 000bTI_LDT equ 100b 在Loader文件中正式定义三个段描述符 %include "common_info.conf"section loader vstart=LOADER_BASE_ADDRLOADER_STACK_TOP equ LOADER_BASE_ADDRjmp loader_start ;构建gdt及其内部的描述符 GDT_BASE: dd 0x00000000 dd 0x00000000 CODE_DESC: dd 0x0000FFFF dd DESC_CODE_HIGH4 DATA_STACK_DESC: dd 0x0000FFFF dd DESC_DATA_HIGH4;因为单位是4K, 所以limit=(0xbffff-0xb8000)/4k=0x7 VIDEO_DESC: dd 0x80000007 dd DESC_VIDEO_HIGH4 GDT_SIZE equ $ - GDT_BASE GDT_LIMIT equ GDT_SIZE -1 times 10 dq 0 ; 相当于(CODE_DESC - GDT_BASE)/8 + TI_GDT + RPL0 SELECTOR_CODE equ (0x0001<<3) + TI_GDT + RPL0 SELECTOR_DATA equ (0x0002<<3) + TI_GDT + RPL0 ; 同上 SELECTOR_VIDEO equ (0x0003<<3) + TI_GDT + RPL0 ; 同上 ;以下是定义gdt的指针,前2字节是gdt界限,后4字节是gdt起始地址 gdt_ptr dw GDT_LIMIT dd GDT_BASEloader_start: mov sp, LOADER_BASE_ADDR mov byte [gs:0xa0],'L' mov byte [gs:0xa1],0xA4 mov byte [gs:0xa2],'O' mov byte [gs:0xa3],0xA4 mov byte [gs:0xa4],'A' mov byte [gs:0xa5],0xA4 mov byte [gs:0xa6],'D' mov byte [gs:0xa7],0xA4 mov byte [gs:0xa8],'E' mov byte [gs:0xa9],0xA4 mov byte [gs:0xaa],'R' mov byte [gs:0xab],0xA4;---------------------------------------- 准备进入保护模式 -----------------------------;1 打开A20;2 加载gdt;3 将cr0的pe位置1 ;----------------- 打开A20 ---------------- in al,0x92 or al,0000_0010B out 0x92,al ;----------------- 加载GDT ---------------- lgdt [gdt_ptr] ;----------------- cr0第0位置1 ---------------- mov eax, cr0 or eax, 0x00000001 mov cr0, eax jmp SELECTOR_CODE:p_mode_start [bits 32]p_mode_start: mov ax, SELECTOR_DATA mov ds, ax mov es, ax mov ss, ax mov esp,LOADER_STACK_TOP mov ax, SELECTOR_VIDEO mov gs, ax mov byte [gs:320], 'P' mov byte [gs:322], 'R' mov byte [gs:324], 'O' mov byte [gs:326], 'T' mov byte [gs:328], 'E' mov byte [gs:330], 'C' mov byte [gs:332], 'T' hlt 6. 代码编译脚本 在环境中的文件

bochs配置文件中的内容 romimage: file=/usr/local/share/bochs/BIOS-bochs-latestvgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest#floppya: 1_44=boot.img, status=insertedata0-master: type=disk, path="boot.img", mode=flatboot: disk 具体编译脚本 # 编译之前的Boot脚本nasm boot.asm -o boot.bin# 编译loadernasm -I include/ loader.asm -o loader.bin# 将loader.bin写入第二个扇区dd if=loader.bin of=boot.img bs=512 count=10 seek=2 conv=notrunc# bochs 启动bochs -f bochsConf 7. 最终效果 打印效果

GDT信息查看

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。