Linux内核内存

1.linux内核内存相关内容

明确:用户空间占用4G虚拟内存的前3G
虚拟地址范围:0x00000000 ~ 0xBFFFFFFF
内核空间占用4G虚拟内存的后1G
虚拟地址范围:0xC0000000 ~ 0xFFFFFFFF

明确:
不论在内核空间还是用户空间,看到的地址都是虚拟地址,只是虚拟地址空间不一样;
但是CPU最终访问的地址是虚拟地址对应的物理地址;虚拟地址转换成对应的物理地址需要MMU;
将来MMU利用页表进行地址转换;

引申:uclinux支持不带MMU的处理器;

问:用户空间的虚拟内存和物理内存的映射关系?
问:内核空间的虚拟内存和物理内存的映射关系?



答:
4.概念:
IO空间:
内存空间:
对于X86架构,有两类总线:
一类总线的位宽为16位,地址空间的大小为64K,如果外设连接到这类总线,
CPU访问外设只能通过in,out两条指令;对于这个地址空间又称IO空间;

另一类总线的位宽为32位,地址空间的大小为4G(物理地址),如果外设连接到这类总线,
CPU访问外设通过地址指针的形式,对于这个地址空间又称内存空间,例如:
*(volatile unsigned long *)0xE0200080 = 0x11000;
对于ARM架构:
无IO空间,有内存空间

切记:将来CPU(ARM)访问某个外设,必须要弄清楚这个外设的地址,
将来软件上以地址指针的形式访问这个外设即可;
这个地址可以通过芯片手册和原理图来获取

5.用户虚拟内存和物理内存的映射:
采用动态内存映射,需要访问了,动态建立用户虚拟地址和物理地址的映射关系,
访问完毕,要解除用户虚拟地址和物理地址的映射关系;
这种动态内存映射造成内存的访问效率不高;
用户最大能够访问3G物理内存;

6.内核虚拟内存和物理内存的映射:
采用静态内存映射,在内核启动的时候,就已经将内核1G的虚拟内存和物理内存做一一的映射关系,
这种映射对内存的访问效率较高,一一映射:
内核虚拟地址 物理内存物理地址
0xC0000000 0x0
0xC0000001 0x1
0xC0000002 0x2
0xC0000003 0x3
... ...
如果采用以上一一映射,最终导致内核只能访问1G的物理内存;


2.内核1G虚拟内存的划分

划分的本质目的:最终的目的是既可以保证内存的访问效率,有可以让内核访问所有的物理内存;

X86平台,内核1G虚拟内存的划分:
直接内存映射区:
特点:
1.直接内存映射区对应的内核虚拟内存,在内核启动的时候,就已经跟物理内存进行一一映射;这块内存的访问效率要高;
2.如果物理内存大于1G,此时直接内存映射区的大小为896M,如果物理内存小于1G(512M),那么直接内存映射区的大小就是物理内存的大小;
3.直接内存映射区又称低端内存;

动态内存映射区:
特点:
1.如果要访问某块物理内存或者某个物理地址,
可以将这个物理内存或者物理地址动态映射到动态内存映射区的虚拟内存上或者虚拟地址上;
这种内存的访问效率要低,如果不再使用,记得要解除地址映射;
2.默认大小为120M

永久内存映射区:
固定内存映射区:
特点:
1.永久是固定,固定就是永久
2.如果频繁访问某个物理内存或者物理地址,
可以将这个物理地址或者物理内存映射到永久内存映射区或者固定内存映射区,
无需频繁建立映射和解除映射,加快内存的访问效率;

注意:前者在映射的时候会导致休眠,不能用于中断上下文
后者可以用于中断上下文中;

3.各自大小为4M

注意:动态 + 永久 + 固定 = 高端内存

 ARM架构
S5PV210处理器,内核1G虚拟内存的划分:
1.启动开发板
2.查看内核打印信息,找到如下信息:
Virtual kernel memory layout:
起始地址 结束地址 大小
异常向量表
vector : 0xffff0000 - 0xffff1000 ( 4 kB)

固定内存映射区
fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)

DMA内存映射区:
DMA : 0xff000000 - 0xffe00000 ( 14 MB)

动态内存映射区:
vmalloc : 0xf4800000 - 0xfc000000 ( 120 MB)

直接内存映射区
lowmem : 0xc0000000 - 0xf4000000 ( 832 MB)

modules : 0xbf000000 - 0xc0000000 ( 16 MB)
.init : 0xc0008000 - 0xc0037000 ( 188 kB)
.text : 0xc0037000 - 0xc0838000 (8196 kB)
.data : 0xc0838000 - 0xc088c900 ( 339 kB)   















  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值