• 首页
  • 中国
  • OK6410A 开发板 (八) 100 linux-5.11 OK6410A 内核空间虚拟内存布局

OK6410A 开发板 (八) 100 linux-5.11 OK6410A 内核空间虚拟内存布局

2023-11-01 80浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

物理内存

物理内存或大或小,(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

百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台