gjlmp
驱动牛犊
驱动牛犊
  • 注册日期2010-10-09
  • 最后登录2014-01-09
  • 粉丝5
  • 关注3
  • 积分21分
  • 威望124点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分35分
阅读:2810回复:0

HalInitSystem函数

楼主#
更多 发布于:2012-03-18 11:23
初始化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函数初始化多处理器。
游客

返回顶部