欢迎来到天天文库
浏览记录
ID:40108553
大小:871.31 KB
页数:90页
时间:2019-07-21
《内核引导启动程序》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux操作系统内核分析湘潭大学信息工程学院讲课内容bootsect.s程序分析setup.s程序分析head.s程序分析要求大家知道每个程序的作用!操作系统引导应用程序操作系统引导程序BIOS装载装载装载??磁盘结构磁道:不同半径的同心圆称为磁道扇区:512B磁头:每个磁盘有两个面,每个面都有一个磁头使用磁头号、柱面号、扇区号可唯一确定一个扇区引导扇区引导扇区是磁盘的第一个扇区(0磁头0磁道1扇区)。引导扇区中的程序是负责装载操作系统的程序,被成为自举程序或引导程序(bootstrap)。限制:自举
2、程序的大小为512B,且最后两个字节必须为0xaa55。开机过程开机BIOS完成加电自检将引导盘的引导扇区读入到物理内存0x7c00处检查0x7c00+510开始的两个字节是否是0xaa55跳到0x7c00执行P36实模式内存寻址段内偏移0154段地址015+019段地址015物理地址逻辑地址基地址64K1M段地址:段内偏移bootsect程序bootsect程序就是一个引导程序,负责把Linux操作系统内核从存储设备装入内存。用汇编语言编写,遵循Intel汇编语法装载过程0x0000000x007c0
3、00x0100000x0900000x0902000x100000setupbootsectsystem移动自己movw指令:从ds:si移动一个字到es:di,然后根据标志寄存器中direct标志位,把si和di分别加2(d=0)或减2(d=1)。rep:重复执行后面的命令,重复次数放在cx寄存器中,每执行一次后面的命令则把cx中的值减1,直到cx为0。移动自己ds=0x7c0;si=0;//0x7c0:0es=0x9000;di=0;//0x9000:0cx=256;While(cx>0){从ds:
4、si移动一个字到es:di;if(d==0){si+=2;di+=2;}else{si-=2;di-=2;};cx--;}移动自己0x7c00x9000gogoJumpigo,initseg装载中断0x13中断,2号功能类似于函数:intload(驱动器号,磁头号,磁道号,扇区号,要读扇区数量,读入内存地址)P39第67装载setup驱动器号:软盘磁头号:0磁头磁道号:0磁道开始扇区号:2(?)要读扇区数量:4读入内存地址:0:0x90200装载System限制13中断一次只能读同一磁道上的扇区实模式下
5、内存段大小不能超过64K解决方法一次读一个扇区读完后检测磁道是否读完,是则调整到下一个磁道;检测内存段是否满了,是则调整到下一个内存段。装载System未读入已读入Min(未读入扇区字节大小,内存段空余字节大小)装载System磁盘读取规则:当0磁头的某个磁道读完,下一次就读1磁头的相同磁道;当1磁头的某个磁道读完,下一次就读0磁头的下一个磁道。例如:0磁头0磁道,1磁头0磁道,0磁头1磁道,1磁头的1磁道。装载system1、if(已读大小>=64K)then段地址+=64K;已读大小=0;2、可读入
6、的扇区数量=(64k-已读大小)/512B;3、if(可读入的扇区数量+当前扇区号>=磁道扇区总量)then可读入的扇区数量=磁道扇区总量-当前扇区号;4、读入5、if(磁道上无剩余扇区)thenif(磁头号为0)then磁头号=1;扇区号=1;else磁头号=0;磁道号++;扇区号=1;跳入setup139行jmpi0,SETUPSEG在37行定义为0x9020虚拟地址:0x9020:0物理地址:0x90200setup的开始地址讲课内容bootsect.s程序分析setup.s程序分析head.s程
7、序分析程序功能1-106行:获取并保存系统参数113-126行:移动system130-193行:进入保护模式获得并保存系统参数通过BIOS中断调用获得系统参数把获得的系统参数保存在0x90000开始的内存块中还记得0x90000地址上的内容吗?程序举例38行读光标位置:0x10中断0x03功能:输入参数:ah:0x03bh:页号输出参数:dh:行号dl:列号movax,0x9000movds,axmovah,0x03xorbh,bhint0x10mov[0],dxds:程序举例获得内存大小:0x15中
8、断0x88功能:输入参数:ah:0x88输出参数:ax:扩展内存大小,单位KBmovah,#0x88int0x15mov[2],ax系统参数保存布局程序功能1-106行:获取并保存系统参数113-126行:移动system130-193行:进入保护模式移动system把System从0x10000(64K)移到0x00000为什么一开始不把system装载到物理内存0x00000处?在bootsect和setup前一段程序中用到了实模式下的
此文档下载收益归作者所有