您的位置:首页 > 其它

60(82)---windows internals 6 mark david alex

2013-02-01 06:11 246 查看
实验:查看KPCR和KPRCB
通过内核调试器的!pcr和!prcb可以分别查看KPCR和KPRCB
默认情况下展示处理器0的信息,加上参数可以查看任意cpu的信息(!prc 2 查看第3个cpu)。在作者的机器上,输出如下
lkd> !pcr

KPCR for Processor 0 at 81d09800:

Major 1 Minor 1

NtTib.ExceptionList: 9b31ca3c

NtTib.StackBase: 00000000

NtTib.StackLimit: 00000000

NtTib.SubSystemTib: 80150000

NtTib.Version: 1c47209e

NtTib.UserPointer: 00000001

NtTib.SelfTib: 7ffde000

SelfPcr: 81d09800

Prcb: 81d09920

Irql: 00000002

IRR: 00000000

IDR: ffffffff
InterruptMode: 00000000

IDT: 82fb8400

GDT: 82fb8000

TSS: 80150000

CurrentThread: 86d317e8

NextThread: 00000000

IdleThread: 81d0d640

DpcQueue:

lkd> !prcb

PRCB for Processor 0 at 81d09920:

Current IRQL -- 0

Threads-- Current 86d317e8 Next 00000000 Idle 81d0d640

Number 0 SetMember 1

Interrupt Count -- 294ccce0

Times -- Dpc 0002a87f Interrupt 00010b87

Kernel 026270a1 User 00140e5e
可以用dt来查看_KPCR 和 _KPRCB。查看cpu速度的方法如下
lkd> dt nt!_KPRCB 81d09920 MHz

+0x3c4 MHz : 0xbb4

lkd> ? bb4

Evaluate expression: 2996 = 00000bb4
这台机器的CPU是3ghz。
硬件支持
内核的一个主要工作是隔离执行体和驱动程序,使它们不需要知道不同硬件平台的差异,如中断处理,异常处理,多处理器同步。
对于这些硬件相关的功能,内核设计也尽量最大化公共代码。内核支持一组接口,这些接口在不同的架构上是可移植并且语义相同。大多数实现这些接口的代码在不同架构上都是相同的。
有些接口在不同平台上是不一样的,或者部分用架构相关的代码来实现。这些架构无关的代码可以在任何机器上被调用,接口的语义是不变的,不管实现细节是否改变。一些内核接口(如自旋锁例程,第三章介绍)在HAL(下节介绍)中实现,因为他们在同一架构的不同系统上会有变化。
内核也包含一部分x86相关的接口来支持老的MS-DOS程序。x86接口是不可移植的,在其他架构上,他们不能被调用。x86特定的代码,支持操作GDT和LDT,这些只在x86上才有的。
内核中架构相关的代码,如支持翻译缓冲区和CPU 缓存的接口。在不同的架构上,需要不同的代码,因为缓存的实现机制不一样。
另一个例子是上下文切换。线程选择和上下文切换是一样的(保存之前的上下文,加载新的上下文并运行),有很多架构不同在不同的处理器上。上下文根据处理器而有变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: