免费注册 查看新帖 |

Chinaunix

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

x86关于段描述符表的问题求教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-23 10:50 |显示全部楼层 |倒序浏览
本帖最后由 new_new_one 于 2010-07-23 10:51 编辑

小弟正在看《深入理解linux内核》第3版。当看到第二章“内存寻址”时候,有这样一段话

"在单处理器系统中中有一个GDT,而在多处理器中每个CPU对应一个GDT"

根据书中的提示,在2.6.11版中找到对应的段表定义的地方:
arch\i386\kernel\head.S中有
  1. ENTRY(cpu_gdt_table)
  2.         .quad 0x0000000000000000        /* NULL descriptor */
  3.         .quad 0x0000000000000000        /* 0x0b reserved */
  4.         .quad 0x0000000000000000        /* 0x13 reserved */
  5.         .quad 0x0000000000000000        /* 0x1b reserved */
  6.         .quad 0x0000000000000000        /* 0x20 unused */
  7.         .quad 0x0000000000000000        /* 0x28 unused */
  8.         .quad 0x0000000000000000        /* 0x33 TLS entry 1 */
  9.         .quad 0x0000000000000000        /* 0x3b TLS entry 2 */
  10.         .quad 0x0000000000000000        /* 0x43 TLS entry 3 */
  11.         .quad 0x0000000000000000        /* 0x4b reserved */
  12.         .quad 0x0000000000000000        /* 0x53 reserved */
  13.         .quad 0x0000000000000000        /* 0x5b reserved */

  14.         .quad 0x00cf9a000000ffff        /* 0x60 kernel 4GB code at 0x00000000 */
  15.         .quad 0x00cf92000000ffff        /* 0x68 kernel 4GB data at 0x00000000 */
  16.         .quad 0x00cffa000000ffff        /* 0x73 user 4GB code at 0x00000000 */
  17.         .quad 0x00cff2000000ffff        /* 0x7b user 4GB data at 0x00000000 */

  18.         .quad 0x0000000000000000        /* 0x80 TSS descriptor */
  19.         .quad 0x0000000000000000        /* 0x88 LDT descriptor */

  20.         /* Segments used for calling PnP BIOS */
  21.         .quad 0x00c09a0000000000        /* 0x90 32-bit code */
  22.         .quad 0x00809a0000000000        /* 0x98 16-bit code */
  23.         .quad 0x0080920000000000        /* 0xa0 16-bit data */
  24.         .quad 0x0080920000000000        /* 0xa8 16-bit data */
  25.         .quad 0x0080920000000000        /* 0xb0 16-bit data */
  26.         /*
  27.          * The APM segments have byte granularity and their bases
  28.          * and limits are set at run time.
  29.          */
  30.         .quad 0x00409a0000000000        /* 0xb8 APM CS    code */
  31.         .quad 0x00009a0000000000        /* 0xc0 APM CS 16 code (16 bit) */
  32.         .quad 0x0040920000000000        /* 0xc8 APM DS    data */

  33.         .quad 0x0000000000000000        /* 0xd0 - unused */
  34.         .quad 0x0000000000000000        /* 0xd8 - unused */
  35.         .quad 0x0000000000000000        /* 0xe0 - unused */
  36.         .quad 0x0000000000000000        /* 0xe8 - unused */
  37.         .quad 0x0000000000000000        /* 0xf0 - unused */
  38.         .quad 0x0000000000000000        /* 0xf8 - GDT entry 31: double-fault TSS */
复制代码
这里段表中有32个项。在arch\i386\kernel\cpu\common.c为每个CPU定义了GDT表,变量名为:cpu_gdt_table
  1. DEFINE_PER_CPU(struct desc_struct, cpu_gdt_table[GDT_ENTRIES]);
  2. EXPORT_PER_CPU_SYMBOL(cpu_gdt_table);
复制代码
同时在这个C文件中有:
  1. void __init cpu_init (void)
  2. {
  3.          //省略部分代码
  4.         memcpy(&per_cpu(cpu_gdt_table, cpu), cpu_gdt_table,
  5.                GDT_SIZE);
  6.         cpu_gdt_descr[cpu].size = GDT_SIZE - 1;
  7.         cpu_gdt_descr[cpu].address =
  8.             (unsigned long)&per_cpu(cpu_gdt_table, cpu);
  9.          //省略部分代码
  10. }
复制代码
这段代码就是把arch\i386\kernel\head.S中定义的cpu_gdt_table,分别复制到每个CPU的全局描述符表里。

我对以上有一个问题,cpu_gdt_table只有32个表项,这跟其他书中讲解的有冲突啊,比如:<<Linux内核情景分析>>中2.1节 linux内存管理的基本框架中提到

ps:那份文档不能复制文本,我就抓图了。

一个CPU中只有32个全局描述符表项,这样一来linux是如何执行几K个进程的?

论坛徽章:
0
2 [报告]
发表于 2010-07-23 10:55 |显示全部楼层
本帖最后由 new_new_one 于 2010-07-23 10:57 编辑

页表有听说过一级二级,段表没听说过啊。我在找找看。

我google了一下,没有关于二级段表的信息。呜呜,可否指导下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP