Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: 初学者   发起时间: 2009-03-28 00:01 上午   回复: 5

Print Search
帖子排序:    
   2009-03-28, 00:01 上午
suck007 离线,最后访问时间: 2009/3/28 5:47:33 初学者

发帖数前150位
注册: 2009-03-21
发 贴: 7
请问在多核下面的IDT表,为什么ISR都是一样的?
Reply Quote

分别KeSetAffinityThread绑定cpu以后,提升irql,我的双核机器,得到两张IDT表

打印发现,两张表的ISR都是一样的,想请问一下,windows下面,多核的isr都是一样的还是只是偶然?

资料上说,每个处理器都有独立的IDT,不同的处理器可以运行不同的ISR。但是打印测试的好像没出现过不一样的isr

 


IP 地址: 已记录   报告
   2009-03-28, 22:16 下午
suck007 离线,最后访问时间: 2009/3/28 5:47:33 初学者

发帖数前150位
注册: 2009-03-21
发 贴: 7
Re: 请问在多核下面的IDT表,为什么ISR都是一样的?
Reply Quote

看了下源码,自己回答一下吧

PKPRCB
KiInitProcessorState(
    PKPROCESSOR_STATE  pProcessorState,
    PVOID               PerProcessorAllocation,
    ULONG               NewProcessorNumber,
    UCHAR               NodeNumber,
    ULONG               IdtOffset,
    ULONG               GdtOffset,
    PVOID             *ppStack,
    PVOID             *ppDpcStack
    );

里面,看到这个

    KiCloneDescriptor (&Descriptor,
                       &pProcessorState->SpecialRegisters.Idtr,
                       Base + IdtOffset);

 

继续看下去

static VOID
KiCloneDescriptor (
   IN PKDESCRIPTOR  pSrcDescriptor,
   IN PKDESCRIPTOR  pDestDescriptor,
   IN PVOID         Base
   )

/*++

Routine Description:

    Makes a copy of the specified descriptor, and supplies a return
    descriptor for the new copy

Arguments:

    pSrcDescriptor  - descriptor to clone
    pDescDescriptor - the cloned descriptor
    Base            - Base memory for the new descriptor.

Return Value:

    None.

--*/
{
    ULONG   Size;

    Size = pSrcDescriptor->Limit + 1;
    pDestDescriptor->Limit = (USHORT) Size -1;
    pDestDescriptor->Base  = (ULONG)  Base;

    RtlCopyMemory(Base, (PVOID)pSrcDescriptor->Base, Size);
}

也就是说,多核下面的IDTR是多份,但是ISR应该是一样的,连猜带摸,如果不对,跟帖纠正吧~~~


IP 地址: 已记录   报告
   2009-03-29, 23:29 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请问在多核下面的IDT表,为什么ISR都是一样的?
Reply Quote
启动初期的表项主要是处理异常的,这些ISR是一样的。差异在处理外部中断的ISR,印象里处理时钟中断的ISR就不一样。
IP 地址: 已记录   报告
   2009-03-30, 02:19 上午
suck007 离线,最后访问时间: 2009/3/28 5:47:33 初学者

发帖数前150位
注册: 2009-03-21
发 贴: 7
Re: 请问在多核下面的IDT表,为什么ISR都是一样的?
Reply Quote
感谢Raymond 老师的回复,另外问一下,时钟中断号是8么?
IP 地址: 已记录   报告
   2009-03-30, 12:49 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请问在多核下面的IDT表,为什么ISR都是一样的?
Reply Quote

今天调试其它问题顺便收集了下面的信息。

系统中是一个四核的CPU,0号的时钟中断ISR是HalpRtcClockInterrupt,而其它三个CPU的时钟中断ISR都是hal!HalpClockInterruptPn:

0: kd> !idt

 

Dumping IDT:

... 

d1:   833a4614 hal!HalpRtcClockInterrupt

df:   833b51c0 hal!HalpApicRebootService

e1:   833b5934 hal!HalpIpiHandler

e3:   833b56d4 hal!HalpLocalApicErrorService

fd:   833b5edc hal!HalpProfileInterrupt

fe:   833b6148 hal!HalpPerfInterrupt

2: kd> ~3s

3: kd> !idt

 

Dumping IDT:

... 

d1:   833a497c hal!HalpClockInterruptPn

df:   833b51c0 hal!HalpApicRebootService

e1:   833b5934 hal!HalpIpiHandler

e3:   833b56d4 hal!HalpLocalApicErrorService

fd:   833b5edc hal!HalpProfileInterrupt

fe:   833b6148 hal!HalpPerfInterrupt

 


IP 地址: 已记录   报告
   2009-03-30, 20:52 下午
suck007 离线,最后访问时间: 2009/3/28 5:47:33 初学者

发帖数前150位
注册: 2009-03-21
发 贴: 7
Re: 请问在多核下面的IDT表,为什么ISR都是一样的?
Reply Quote
学习,感谢
IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » 请问在多核下面的IDT表,为什么ISR都是一样的?

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.