- 论坛徽章:
- 0
|
初始化 :
setup_per_cpu_areas()
{
per_cpu(cpu_number, cpu) = cpu;
}
段选择子 fs 初始化:
static inline void setup_percpu_segment(int cpu)
{
#ifdef CONFIG_X86_32
struct desc_struct gdt;
pack_descriptor(&gdt, per_cpu_offset(cpu), 0xFFFFF,
0x2 | DESCTYPE_S, 0x;
gdt.s = 1;
write_gdt_entry(get_cpu_gdt_table(cpu),
GDT_ENTRY_PERCPU, &gdt, DESCTYPE_S);
#endif
}
设置 GDT 描述符在 GDT 表中的偏移 GDT_ENTRY_PERCPU ,将相应 cpu 的每 cpu 变量写到 GDT 描述符地址字段
其实就是 fs 对应 per_cpu_offset[cpu],一切尽在不言中 GDTR,GDT ......
化简如下:
asm("movb %%fs:%P1, %0"
:"=q"(ret__)
:"m"(per_cpu__cpu_number));
每个 cpu 的 fs 的内容都不同,此时 fs:
GDT-> GDT_ENTRY_PERCPU-> 偏移
per_cpu_offset[cpu] + &per_cpu__cpu_number 便得到了相应 cpu 的每 per_cpu__cpu_number,关于 per_cpu_offset 请参考 setup_per_cpu_areas 函数
大致就是这样, hope useful for you ~
|
|