我们也可以修改RISC-V Linux的内核源码,解除2M对齐的限制。我们只需要在setup_vm()
函数中,将原来的 二级页表改为三级页表 ,这样kernel入口地址只需要4K对齐,因此就能将kernel往前挪,从而利用前面的内存。
修改代码
路径:arch/riscv/mm/init.c
注释原来的2M对齐检查:
对kernel的前2M页表映射由二级页表改为三级页表:
//新增一个PTE
pte_t trampoline_pte[PTRS_PER_PTE] __page_aligned_bss;
create_pgd_mapping(trampoline_pg_dir,PAGE_OFFSET,
(uintptr_t)trampoline_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(trampoline_pmd,PAGE_OFFSET,
(uintptr_t)trampoline_pte,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + PMD_SIZE;
for (va = PAGE_OFFSET; va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(trampoline_pte,PAGE_OFFSET,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}
对整个kernel的页表映射由二级页表改为三级页表:
假设kernel大小为4M+
//定义三个PTE
pte_t load_sz_pte[PTRS_PER_PTE] __page_aligned_bss;
pte_t load_sz_pte1[PTRS_PER_PTE] __page_aligned_bss;
pte_t load_sz_pte2[PTRS_PER_PTE] __page_aligned_bss;
//=======0-2M======
create_pgd_mapping(early_pg_dir,PAGE_OFFSET,
(uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
(uintptr_t)load_sz_pte,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + PMD_SIZE;
for (va = PAGE_OFFSET; va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(load_sz_pte,PAGE_OFFSET,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}
//=======2-4M==========
create_pgd_mapping(early_pg_dir,PAGE_OFFSET + PMD_SIZE,
(uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
(uintptr_t)load_sz_pte1,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + (PMD_SIZE * 2);
for (va = PAGE_OFFSET + PMD_SIZE; va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(load_sz_pte1,va,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}
//=======4-6M==========
create_pgd_mapping(early_pg_dir,PAGE_OFFSET + (PMD_SIZE*2),
(uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
(uintptr_t)load_sz_pte2,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + (PMD_SIZE * 3);
for (va = PAGE_OFFSET + (PMD_SIZE*2); va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(load_sz_pte2,va,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}
通过以上的代码修改,就能将Kernel入口地址往前挪1.5M,只给opensbi预留512KB,这样RISC-V Linux启动之后,可用物理内存就会增加。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
内核
+关注
关注
3文章
1372浏览量
40282 -
Linux
+关注
关注
87文章
11296浏览量
209360 -
内存
+关注
关注
8文章
3020浏览量
74012
发布评论请先 登录
相关推荐
走进Linux内存系统探寻内存管理的机制和奥秘
Linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍Linux 内存组织结构
Linux内存相关知识科普
Linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍**Linu****x 内存组织结构和页面布局,
发表于 07-25 14:43
•724次阅读
单片机定义变量字符的那部分内存已经满了,怎么才能继续定义新的字符?
我用的比较老的4580芯片,需要定义的字符很多,用于OLED显示屏幕显示,但是定义字符的那部分内存已经满了,无法再加入新的字符,请问有什么好的解决办法吗?请不要告诉我换芯片,因为电路板是根据这个芯片制作的,有没有什么好的容易的解决办法?跪求
发表于 03-06 17:15
怎样在Linux内核中预留一部分内存空间作特殊用途呢
有时我们需要在 Linux 内核中预留一部分内存空间用作特殊用途(给安全模块使用,给其它处理器使用,或是给特定的驱动程序使用等),在 Device Tree 中有提供两种方法对预留内存进行配置
发表于 12-29 07:16
一文解析Linux系统保留内存的初始化流程
1、Linux系统保留内存的初始化流程在启动过程中会打印出如下信息,这些信息为linux呈现出系统下的保留内存空间。本文只介绍基本的保留内存
发表于 06-30 16:27
Linux内存初始化
之前有几篇博客详细介绍了Xen的内存初始化,确实感觉这部分内容蛮复杂的。这两天在看Linux内核启动中内存的初始化,也是看的云里雾里的,想尝试下边看边写,在写博客的过程中慢慢思考,最后
发表于 10-12 11:16
•0次下载
关于内存优化知识你知道多少呢?
为了优化应用内存,你应该知道是什么消耗了你应用的大部分内存,答案就是Texture(纹理)!它几乎占据了90%的应用内存。那么我们应该尽力去减小我们应用的纹理
发表于 08-31 10:36
•3037次阅读
你知道linux的cache memory?
当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory
发表于 04-26 15:49
•1239次阅读
怎么区分内存条的单面和双面
什么是单面和双面内存?它们有些什么样的特性与区别呢?你们知道怎么区分内存条单面和双面吗?下面小编带来怎么区分内存条单面和双面的内容,欢迎阅读!
发表于 05-28 09:51
•8907次阅读
嵌入式linux+io+优化,嵌入式Linux系统内存优化使用方法研究
优化进而确保响应运行。并且经过实践证明,嵌入式系统内存优化使用,能够提升系统空间5%内存,确保系统顺利运行。【关键词】 嵌入式 Linux系
发表于 11-01 16:31
•10次下载
Linux驱动模块.ko内存精简优化过程
Linux 驱动模块可以独立的编译成 .ko 文件,虽然大小一般只有几 MB,但对总内存只有几十 MB 的小型 Linux 系统来说,常常也是一个非常值得优化的点。本文以一个实际例子,
发表于 09-25 09:23
•1487次阅读
linux内存性能优化介绍
【1】内存映射 Linux 内核给每个进程都提供了一个独立且连续的虚拟地址空间,以便进程可以方便地访问虚拟内存;虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同字长的处理器,地
评论