保护
kaslr
没开 kaslr 时, page_offset_base
是常量 0xffff888000000000, 开了 kaslr 后, 会在 kernel_randomize_memory()
中加上一个随机偏移, 这个偏移对齐 PUD_MASK
, 即 $2^{30}$
entropy = remain_entropy / (ARRAY_SIZE(kaslr_regions) - i);
prandom_bytes_state(&rand_state, &rand, sizeof(rand));
entropy = (rand % (entropy + 1)) & PUD_MASK;
vaddr += entropy;
*kaslr_regions[i].base = vaddr;
#define PUD_MASK (~(PUD_SIZE - 1))
#define PUD_SIZE (1UL << PUD_SHIFT)
#define PUD_SHIFT 30
在题目里面有如下写法,是因为内存很小所以可以直接以获得到基址吗?
vmemmap_base = slab_vmemmap_addr & 0xfffffffff0000000; // 问号