资源描述:
《windows nt引导过程源代码分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Windows引导过程Windows内核中的各个组件和各种机制在起作用以前,必须首先被初始化。此初始化工作是在系统引导时完成的。当用户打开计算机的电源开关时,计算机便开始运行,但操作系统并不立即获得控制权,而是BIOS代码首先获得控制,它执行必要的硬件检测工作,并允许用户通过一些功能键来配置当前系统中的硬件设置,甚至诊断硬件问题,然后才将控制权交给操作系统。1.1内核加载在Intelx86系统上,Windows操作系统获得控制首先从硬盘的主引导记录(MBR,MasterBootRecord)开始,WindowsSetup程序在安装Windo
2、ws时填充MBR(其他的磁盘管理程序也可能填充MBR)。MBR包含代码和数据,其代码称为引导代码,在系统引导时首先获得控制;MBR中的数据是一张分区表,指定了每个分区在磁盘上的位置和大小,以及分区的类型。当MBR中的引导代码被执行时,它检查分区表中的每一个分区,若找到一个已被标记为可引导的分区(称为引导分区),则将该分区的第一个扇区(称为引导扇区)读到内存中。由于分区表包含了每一个分区的磁盘位置,所以,引导扇区的位置很容易被确定。然后MBR的代码将控制权交给引导扇区中的代码。;此处代码摘自NT4代码的privatetosbootb
3、ootcodex86mboot.asmrelocated_orgequ0600hbuildtime_orgequ0100horg_deltaequ(relocated_org-buildtime_org)_datasegmentpublicassumecs:_data,ds:_dataorgbuildtime_org;这段代码读出位于主引导记录末尾的分区表,找到标志为可引导的分区,把它的引导扇区拷贝到内存中并执行start:cli;开始的时候并没有中断xorax,axmovss,axmovsp,7c00h;位于地址0:7c00处的新堆栈m
4、ovsi,sp;0:7c00为标准引导地址pushaxpopespushaxsti;允许中断cldmovdi,relocated_orgmovcx,100hrepmovsw;重定位到地址0000:0600,跳到这里从分区表中读取可引导分区的入口,把引导分区拷贝到内存的标准引导地址(0000:7C00);jmpentry2+org_deltadb0eahdw$+4+org_delta,0entry2:movsi,(offsettab)+org_delta;表示分区表movbl,4;分区表项的个数next:cmpbyteptr[si],80h;
5、判断是否是可以引导的入口jeboot;yescmpbyteptr[si],0;再次判断是否为0jnebad;不是,只有x"00"或者x"80"是有效的addsi,16;执行到下一个入口点decbljnznextint18h;未检测到可引导的入口,返回boot:movdx,[si];引导开始处movcx,[si+2]movbp,si;保存表入口地址并传给分区引导记录next1:addsi,16;下一个表项decbl;表项数目递减jztabokcmpbyteptr[si],0;所有剩余的表入口都要从0开始jenext1;满足上述判断条件bad:
6、movsi,(offsetm1)+org_delta;无法找到一个从0开始的表项入口,该表为坏表msg:lodsb;获取显示信息的字符cmpal,0jeholdpushsimovbx,7movah,14int10h;显示信息popsijmpmsg;循环打印完整信息hold:jmphold;此处自旋,不做任何事tabok:movdi,5;计数值rdboot:movbx,7c00h;读取系统引导记录的位置movax,0201h;读取一个扇区pushdiint13h;获取引导记录popdijncgoboot;成功得到引导记录,交与控制权xorax
7、,ax;出现错误int13h;重新校准decdi;递减计数值jnzrdboot;只要计数值仍大于0,就继续尝试movsi,(offsetm2)+org_delta;所有的入口都已检测完毕,错误无法避免jmpmsg;跳转到显示错误信息goboot:movsi,(offsetm3)+org_deltamovdi,07dfehcmpwordptr[di],0aa55h;判断引导记录是否有效jnemsg;无效,则显示无效的系统引导记录信息movsi,bp;有效,则将分区表入口地址传给它db0eahdw7c00h,0includex86mboot.m
8、sgorg2beh;此处显示了主引导记录的结构tab:;partitiontabledw0,0;partition1begindw0,0;partition1enddw0,0;p