当前位置:  技术问答>linux和unix

Linux内存线性地址空间布局解析---的一些疑惑,大家帮忙解释解释

    来源: 互联网  发布时间:2016-09-17

    本文导语:  Linux内存线性地址空间大小为4GB,分为2个部分:用户空间部分(通常是3G)和内核空间部分(通常是1G)。在此我们主要关注内核地址空间部分。 内核通过内核页全局目录来管理所有的物理内存,由于线性地址前3G空间为用...

Linux内存线性地址空间布局解析---的一些疑惑,大家帮忙解释解释[图片]



Linux内存线性地址空间大小为4GB,分为2个部分:用户空间部分(通常是3G)和内核空间部分(通常是1G)。在此我们主要关注内核地址空间部分。

内核通过内核页全局目录来管理所有的物理内存,由于线性地址前3G空间为用户使用,内核页全局目录前768项(刚好3G)除0、1两项外全部为0,后256项(1G)用来管理所有的物理内存。内核页全局目录在编译时静态地定义为swapper_pg_dir数组,该数组从物理内存地址0x101000处开始存放。

由图可见,内核线性地址空间部分从PAGE_OFFSET(通常定义为3G)开始,为了将内核装入内存,从PAGE_OFFSET开始8M线性地址用来映射内核所在的物理内存地址;接下来是mem_map数组,mem_map的起始线性地址与体系结构相关,比如对于UMA结构,由于从PAGE_OFFSET开始16M线性地址空间对应的16M物理地址空间是DMA区,

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题1、既然PAGE_OFFSET+8M开始的地方已经放了内核的image了,那PAGE_OFFSET+16M怎么又对应16M物理内存空间了,用于DMA了?
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

mem_map数组通常开始于PAGE_OFFSET+16M的线性地址;从PAGE_OFFSET开始到VMALLOC_START – VMALLOC_OFFSET的线性地址空间直接映射到物理内存空间(一一对应影射,物理地址线性地址-PAGE_OFFSET),这段区域的大小和机器实际拥有的物理内存大小有关,这儿VMALLOC_OFFSET在X86上为8M,主要用来防止越界错误;在内存比较小的系统上,余下的线性地址空间(还要再减去空白区即VMALLOC_OFFSET)被vmalloc()函数用来把不连续的物理地址空间映射到连续的线性地址空间上,
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题2、这块前面(一一对应影射,物理地址线性地址-PAGE_OFFSET)把物理内存都映射到了PAGE_OFFSET开始到VMALLOC_START – VMALLOC_OFFSET的线性地址空间,那后面(被vmalloc()函数用来把不连续的物理地址空间映射到连续的线性地址空间上)是在做什么,前面已经映射了一次,后面还映射一次不是重复了吗,为什么前面要映射所有的物理内存,那我直接访问前面和访问后面是不是一样的,主要是不明白为什么要这样做,总感觉这有点模糊?
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


在内存比较大的系统上,vmalloc()使用从VMALLOC_START到VMALLOC_END(也即PKMAP_BASE减去2页的空白页大小PAGE_SIZE)的线性地址空间,此时余下的线性地址空间(还要再减去2页的空白区即VMALLOC_OFFSET)又可以分成2部分:第一部分从PKMAP_BASE到FIXADDR_START用来由kmap()函数来建立永久映射高端内存;第二部分,从FIXADDR_START到FIXADDR_TOP,这是一个固定大小的临时映射线性地址空间,(引用:Fixed virtual addresses are needed for subsystems that need to know the virtual address at compile time such as the APIC),在X86体系结构上,FIXADDR_TOP被静态定义为0xFFFFE000,此时这个固定大小空间结束于整个线性地址空间最后4K前面,该固定大小空间大小是在编译时计算出来并存储在__FIXADDR_SIZE变量中。

正是由于vmalloc()使用区、kmap()使用区及固定大小区(kmap_atomic()使用区)的存在才使ZONE_NORMAL区大小受到限制,由于内核在运行时需要这些函数,因此在线性地址空间中至少要VMALLOC_RESERVE大小的空间。VMALLOC_RESERVE的大小与体系结构相关,在X86上,VMALLOC_RESERVE定义为128M,这就是为什么ZONE_NORMAL大小通常是16M到896M的原因





问题3、这里VMALLOC_START 是固定的大小还是,会变?就是编译时就定死了,还是根据物理内存啥的算出来的?


问题4、这么映射物理内存,那么物理内存是4G,或者大于4G怎么办?

|
1,跟体系结构有关,ARM的kernel地址是C0008000,X86的是C0100000,
从PAGE_OFFSET开始8M线性地址用来映射内核所在的物理内存地址???

2.vmalloc有它自己的用处,可以分配连续的线性地址,这是很有用的,因为内核有时候是没有那么大块连续的物理内存,前面的应该都是连续的物理内存。

3.VMALLOC_START可以改。

4.如果物理内存RAM大于4GB,则选用CONFIG_X86_PAE(启用PAE模式)来进行访问。

    
 
 

您可能感兴趣的文章:

  • linux中/dev下都是些什么文件啊?大侠们谁可以帮我解释一下?
  • linux 解释
  • 哪位高手可以解释下Linux的消息机制吗?谢谢
  • 在linux下sed 怎么使用请大虾给点纤悉的解释
  • 由谁在Linux下用java顺利解释过.class文件?
  • 哪位高人有Linux/Unix下的HTML解释器?请共享一下。急用。3X。
  • linux下载shell解释器问题
  • 请大家解释一下Linux的各种启动模式。
  • 请帮我解释一下linux下"updatedb"这个命令的含义,谢谢:-)
  • 大虾解释一下linux内核中的页着色。
  • 解释一下Linux下的SHELL编程,急!
  • linux10+apache+tomcat5.0整合详细解释一下
  • 这条Linux命令如何解释
  • linux修改目录和文件权限的简单命令解释
  • 哪位前辈给解释下linux下虚拟内存和物理内存的关系!
  • 谁有linux内核解释方面的书籍?
  • 求linux的一些命令解释
  • 各位高手,谁能解释一下在Linux下的.la文件是怎么样编释的?以及怎么样才使用?
  • 学习linux下编程时,一些概念问题,请帮助解释,谢谢
  • 请高手指教,给我解释一下LINUX的好处呗????????
  • linux0.11内核线性地址问题,请教!!
  • Linux下的非线性编辑器有哪些比较专业????
  • 《操作系统原理linux篇》逻辑地址,线性地址 物理地址
  • 关于LINUX运行时线性空间及物理内存存储的分布问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下是否有配置文件修改键盘布局?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • linux c下利用srand和rand函数生成随机字符串
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • Linux c++虚函数(virtual function)简单用法示例代码
  • 我们网站的服务器从windows2000迁往linux,ASP程序继续使用,可是我连LINUX的皮毛都不了解,大家告诉我LINUX下怎么建网站??
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • 中文Linux与西文Linus分别哪一个版是权威?I认为是:中科软的白旗Linux与西文的绿帽子Linux!大家的看法呢?
  • Linux下chmod命令详细介绍及用法举例
  • 我重装了winme,却进不了Linux了,而我现在又没有Linux光盘,也没有Linux启动盘,还有没有办法?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3