注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

Linux内核里面的APIC编程  

2009-09-08 15:52:35|  分类: linux相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
APIC   就是 高级PIC咯, 高级可编程中断控制器。现在的多核系统上面每个cpu对应一个local apic,就是用来管理中断的,包括外部中断和cpu内部中断等。

1、apic的具体原理和规范,可以看“Intel? 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide” 上的第十章  “The Advanced Programmable Interrupt Controller (APIC)“

2、关于APIC 在BIOS里面的初始化,大概是BIOS会初始化好APIC,然后提供一张APIC表 cpu表给要启动的系统使用吧。  在ntel? 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide 的第8章 “MULTIPLE-PROCESSOR MANAGEMENT” 第9章“PROCESSOR MANAGEMENT AND INITIALIZATION”有详细介绍“” 。也可以继续看标准文档“ACPIspec40”  “Intel Multiprocessor Specification” 上面关于那个表的描述。

3、网上国人写个这篇文章也非常不错,他整理了上面的文档和Linux 相关的代码 。我也只是发现APIC的这个文档而已,和APIC相关的文档还是比较少吧。
   “Interrupt in Linux(硬件篇)—— 细节、实现,与疑问    Author: ZX_WING (xing5820@163.com) ”

4、 内核代码
http://lxr.linux.no/#linux+v2.6.30.5/arch/x86/kernel/apic/apic.c
http://lxr.linux.no/#linux+v2.6.30.5/arch/x86/kernel/mpparse.c
等都是相关的,可以结合 上面说的那个文档和 系统启动时的输出看一下, 启动时输出的 ACPI , apicid, processor那些的都是系统初始化apic的时候打印输出的。
在内核参数加上apic=debug  可能看到更详细的输出。

5、自己的驱动需要设置控制apic的时候,也可以使用系统里面定义的那些函数咯。在这里有很多函数声明,也可以去看一下具体是怎么作的
http://lxr.linux.no/#linux+v2.6.30.5/arch/x86/include/asm/apic.h
这里有很多宏的定义,都是和apic的配置有关的,可以对应看一下 intel的文档。
http://lxr.linux.no/#linux+v2.6.30.5/arch/x86/include/asm/apicdef.h

比如 KDB就是用 ipi (cpu内部中断)的函数来禁止其他cpu的
       void (*send_IPI_allbutself)(int vector);
       void (*send_IPI_all)(int vector);
       void (*send_IPI_self)(int vector);

而一般的apic都是通过下面这两个函数来进行的
apic_wait_icr_idle();  
apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(x86_cpu_to_apicid[i]));
apic_write(APIC_ICR, icr);  //写ICR寄存器,产生ipi中断


x86_cpu_to_apicid 是系统导出的一个获取物理apic id 的变量,不过不同的内核版本里面实现有点不同,可以看具体的代码。apic id 是区分每个apic的标志了,也用于区分不同的processor的。

  评论这张
 
阅读(588)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017