#define PGDIR_SHIFT 22 虚拟地址address >> PGDIR_SHIFT就可以得到PGD的下标,然后根据 (PGD + address>> PGDIR_SHIFT) 得到PGD的指针;
#define PGDIR_SIZE (1UL << PGDIR_SHIFT) 表示一个PGD指针所代表的地址空间大小
#define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET);
#define __PAGE_OFFSET (0xC0000000) //用户空间和内核空间地址的分界线,也是内核逻辑地址的偏移量
#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)//内核逻辑地址转换为物理地址
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))//内核逻辑地址转换为物理地址
#define TASK_SIZE (PAGE_OFFSET) //用户空间进程的地址限制
这个数据结构比较重要,是内核空间和用户空间的分界线,也是内核逻辑地址的对应关系(逻辑地址 + __PAGE_OFFSET = 实际物理地址)
typedef struct { unsigned long pte_low; } pte_t;
typedef struct { unsigned long pmd; } pmd_t;
typedef struct { unsigned long pgd; } pgd_t;
typedef struct { unsigned long pgpr