很多朋友对于修复图和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
{
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
无符号长地址=FIXADDR_START; /* (1) */虚拟FIX空间
pgd=pgd_offset_k(addr); /* (2) */在swapper_pg_dir中找到对应的pgd
如果(CONFIG_PGTABLE_LEVELS 3
!(pgd_none(*pgd) || pgd_page_paddr(*pgd)==__pa_symbol(bm_pud))) {
/*
* 只有内核映射和修复映射我们才会到这里
* 共享顶级pgd 条目,这应该只发生在
* 16k/4 级配置。
*/
BUG_ON(!IS_ENABLED(CONFIG_ARM64_16K_PAGES));
pud=pud_offset_kimg(pgd, addr);
} 其他{
如果(pgd_none(*pgd))
__pgd_populate(pgd, __pa_symbol(bm_pud), PUD_TYPE_TABLE); /* (3) 将bm_pud的物理地址填充到pgd间隙中,完成pgd指向pud的操作。想想就觉得可怕。
,我们不明白的是gpd指向pud就简单完成了,等等。 */
pud=fixmap_pud(addr);
}
如果(pud_none(*pud))
__pud_populate(pud, __pa_symbol(bm_pmd), PMD_TYPE_TABLE); /* (4) */
pmd=fixmap_pmd(地址);
__pmd_populate(pmd, __pa_symbol(bm_pte), PMD_TYPE_TABLE); /* (5) */
.
}
在这个函数之后,内核的三个数组是
静态pte_t bm_pte[PTRS_PER_PTE] __page_aligned_bss;
静态pmd_t bm_pmd[PTRS_PER_PMD] __page_aligned_bss __maybe_unused;
静态pud_t bm_pud[PTRS_PER_PUD] __page_aligned_bss __maybe_unused;
使用swapper_pg_dir指向如图所示
然后?不需要简单的填写pte表(实际上是填写pmd),因为pte已经没有下一级了,现在也没有物理地址可以映射了。
现在将tofu切换到paging_init,开始给tofu上电,并提高电压。
无效__init分页_init(无效)
{
phys_addr_t pgd_phys=early_pgtable_alloc(); /********(标记1)********/
pgd_t *pgd=pgd_set_fixmap(pgd_phys);
map_kernel(pgd); /********(标记2)********/
map_mem(pgd); /********(标记3)********/
/*
* 我们想重用原来的swapper_pg_dir,所以我们不必
* 将新地址传达给非一致的辅助节点
* secondary_entry,因此cpu_switch_mm可以生成地址
* adrp+add 而不是从某个全局变量加载。
*
* 为此,我们需要通过临时pgd。
*/
cpu_replace_ttbr1(__va(pgd_phys)); /********(标记4)************/
memcpy(swapper_pg_dir, pgd, PGD_SIZE);
cpu_replace_ttbr1(lm_alias(swapper_pg_dir));
pgd_clear_fixmap();
memblock_free(pgd_phys, PAGE_SIZE);
/*
* 我们只重用swapper_pg_dir中的PGD,而不是pud + pmd
* 与其一起分配。
*/
memblock_free(__pa_symbol(swapper_pg_dir) + PAGE_SIZE,
SWAPPER_DIR_SIZE - PAGE_SIZE);
}
函数early_pgtable_alloc申请物理内存并清除它。什么?我们还处于手动映射的时代或者申请物理内存的时代。怎么清除呢?至此,你已经足够了解,要操作物理内存,首先需要知道它的虚拟地址。
让我们开始吧
static phys_addr_t __init Early_pgtable_alloc(void)//完成后将被取消的函数
{
phys_addr_t 物理;
无效*ptr;
phys=memblock_alloc(PAGE_SIZE, PAGE_SIZE); (1)、要申请物理内存,我们需要虚拟
/*
* FIX_{PGD,PUD,PMD}插槽可能正在使用中,但FIX_PTE
* 插槽将是空闲的,因此我们可以(ab)使用FIX_PTE插槽来初始化
* 任何级别的表。
*/
ptr=pte_set_fixmap(phys);将我们的物理内存页填充到上面提到的PTE中,
memset(ptr, 0, PAGE_SIZE);去做就对了
/*
* 隐式屏障还确保归零页面对页面可见
* 桌助行器
*/
pte_clear_fixmap();工作结束后清理现场
返回物理值;
}
pgd_set_fixmap (pgd_phys);只是范围不同,操作的还是pte数组
这个函数的原理是一样的,意思就是取虚拟fixmap区间的pgd区间,然后把物理地址放到PTE上。
接下来,映射内核和其他段,很酷的操作来了。
然后将页表切换到pgd_phys,然后将内存复制到原来的swapper_pg_dir。
然后再转回来,哦,真香!
用户评论
fixmap简直是这个行业的一股清流!以前总觉得这些应用太乱码了,现在终于找到了一个界面整洁、功能强大的替代方案。强烈推荐!
有20位网友表示赞同!
我最近在搞项目用到了 fixmap ,真的给力!特别是他那儿的数据结构管理模块简直就是神一般的存在,让我节省了大量时间和精力。
有5位网友表示赞同!
fixmap 真的是太惊艳了!以前我一直使用的其他类似工具总是觉得不够灵活,这款软件能完全满足我自定义的需求,非常棒。
有16位网友表示赞同!
作为一个资深程序员,一直以来对这种数据结构管理工具都比较挑剔,直到遇到 fixmap ! 它不仅功能强大,而且操作简单易懂,真心推荐!
有5位网友表示赞同!
fixmap 这类的软件本来就很实用,但这款软件做的真的太精美了。界面设计简约又不失美感,用起来真是舒服异常。
有11位网友表示赞同!
说实话,fixmap 确实能解决很多数据结构管理的痛点,但是我个人觉得它的学习成本还是有点高,需要一些时间去熟悉。
有9位网友表示赞同!
fixmap的功能真的很强,但有时会感觉功能太过复杂,希望官方能增加一些简化操作的界面选项。
有9位网友表示赞同!
fixmap 的免费版的功能就已经足够用了,对于个人开发者来说真的太划算了! 不用花太多钱就能获得这样高质量的工具真是惊喜!
有17位网友表示赞同!
fixmapy 的收费模式有点让我纠结,虽然功能的确强大,但考虑到我的发展阶段还是先观望一段时间吧。
有17位网友表示赞同!
使用 fixmap 后终于不用再去烦恼那些繁琐的数据结构问题了!解放了大量精力,效率飞涨!
有11位网友表示赞同!
fixmap 的文档写得实在太棒了,详细地介绍了每一个功能,连零基础的用户也能轻松上手操作。
有7位网友表示赞同!
fixmap 我感觉最大的缺点就是资源占用比较大,有时候运行起来会卡顿,希望官方能进行优化提升性能。
有14位网友表示赞同!
fixmap 的数据安全机制还不错,至少给我一个使用上安心踏实的感受。
有17位网友表示赞同!
我以前一直用其它工具来管理数据结构,自从用了 fixmap 后就感觉世界都变了!推荐给所有需要搞定数据结构难题的伙伴们!
有19位网友表示赞同!
fixmap 的社区资源非常丰富,官方也比较活跃,遇到问题很容易找到解决办法,这个让我感到很安心。
有19位网友表示赞同!
fixmap 做了一定程度上改进了一些传统工具的短板,界面体验确实提升了很多,但价格还是有点贵啊!
有6位网友表示赞同!
fixmap 虽然功能强大,但我总觉得它更适合企业级使用,普通开发者可能不太实用。
有16位网友表示赞同!
fixmap 我个人感觉太局限了,无法满足我复杂的多维数据管理需求,希望官方能推出更加强大的版本。
有7位网友表示赞同!