阐述Linux内核里面的APIC编程

运维 系统运维
微软操作系统的火热,你是在应用Linux操作系统么?如果你是Linux操作系统的老用户。 这里为你讲解的问题会对Linux内核里面的APIC编程有所帮助。Linux内核的名字也是“Linux”。

微软操作系统的火热,你是在应用Linux操作系统么?如果你是Linux操作系统的老用户。 这里为你讲解的问题会对Linux内核里面的APIC编程有所帮助。Linux内核的名字也是“Linux”。APIC就是高级PIC咯,高级可编程中断控制器。现在的多核系统上面每个cpu对应一个localapic,就是用来管理中断的,包括外部中断和cpu内部中断等。

1、apic的具体原理和规范,可以看“Intel?64andIA-32ArchitecturesSoftwareDeveloper'sManualVolume3A:SystemProgrammingGuide”上的第十章“TheAdvancedProgrammableInterruptController(APIC)“

2、关于APIC在BIOS里面的初始化,大概是BIOS会初始化好APIC,然后提供一张APIC表cpu表给要启动的系统使用吧。在ntel?64andIA-32ArchitecturesSoftwareDeveloper'sManualVolume3A:SystemProgrammingGuide的第8章“MULTIPLE-PROCESSORMANAGEMENT”第9章“PROCESSORMANAGEMENTANDINITIALIZATION”有详细介绍“”。也可以继续看标准文档“ACPIspec40”“IntelMultiprocessorSpecification”上面关于那个表的描述。

3、网上国人写个这篇文章也非常不错,他整理了上面的文档和Linux相关的代码。我也只是发现APIC的这个文档而已,和APIC相关的文档还是比较少吧。
“InterruptinLinux(硬件篇)——细节、实现,与疑问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)(intvector);
void(*send_IPI_all)(intvector);
void(*send_IPI_self)(intvector);

而一般的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是系统导出的一个获取物理apicid的变量,不过不同的内核版本里面实现有点不同,可以看具体的代码。apicid是区分每个apic的标志了,也用于区分不同的processor的。

希望通过本文的介绍你能学会Linux内核里面的APIC编程。

【编辑推荐】

  1. 教会你轻松Linux网卡安装
  2. 实例讲解Linux以太网卡的安装及配置
  3. 全面了解Linux网卡的工作原理
  4. 你了解Linux系统开机知识么?
  5. 教会你Linux操作系统实现email和fax的互转互发
责任编辑:小霞 来源: 中国水利水电出版社
相关推荐

2009-12-01 09:51:50

备份Linux内核

2010-01-11 09:28:34

C++编程

2009-12-09 14:15:39

2009-12-14 10:47:34

Linux makef

2010-03-10 14:48:24

2009-12-02 14:09:52

2009-11-30 10:54:59

solaris命令

2009-12-21 14:33:11

2009-12-10 10:25:12

Linux触摸屏驱动

2009-12-14 13:14:57

2009-12-22 15:12:33

Linux扩展文件系统

2009-12-01 18:41:08

SUSE Linux

2009-12-23 10:50:57

Linux chmod

2009-12-25 17:15:03

Linux内存

2017-07-12 16:45:10

Docker概念镜像

2024-04-11 13:02:10

Rust数据类型

2010-01-13 15:51:44

C++编程语言

2010-01-11 10:01:25

C++的编程工具

2009-12-17 09:56:26

Linux添加驱动模块

2010-01-07 14:39:37

Linux配置远程桌面
点赞
收藏

51CTO技术栈公众号