2009年9月5日土曜日

setup_per_cpu_areas

今回はsetup_per_cpu_areasを見てみます。
実体は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 件のコメント:

コメントを投稿