接着建立一个长度为n×NR_CPUS的虚拟空间(vmalloc_early),
并把虚拟空间对应的物理页框设置为p数组指向的pages。
然后把每cpu变量__per_cpu_load拷贝至这个虚拟空间。#define per_cpu(var, cpu) \ (*SHIFT_PERCPU_PTR(&(var), per_cpu_offset(cpu))) unsigned long __per_cpu_offset[NR_CPUS] __read_mostly; for_each_possible_cpu(cpu) __per_cpu_offset[cpu] = delta + pcpu_unit_offsets[cpu]; delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start;其中pcpu_base_addr = base_addr; 这个base_addr就是之前分配的vm虚拟空间地址。
pcpu_unit_offsets = unit_off; unit_off = alloc_bootmem(nr_cpu_ids * sizeof(unit_off[0])); unit_off[cpu] = gi->base_offset + i * ai->unit_size;这个是分组的概念,不看也罢