- 论坛徽章:
- 0
|
本帖最后由 new_new_one 于 2010-07-23 10:51 编辑
小弟正在看《深入理解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 */
复制代码 这里段表中有32个项。在arch\i386\kernel\cpu\common.c为每个CPU定义了GDT表,变量名为:cpu_gdt_table- DEFINE_PER_CPU(struct desc_struct, cpu_gdt_table[GDT_ENTRIES]);
- EXPORT_PER_CPU_SYMBOL(cpu_gdt_table);
复制代码 同时在这个C文件中有:- 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);
- //省略部分代码
- }
复制代码 这段代码就是把arch\i386\kernel\head.S中定义的cpu_gdt_table,分别复制到每个CPU的全局描述符表里。
我对以上有一个问题,cpu_gdt_table只有32个表项,这跟其他书中讲解的有冲突啊,比如:<<Linux内核情景分析>>中2.1节 linux内存管理的基本框架中提到
ps:那份文档不能复制文本,我就抓图了。
一个CPU中只有32个全局描述符表项,这样一来linux是如何执行几K个进程的? |
|