源码剖析之ntoskrnl

源码剖析之ntoskrnl

ID:23161221

大小:89.60 KB

页数:22页

时间:2018-11-04

源码剖析之ntoskrnl_第1页
源码剖析之ntoskrnl_第2页
源码剖析之ntoskrnl_第3页
源码剖析之ntoskrnl_第4页
源码剖析之ntoskrnl_第5页
资源描述:

《源码剖析之ntoskrnl》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、第一章ntoskrnl2一系统启动3二Idle进程6三初始化内核71内核初始化综述72初始化内核结构103初始化进程对象114初始化线程对象125初始化执行体156初始化硬件体系层187初始化执行体组件21第一章ntoskrnlNtoskrnl程序位于privatetosinit目录下,其入口有2个:ntkrnlmp.c、ntoskrnl.c,但ntkrnlmp.c只有一句代码:#include"ntoskrnl.c",2个其实是1个。ntoskrnl的主函数里仅仅调用了KiSystemStar

2、tup函数,ntoskrnl的入口函数还是要看KiSystemStartup函数了。一系统启动KiSystemStartup函数_KiSystemStartup函数的实现代码位于privatetoskei386ewsysbg.asm文件中。这个模块是台湾的宗世麟(Shie-LinTzong(shielint))在1990年编写的,国立台湾大学82届资讯系毕业,他编写了nt4内核的X86汇编代码。(遐想:Windows内核代码居然有台湾人参与,但中国大陆却无人参与,可叹!难道中国只能开发应用

3、软件,无人能做系统软件的开发吗?别跟我提那些只会做皮不会写瓤的中国Linux厂商。)启用每个CPU时都会调用此函数,分2种情况:启动CPU、其他CPU,执行操作有细微不同。CPU的数量保存在几个变量中(_KeNumberProcessors、KissPbNumber)。CPU0使用的线程对象、堆栈空间是静态内存,线程对象(ETHREAD)是P0BootThread,堆栈空间是P0BootStack,大小03000H(12K)。CPU0设置FS=KGDT_R0_PCR(030H)。所有的CPU都调用Ki

4、InitializeMachineType函数获取机器类型,函数位于privatetoskei386i386init.c文件中。机器类型保存在加载参数块中(计算方法:KeLoaderBlock->u.I386.MachineType&0x000ff),各个字节的含义如下:字节含义Byte0MachineType,ISA,EISAorMCAByte1CPUtype,i386ori486Byte2CpuStep,AorB...etcHighestbitindicatesifNPXispresen

5、t调用GetMachineBootPointers函数获取相关的gdt、pcr、tss、idt地址,调用sgdt指令加载gdt获取地址,通过FS保存的PCR选择子获取PCR地址,通过str指令加载TSS选择子获取TSS地址,通过sigt指令加载idt获取地址。GDT中的TSS(28h)描述符是16位的,需要修改为32位,初始化TSS,加载此TSS选择子到TR寄存器。286CPU使用16位TSS格式。TSS描述符的第5个字节设置为89h(dpl=0,present,TSS32,notbusy),则设置成

6、了32位TSS。初始化TSS分2种情况,1种是初始化静态不变的TSS成员(KiInitializeTSS),1种是初始化仅需要设置1次的成员(KiInitializeTSS2函数)。KiInitializeTSS函数设置TSS静态成员。IoMapBase设置为IO_ACCESS_MAP_NONE的IOPM偏移地址,在V86模式时IO进入硬件。flag(T)为0,任务切换时不引起调试异常。LDT为0,即不使用LDT。Ss0为KGDT_R0_DATA(010H)。KiInitializeTSS2函数设置仅

7、需要设置1次的成员。Limit设置为(sizeof(KTSS)-1)。TSS有2张MAP,Tss->IoMaps中的IoMap设置为-1。Tss->IoMaps中的DirectionMap(软中断重定向)设置为0。Tss->IntDirectionMap(IO_ACCESS_MAP_NONE)设置为0,设置双重错误(doublefault)、NMI中断的任务门。需要设置IDT、GDT、TSS。双重错误任务门是8号中断,位于IDT中的40h,设置任务门的05h字节为85h(dpl=0,present,t

8、askgate),任务门的02h字节(TSSSegmentSelector)为KGDT_DF_TSS。双重错误任务门的门描述符位于GTD+KGDT_DF_TSS,05字段设置为089h,基地值BASE设置为_KiDoubleFaultTSS,LIMIT设置为MINIMUM_TSS_SIZE(068H)。调用_KiInitializeTSS函数初始化TSS段_KiDoubleFaultTSS,CR3设置为当前CPU的CR3,EIP=_KiTrap08,ef

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。