吉游网提供最新游戏下载和手游攻略!

修复图

发布时间:2024-10-02浏览:15

很多朋友对于修复图和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

{

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位网友表示赞同!

热点资讯