(1)将.data.percpu数据段中的数据复制到每个cpu的percpu地址
start_kernel()->setup_per_cpu_areas()
复制后的结果图如下:
代码如下:
void __init setup_per_cpu_areas(void)
{
unsigned long size, i;
char *ptr;
//取得cpu数量
unsigned long nr_possible_cpus = num_possible_cpus();
/* Copy section for each CPU (we discard the original) */
size = ALIGN(PERCPU_ENOUGH_ROOM, PAGE_SIZE);
//分配内存
ptr = alloc_bootmem_pages(size * nr_possible_cpus);
//__per_cpu_start __per_cpu_end分别是.data.percpu的起始地址和结束地址
for_each_possible_cpu(i)
{
//保存每一个cpu的percpu变量的起始地址和__per_cpu_start的差值 将来通过
//__per_cpu_offset[i]来定位各个cpu的变量
__per_cpu_offset[i] = ptr - __per_cpu_start;
//将.data.percpu中的数据复制到各个cpu 的percpu地址中
memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start);
ptr += si