免费注册 查看新帖 |

Chinaunix

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

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:53 |只看该作者
32个全局描述符表项,这只是一级表,linux内核里面还有二级描述符表。

论坛徽章:
0
3 [报告]
发表于 2010-07-23 10:55 |只看该作者
本帖最后由 new_new_one 于 2010-07-23 10:57 编辑

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

我google了一下,没有关于二级段表的信息。呜呜,可否指导下

论坛徽章:
0
4 [报告]
发表于 2010-07-24 11:22 |只看该作者
32个全局描述符表项就是指向数据所占用的段

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2010-07-25 00:24 |只看该作者
应该说:CPU支持的自然Task数目为2^31-1个,但事实上同时只有一个TTS是活动的,所以....

事实上只要有一个TTS,你就可以实现无限多个Task。

论坛徽章:
0
6 [报告]
发表于 2010-07-25 09:05 |只看该作者
事实上只要有一个TTS,你就可以实现无限多个Task


系统都会把你咔掉

论坛徽章:
0
7 [报告]
发表于 2010-07-28 10:28 |只看该作者
回复 5# folklore


    有理
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP