実体はinit/main.cにあります。
=====
static void __init setup_per_cpu_areas(void)
{
unsigned long size, i;
char *ptr;
/* CPUの数を取得 */
unsigned long nr_possible_cpus = num_possible_cpus();
/* コピーに必要なサイズをとってくる */
size = ALIGN(PERCPU_ENOUGH_ROOM, PAGE_SIZE);
/* メモリを確保 */
ptr = alloc_bootmem_pages(size * nr_possible_cpus);
/* CPUの数だけ繰り返す */
for_each_possible_cpu(i) {
__per_cpu_offset[i] = ptr - __per_cpu_start;
/* 確保した領域に__per_cpu_startのセクションをコピーする */
memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start);
ptr += size;
}
}
=====
__per_cpu_startセクションはarch/x86/kernel/vmlinux_32.lds.Sにあります。
0 件のコメント:
コメントを投稿