x86关于段描述符表的问题求教
时间:2010-07-23
来源:互联网
本帖最后由 new_new_one 于 2010-07-23 10:51 编辑
小弟正在看《深入理解linux内核》第3版。当看到第二章“内存寻址”时候,有这样一段话
"在单处理器系统中中有一个GDT,而在多处理器中每个CPU对应一个GDT"
根据书中的提示,在2.6.11版中找到对应的段表定义的地方:
arch\i386\kernel\head.S中有
复制代码
这里段表中有32个项。在arch\i386\kernel\cpu\common.c为每个CPU定义了GDT表,变量名为:cpu_gdt_table
复制代码
同时在这个C文件中有:
复制代码
这段代码就是把arch\i386\kernel\head.S中定义的cpu_gdt_table,分别复制到每个CPU的全局描述符表里。
我对以上有一个问题,cpu_gdt_table只有32个表项,这跟其他书中讲解的有冲突啊,比如:<<Linux内核情景分析>>中2.1节 linux内存管理的基本框架中提到
ps:那份文档不能复制文本,我就抓图了。
一个CPU中只有32个全局描述符表项,这样一来linux是如何执行几K个进程的?
小弟正在看《深入理解linux内核》第3版。当看到第二章“内存寻址”时候,有这样一段话
"在单处理器系统中中有一个GDT,而在多处理器中每个CPU对应一个GDT"
根据书中的提示,在2.6.11版中找到对应的段表定义的地方:
arch\i386\kernel\head.S中有
- ENTRY(cpu_gdt_table)
- .quad 0x0000000000000000 /* NULL descriptor */
- .quad 0x0000000000000000 /* 0x0b reserved */
- .quad 0x0000000000000000 /* 0x13 reserved */
- .quad 0x0000000000000000 /* 0x1b reserved */
- .quad 0x0000000000000000 /* 0x20 unused */
- .quad 0x0000000000000000 /* 0x28 unused */
- .quad 0x0000000000000000 /* 0x33 TLS entry 1 */
- .quad 0x0000000000000000 /* 0x3b TLS entry 2 */
- .quad 0x0000000000000000 /* 0x43 TLS entry 3 */
- .quad 0x0000000000000000 /* 0x4b reserved */
- .quad 0x0000000000000000 /* 0x53 reserved */
- .quad 0x0000000000000000 /* 0x5b reserved */
-
- .quad 0x00cf9a000000ffff /* 0x60 kernel 4GB code at 0x00000000 */
- .quad 0x00cf92000000ffff /* 0x68 kernel 4GB data at 0x00000000 */
- .quad 0x00cffa000000ffff /* 0x73 user 4GB code at 0x00000000 */
- .quad 0x00cff2000000ffff /* 0x7b user 4GB data at 0x00000000 */
-
- .quad 0x0000000000000000 /* 0x80 TSS descriptor */
- .quad 0x0000000000000000 /* 0x88 LDT descriptor */
-
- /* Segments used for calling PnP BIOS */
- .quad 0x00c09a0000000000 /* 0x90 32-bit code */
- .quad 0x00809a0000000000 /* 0x98 16-bit code */
- .quad 0x0080920000000000 /* 0xa0 16-bit data */
- .quad 0x0080920000000000 /* 0xa8 16-bit data */
- .quad 0x0080920000000000 /* 0xb0 16-bit data */
- /*
- * The APM segments have byte granularity and their bases
- * and limits are set at run time.
- */
- .quad 0x00409a0000000000 /* 0xb8 APM CS code */
- .quad 0x00009a0000000000 /* 0xc0 APM CS 16 code (16 bit) */
- .quad 0x0040920000000000 /* 0xc8 APM DS data */
-
- .quad 0x0000000000000000 /* 0xd0 - unused */
- .quad 0x0000000000000000 /* 0xd8 - unused */
- .quad 0x0000000000000000 /* 0xe0 - unused */
- .quad 0x0000000000000000 /* 0xe8 - unused */
- .quad 0x0000000000000000 /* 0xf0 - unused */
- .quad 0x0000000000000000 /* 0xf8 - GDT entry 31: double-fault TSS */
- DEFINE_PER_CPU(struct desc_struct, cpu_gdt_table[GDT_ENTRIES]);
- EXPORT_PER_CPU_SYMBOL(cpu_gdt_table);
- void __init cpu_init (void)
- {
- //省略部分代码
- memcpy(&per_cpu(cpu_gdt_table, cpu), cpu_gdt_table,
- GDT_SIZE);
- cpu_gdt_descr[cpu].size = GDT_SIZE - 1;
- cpu_gdt_descr[cpu].address =
- (unsigned long)&per_cpu(cpu_gdt_table, cpu);
- //省略部分代码
- }
我对以上有一个问题,cpu_gdt_table只有32个表项,这跟其他书中讲解的有冲突啊,比如:<<Linux内核情景分析>>中2.1节 linux内存管理的基本框架中提到
ps:那份文档不能复制文本,我就抓图了。
一个CPU中只有32个全局描述符表项,这样一来linux是如何执行几K个进程的?
作者: new_new_one 发布时间: 2010-07-23
32个全局描述符表项,这只是一级表,linux内核里面还有二级描述符表。
作者: 0vk0 发布时间: 2010-07-23
本帖最后由 new_new_one 于 2010-07-23 10:57 编辑
页表有听说过一级二级,段表没听说过啊。我在找找看。
我google了一下,没有关于二级段表的信息。呜呜,可否指导下
页表有听说过一级二级,段表没听说过啊。我在找找看。
我google了一下,没有关于二级段表的信息。呜呜,可否指导下
作者: new_new_one 发布时间: 2010-07-23
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28