物理内存或大或小,(256M或512M或1G或2G或4G) , 这里取 PHY_MAX
在这里 https://blog.csdn.net/u011011827/article/details/117413163 中的 "arm32 要不要配置 CONFIG_HIGHMEM" 讲述了
arm物理内存的不同 情况下 需要的配置
我们如果要配置 高端内存(虚拟内存概念)
// 但是一个zone 中有成员 zone_start_pfn , 这是 物理地址的概念,表示了一个zone的开始
// 所以 高端内存 属于 zone ,而 zone 又是 与 物理地址有关,所以感觉,这个 高端内存 像是 物理内存概念
则 我们会考虑 在 物理内存中 选择一个地址PHY_LINE(分界线)
往上 , 我们采取 一组 映射策略
往下 , 我们采取 另一组 映射策略
内核空间
内核空间 是 虚拟内存概念, 一般是指 3G-4G 区域
我们可以通过 https://blog.csdn.net/u011011827/article/details/117413163 中的 "内核空间与用户空间的比例" 来更改
内核空间所在的位置
以下,我们以 3G-4G 为例
内核空间 的 地址(虚拟地址) 范围 为 3G-4G , 这个地址空间要映射 所有的物理内存 (256M或512M或1G或2G或4G)
我们将 内核空间的地址分类
低端内存
3G - 3G+某个值(VIR_LINE)
高端内存
3G+某个值 - 4G
这个值 可以 通过 https://blog.csdn.net/u011011827/article/details/117413163 中的 "arm32 怎么调整 低端内存 和高端内存大小" 调整
我们的映射关系如下
低端虚拟内存空间(3G - 3G+VIR_LINE) - 物理地址空间(0G - PHY_LINE) // 线性映射关系
高端虚拟内存空间(3G+VIR_LINE - 4G) - 物理地址空间(PHY_LINE - PHY_MAX) // 非线性映射关系
内核空间的映射关系
我们知道 虚拟地址空间 3G-4G 要映射到 物理地址 (0-PHY_MAX),其中分为
A:低端虚拟内存空间(3G - 3G+VIR_LINE) - 物理地址空间(0G - PHY_LINE)
B:高端虚拟内存空间(3G+VIR_LINE - 4G) - 物理地址空间(PHY_LINE - PHY_MAX)
A 中的映射关系
是 线性关系, 只需要线性映射即可
PHY_ADDR = VIR_ADDR - 0xC000 0000 + OFFSET // OFFSET 一般为 内存在memory map中的首地址
只需要一类函数即可转换
B 中的映射关系,又分为三大类,五小类
vmalloc : 0xef80 0000 -
fixmap :
永久 :
临时 :
kmap :
kmap :
kmap_atomic :
描述在 https://blog.csdn.net/u011011827/article/details/117335579 中的 虚拟内存管理机制的区别
典型内存分区
Memory: 1031428K/1048576K available (4787K kernel code, 156K rwdata, 1364K rodata, 1348K init, 166K bss, 17148K reserved, 0K cma-reserved, 270336K highmem)
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
vmalloc : 0xf0000000 - 0xff000000 ( 240 MB)
lowmem : 0xc0000000 - 0xef800000 ( 760 MB)
pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
modules : 0xbf000000 - 0xbfe00000 ( 14 MB)
.text : 0xc0008000 - 0xc060a09c (6153 kB)
.init : 0xc060b000 - 0xc075c000 (1348 kB)
.data : 0xc075c000 - 0xc07833c0 ( 157 kB)
.bss : 0xc07833c0 - 0xc07acbf0 ( 167 kB)
分区描述
1. vector : 0xffff0000 - 0xffff1000 ( 4 kB)
异常向量表
The CPU vectors are mapped here if the CPU supports vector relocation (control register V bit.)
2. fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
三小类 虚拟内存管理机制 "fixmap 临时" "fixmap 永久" "kmap_atomic" 管理的虚拟内存区
3. vmalloc : 0xf0000000 - 0xff000000 ( 240 MB)
一小类 虚拟内存管理机制 "vmalloc" 管理的虚拟内存区
4. lowmem : 0xc0000000 - 0xef800000 ( 760 MB)
一小类 虚拟内存管理机制 "线性映射管理机制" 管理的虚拟内存区
5. pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
一小类 虚拟内存管理机制 "kmap" 管理的虚拟内存区
6. modules : 0xbf000000 - 0xbfe00000 ( 14 MB)
TODO
Kernel module space Kernel modules inserted via insmod are placed here using dynamic mappings.
8. 以下是 kernel(vmlinux) 在 内存中 的 分区
.text : 0xc0008000 - 0xc060a09c (6153 kB)
.init : 0xc060b000 - 0xc075c000 (1348 kB)
.data : 0xc075c000 - 0xc07833c0 ( 157 kB)
.bss : 0xc07833c0 - 0xc07acbf0 ( 167 kB)
linux官方定义的 ARM32 4G虚拟内存空间的布局
在 linux代码中 Documentation/arm/memory.rst 有写其布局
以前我总认为
用户空间 为 0x0000 0000 - 0xBFFF FFFF
内核空间 为 0xC000 0000 - 0xFFFF FFFF
现在看了手册才知道,布局可能是这样子的
这些空间唯一的不同是 用户不同, 而 用户 分为两类
1. 特权级用户
2. 非特权级用户
0000 0000 - 0000 0fff :CPU vector page 或 null pointer trap
0000 1000 - TASK_SIZE(bf00 0000)-1 :用户空间
bf00 0000 - MODULES_VADDR(bfe0 0000)-1 :modules空间
PKMAP_BASE(bfe0 0000) - PAGE_OFFSET(c000 0000)-1 :kmap空间
PAGE_OFFSET(c000 0000) - high_memory-1 :lowmem 线性映射空间
high_memory - high_memory+800000-1 :8MB空洞,用于捕获
VMALLOC_START(high_memory+800000) - VMALLOC_END(ff80 0000)-1 :vmalloc空间
ff80 0000 - ffbf ffff :fixmap空间
fffe 0000 - fffe 7fff :itcm空间
fffe 8000 - fffe ffff :dtcm空间
ffff 0000 - ffff 0fff :CPU vector page
ffff 1000 - ffff 7fff :Reserved
ffff 8000 - ffff ffff :copy_user_page / clear_user_page use
内核空间虚拟内存布局和进程内核态的关系
进程一旦陷入内核态,PC就跳转到了 3G-4G空间
1.
并随着函数的调用开始填充栈,填充的栈是局部变量 // 参考 https://blog.csdn.net/u011011827/article/details/122303983
// 地址在 thread_info 中 , thread_info 在 内核空间 哪个区? // TODO
2.
函数的执行还有指令的运行,如果这些指令又申请了空间,
// 地址根据不同的申请函数的不同(kmalloc vmalloc alloc_pages),而不同,具体在哪个区?//TODO
上一篇:OK6410A 开发板 (八) 101 linux-5.11 OK6410A printf 在 glibc 和 linux 中的流程
下一篇:OK6410A 开发板 (八) 99 linux-5.11 OK6410A 文件访问实例mmap与read的比较
推荐阅读最新更新时间:2024-10-19 01:58
设计资源 培训 开发板 精华推荐
- ESP32-S开发板
- CH340G下载器
- DC1783A-D,用于 LTC2376CMS-16、16 位、250 ksps、12.5MHz 低功率、低噪声模数转换器的演示板
- L7812A 远程关断稳压器的典型应用
- L7815A 固定输出稳压器的典型应用
- 使用 Infineon Technologies AG 的 IRU3039PBF 的参考设计
- 120W, 12V, 24V, 36V DC to DC 太阳能单路输出电源
- LT6656BIDC-2.5、2.5V 微控制器电压基准和稳压器的典型应用
- LF18ABDT-TR 1.8V 超低压降稳压器的典型应用
- LT3763IFE 1A、五个 LED 驱动器的典型应用电路