免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2532 | 回复: 9
打印 上一主题 下一主题

[内核入门] 关于Local apic的寻址方式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-16 15:31 |只看该作者 |倒序浏览
smp系统中,固定映射的线性地址中FIX_APIC_BASE的疑问。
  1. enum fixed_addresses {
  2.         FIX_HOLE,
  3.         FIX_VSYSCALL,
  4. #ifdef CONFIG_X86_LOCAL_APIC
  5.         FIX_APIC_BASE,        /* local (CPU) APIC) -- required for SMP or not */
  6. #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进行访问的,代码如下:
  1. static __inline void apic_write(unsigned long reg, unsigned int v)
  2. {
  3.         *((volatile unsigned int *)(APIC_BASE+reg)) = v;
  4. }
  5. static __inline unsigned int apic_read(unsigned long reg)
  6. {
  7.         return *((volatile unsigned int *)(APIC_BASE+reg));
  8. }
复制代码
下面是我做的一个实验,为了查看不同的cpu中APIC_BASE的值的变化,实验环境为:x86-64下kernel版本为2.6.9
apic_base.c文件:
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <asm-x86_64/apicdef.h>
  4. #include <asm-x86_64/fixmap.h>
  5. #include <asm-x86_64/uaccess.h>

  6. MODULE_LICENSE("GPL");

  7. static int apic_init_module(void)
  8. {
  9.         int i, cpuno = -1;
  10.         pr_info("============================================\n");
  11.         pr_info("CPU id :%d , APIC Base :%lx \n",cpuno , APIC_BASE);

  12.     return 0;
  13. }


  14. static void apic_exit_module(void)
  15. {

  16. }

  17. module_init(apic_init_module);
  18. 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而我没有发现?希望高人指点。

论坛徽章:
0
2 [报告]
发表于 2012-05-16 15:53 |只看该作者
对x86实在不熟,以下仅仅是猜测:
local的意思就是本地,也就是说它只是本地访问,本地有效。那么是不是说每个核自己的本地APIC的物理地址是一样的,然后呢,映射的虚地址自然也是一样的。至于访问,反正是本地的,我不会访问别人的,也不担心别人过来访问我自己的。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
3 [报告]
发表于 2012-05-16 16:08 |只看该作者
The local APIC will appear in the same place for each processor, but each processor will reference its own APIC; the APIC intercepts memory references to its registers, and those references will not generate bus cycles on some systems


http://www.cheesecake.org/sac/smp.html#apic

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
4 [报告]
发表于 2012-05-16 16:25 |只看该作者
哥, 不同的进程 访问 0x11223354, 能访问到同一个page吗?

你想一想这个问题, 深呼吸一下, 再回答下自己的问题。 就顿悟了。

论坛徽章:
0
5 [报告]
发表于 2012-05-16 16:43 |只看该作者
回复 4# 帅绝人寰

不同的进程我能理解,根据cr3寄存器的内容会访问不同的page,固定映射是内核内存(3G-4G)最后的空间,内核固定映射是通过set_fixmap_nocache()函数将物理地址与index联系起来的。
所以我认为跟进程是不同的。


   

论坛徽章:
0
6 [报告]
发表于 2012-05-16 16:50 |只看该作者
回复 3# tempname2

谢谢,我去研究下

   

论坛徽章:
0
7 [报告]
发表于 2012-05-17 08:55 |只看该作者
回复 3# tempname2

还是没有完全明白,请问如果我要在CPU1里访问CPU2中Local apic的register,应该怎么做那?


   

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
8 [报告]
发表于 2012-05-17 09:18 |只看该作者
回复 7# xujianlane


不好意思,我也不懂,那个是随便搜到的。

如果如它所说,每个CPU读同一个地址时会读到不同数据,那么跨CPU读数据,就跟跨CPU执行CPUID指令一样。CPU1可以发一个IPI让CPU2把值读到某块内存,CPU1去读那块内存就行了。

论坛徽章:
0
9 [报告]
发表于 2012-05-17 11:35 |只看该作者
每个CPU 的 Local APIC 的物理地址应该包含在 MSR 0000_001B 这个 MSR 寄存器的APIC_BASE字段中,至于器逻辑地址,则取决于kernel, 64位直接地址
转换就可, 32位kernel, 可能是用FIX_APIC_BASE进行映射,具体要看该版本kernel的实现

论坛徽章:
0
10 [报告]
发表于 2012-05-17 11:53 |只看该作者
IO-APIC 由于其是全局性的,不取决于CPU的数量,其物理地址一般是由BIOS通过ACPI制定,kernel只需查找相关的ACPI表即可确定IO-APIC的物理地址.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP