欢迎来到天天文库
浏览记录
ID:22209981
大小:280.15 KB
页数:7页
时间:2018-10-27
《深度分析linux内核高端内存分析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Linux内核高端内存1.Linux内核地址映射模型x86CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射活,才真正访问物理内存。段页式机制如下图LogicalAddress(orFarPointer)SegmentSelectorOffsetLinearAddressSegmentationPaging2.Linux内核地址空间划分通常32位Linux内核地址空间划分0〜3G为用户空间,3〜4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。kernelmemory(1GB)OxCOO
2、OOOOOTASK_SI2E=OxCOOOOOOO(Upper-limitofuser-space)usermemory(3GB)PAGE_OFFSET=OxCOOOOOOO(Lowerboundofkernelspace)0x000000003.Linux内核高端内存的由来当内核模块代码或线程访内存吋,代码屮的内存地址都为逻辑地址,而对I、V:到真正的物理内存地址,需耍地址一对一的映射,如逻辑地址0XC0000003对应的物理地址为0x3,0xc0000004对应的物理地址为0x4,,逻辑地址与物理地址对应的关系为物理地址=逻辑地址-OxCOO
3、OOOOO逻辑地址物理内存地址OxCOOOOOOO0x00xc00000010x10xc00000020x20xc00000030x3•譬穆0xe00000000x20000000……Oxffffffff0x40000000??假设按照上述简单的地址映射关系,那么内核逻辑地址空间访问为OxcOOOOOOO〜Oxffffffff,那么对应的物理内存范M就为0x0〜0x40000000,即只能访W1G物理内存。苦机器中安装8G物理内存,那么内核就只能访问前1G物理闪存,物理㈧存将会无法访问,因为闪核的地址空间已经企部映射到物理內存地址范围0x0〜0x
4、40000000。即使安装了8G物理内存,那么物理地址为0x40000001的内存,内核该怎么去访问呢?代码中必须要有內存逻辑地址的,0XC0000000〜Oxffffffff的地址空间已经被用完了,所以无法访问物理地址0x40000000以后的闪存。站然不能将内核地址交间OXCOOOOOOO-Oxfffffff全部川来简申的地址映射,因此X86架构中将内核地址空间划分三部分:ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,ZONE_HIGHMEM即为高端内存,这就足内存商端内存概念的山来。在x86结构巾,三种类型的区域如下:
5、ZONENORMAL16MB〜896MBZONE_HIGHMEM896MB〜结朿896-MBVirtualaddress-space4.Linux内核高端内存的理解前面我们解释了高端内存的由来。Linux将内核地址空问划分为三部分ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,高端内存HIGH_MEM地址空间范M为0xF8000000〜OxFFFFFFFF(896MB〜1024MB)。那么如內核足如何借助128MB高端内存地址空间是如何实现访问可以所有物理内存?当内核想访问岛于896MB物理地址闪存时,从0xF8000000~
6、OxFFFFFFFF地址空间范围I人J找一段相应人小中W的逻辑地址中间,借用一会。借用这段逻辑地址空间,建立映射到想访闷的那段物理内存(即填充内核PTE页面表),临时用一会,用完后归还。这样别人也nj_以借川这段地址空间访问其他物理內存,实现了使川有限的地址空间,访问所有所有物玴内存。如下图。内核髙端内存逻辑地址空间OxF8000000-OxFFFFFFFF0〜896MBDRAM896MB〜内存物理地址空间例如內核想访问2G开始的一段大小为1MB的物理内存,即物理地址范围为0x80000000〜0X800FFFFF。访问之前先找到一段1MB人小的
7、空闲地址空间,假设找到的空闲地址空间为0XF8700000〜0XF87FFFFF,用这1MB的逻辑地址空间映射到物理地址空间0x80000000〜0X800FFFFF的内存。映射关系如下:逻辑地址物理内存地址OXF87000000x800000000XF87000010x800000010XF87000020x80000002……0XF87FFFFF0X800FFFFF当内核访问完0x80000000〜0X800FFFFF物理内存后,就将0xF8700000〜0XF87FFFFF闪核线性空间释放。这样其他进程或代码也可以使用0xF8700000〜
8、0XF87FFFFF这段地址访问其他物理內存。从上面的描述,我们可以知道髙端内存的最基本思想:借一段地址空间,建立临吋地址映射,用完后释
此文档下载收益归作者所有