阅读:3013回复:0
HalInitSystem函数
初始化X86系统的硬件体系层(HAL)。
调用KeGetCurrentPrcb函数获取当前的PRCB。 Phase0、Phase1阶段处理不同。 在Phase0阶段,做以下处理。 从参数中获取总线类型(LoaderBlock->u.I386.MachineType & 0x00ff),保存到HalpBusType中。 调用HalpGetParameters函数从参数(LoaderBlock)中获取boot.ini选项中的"PCILOCK"、"BREAK"的值。 检验PRCB的版本、BUILD标识(BuildType)与镜像的值是否一致。 检验调试模式是否一致,如果是调试模式,但BuildType没有设置PRCB_BUILD_DEBUG(0x0001)值,或是不是调试模式,但BuildType设置了PRCB_BUILD_DEBUG值,则调试模式不匹配,报MISMATCHED_HAL蓝屏。 如果没有定义NT_UP,则检查处理器标识,如果BuildType设置了PRCB_BUILD_UNIPROCESSOR(0x0002)值,则报MISMATCHED_HAL蓝屏。 检查PRCB的主版本,如果MajorVersion 不等于PRCB_MAJOR_VERSION(1),则报MISMATCHED_HAL蓝屏。 检验总线类型是否一致,如果是MCA总线,但总线类型没有设置MACHINE_TYPE_MCA(2)值,则报MISMATCHED_HAL蓝屏;如果是ISA/EISA总线,但总线类型设置MACHINE_TYPE_MCA值,则报MISMATCHED_HAL蓝屏; 调用HalpInitializePICs函数初始化AST中断环境。 调用KeGetCurrentIrql函数(PCR->CurrentIrql)获取当前的IRQL,再调用KfRaiseIrql函数提升IRQL到当前的IRQL级别。 调用HalpInitializeCmos函数读取CMOS,初始化访问CMOS时需要的全局变量,比如:CMOS世纪信息偏移(_HalpCmosCenturyOffset)。 设置HAL支持的API的句柄,HalQuerySystemInformation为HaliQuerySystemInformation函数,HalSetSystemInformation为HaliSetSystemInformation函数。 调用HalpRegisterVector函数注册IDT数组。数组HalpIDTUsage的(PIC_SLAVE_IRQ + PRIMARY_VECTOR_BASE)项的Flags设置为InternalUsage(0x11),Irql设置为HIGH_LEVEL(31),BusReleativeVector设置为(PIC_SLAVE_IRQ + PRIMARY_VECTOR_BASE)。 调用HalpRegisterAddressUsage函数注册基本IO地址空间,先注册HalpDefaultPcIoSpace,如果总线类型是MACHINE_TYPE_EISA(1),再注册HalpEisaIoSpace。 调用HalpInitializeStallExecution函数初始化KeStallExecutionProcessor函数用到的每个毫秒计数器。 调用HalpInitializeClock函数初始化系统时钟,8254时钟每隔15毫秒产生1个中断。 调用HalStopProfileInterrupt函数关闭profiling hit computation、优先级中断。 调用HalpInitializeDisplay函数初始化VGA显示,主要是调用HalpMapPhysicalMemory函数映射显存(0xb8000 - 0xba000)到高端虚拟内存。 调用KeInitializeSpinLock函数初始化硬件访问函数(HalGetBusData)用到的锁(HalpSystemHardwareLock)。 变量LessThan16Mb标识物理内存是否高于16M。默认值是为TRUE。遍历LoaderBlock的内存描述符,如果存在物理内存高于16M,则设置变量LessThan16Mb为FALSE。 根据变量LessThan16Mb值设置映射内存大小(HalpMapBufferSize),如果为TRUE,则HalpMapBufferSize为INITIAL_MAP_BUFFER_SMALL_SIZE(0x10000),否则为INITIAL_MAP_BUFFER_LARGE_SIZE(0x30000)。 调用HalpAllocPhysicalMemory函数申请适配器对象的映射内存,如果申请失败,则HalpMapBufferSize设置为0. 如果是Pahse1阶段,且是P0处理器,做以下处理。 调用HalpRegisterInternalBusHandlers函数注册总线句柄。 调用HalpGetFeatureBits函数获取处理器特征值,保存到变量HalpFeatureBits中。 调用HalpEnableInterruptHandler函数注册中断句柄,时钟中断(CLOCK_VECTOR)为HalpClockInterrupt,优先级中断(PROFILE_VECTOR)为HalpProfileInterrupt,如果CPU类型为386以上,则设置中断I386_80387_VECTOR为HalpIrq13Handler。 如果是多处理器,则调用HalpInitMP函数初始化多处理器。 |
|