日期:2014-05-16 浏览次数:20671 次
又是一个国庆七天假,之前有很多打算
可是到最后,只有linux愿意陪我。
介绍pageing_init之前,我们了解几个定义
pte_t 页表项
pmd_t 页中间目录项
pud_t 页上级目录
pgd_t 页全局目录项
我的arm平台
#define PMD_SHIFT 21
#define PGDIR_SHIFT 21
下面这个函数paging_init每个平台实现不一样,我的根本就没有用PUD_SHIFT
arm最多用二级
void __init paging_init(struct machine_desc*mdesc)
{
void *zero_page;
memblock_set_current_limit(lowmem_limit);
就是
memblock.current_limit = limit;
lowmem_limit = bank->start + bank->size;高端内存初始化时记录的我的是0x34000000
build_mem_type_table();这个函数很大,主要就是根据cpu类型记录内存信息,大的原因就是可虑了所以现有的arm类型
printk("Memory policy: ECC%sabled, Data cache %s\n",
ecc_mask ? "en" :"dis", cp->policy);
我的平台Memory policy: ECC disabled, Data cache writeback关闭ecc数据缓存为回写
prepare_page_table();
我们看看准备什么
static inline void prepare_page_table(void)
{
unsigned longaddr;
phys_addr_t end;
/*
* Clear out allthe mappings below the kernel image.
*/
清除内核下所有的映射
我的MODULES_VADDR=0xbf000000 PMD_SIZE=0x2000000
MODULES_VADDR是动态模块映射区起始地址,
PMD_SIZE宏用于计算由页中间目录的一个单独表项所映射的区域大小,也就是一个页表的大小
我的平台启动打印
vector : 0xffff0000 - 0xffff1000 ( 4kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
vmalloc : 0xc4800000 -0xf6000000 ( 792 MB)
lowmem : 0xc0000000 - 0xc4000000