- 论坛徽章:
- 0
|
smp系统中,固定映射的线性地址中FIX_APIC_BASE的疑问。- enum fixed_addresses {
- FIX_HOLE,
- FIX_VSYSCALL,
- #ifdef CONFIG_X86_LOCAL_APIC
- FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
- #endif
复制代码 FIX_APIC_BASE是Local apic在固定映射的线性地址fixed_addresses中的index,根据Local apic的介绍(http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/),在SMP系统中每个CPU都有属于自己的Local apic,我的疑问就是每个CPU是如何映射自己的Local apic地址的。cpu是通过apic_read()和apic_write()对local apic进行访问的,代码如下:- static __inline void apic_write(unsigned long reg, unsigned int v)
- {
- *((volatile unsigned int *)(APIC_BASE+reg)) = v;
- }
- static __inline unsigned int apic_read(unsigned long reg)
- {
- return *((volatile unsigned int *)(APIC_BASE+reg));
- }
复制代码 下面是我做的一个实验,为了查看不同的cpu中APIC_BASE的值的变化,实验环境为:x86-64下kernel版本为2.6.9
apic_base.c文件:- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <asm-x86_64/apicdef.h>
- #include <asm-x86_64/fixmap.h>
- #include <asm-x86_64/uaccess.h>
- MODULE_LICENSE("GPL");
- static int apic_init_module(void)
- {
- int i, cpuno = -1;
- pr_info("============================================\n");
- pr_info("CPU id :%d , APIC Base :%lx \n",cpuno , APIC_BASE);
- return 0;
- }
- static void apic_exit_module(void)
- {
- }
- module_init(apic_init_module);
- module_exit(apic_exit_module);
复制代码 Makefile文件:
[/code]obj-m := apic_base.o
KERNELBUILD := /lib/modules/`uname -r`/build
default:
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
rm -rf *.o .*.cmd *.ko *.mod.c .tmp_versions *.bak *.symvers *.markers
[/code]
运行得到的结果为:
CPU id :1 , APIC Base :ffffffffff5fd000
============================================
CPU id :2 , APIC Base :ffffffffff5fd000
============================================
CPU id :2 , APIC Base :ffffffffff5fd000
============================================
CPU id :3 , APIC Base :ffffffffff5fd000
也就是说每个cpu中local apic映射的线性地址都为ffffffffff5fd000,难道是所有的cpu中的local apic都保存在同一物理地址上?还是有其他的方式可能映射自己的apic而我没有发现?希望高人指点。
|
|