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

本文详细探讨了ARM32架构下物理内存的配置,包括PHY_MAX的选择和是否配置HIGHMEM。同时,解释了内核空间的虚拟地址映射,3G-4G区域的低端和高端内存划分,并阐述了不同映射策略,如线性映射和非线性映射。此外,还介绍了内存分区,如vector、fixmap、vmalloc和lowmem等区域的功能和作用。最后,讨论了内核空间虚拟内存布局与进程内核态的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值