首页 > 系统相关 >linux 内核空间内存分布

linux 内核空间内存分布

时间:2023-05-07 22:37:49浏览次数:42  
标签:映射 虚拟地址 地址 内存 linux 空间 内核

虚拟地址空间划分

linux通过宏“PAGE_OFFSET”将4GB的虚拟地址空间(32bit平台)划分成内核地址空间和进程地址空间两部分。“PAGE_OFFSET”的值支持通过Kconfig配置,其默认的值是“0xC0000000”。下面以经典的“PAGE_OFFSET=0xC0000000”来看下linux对虚拟地址空间的详细划分。

Linux将虚拟地址空间划分为:0~3G为用户空间,3~4G为内核空间。下面是一个经典划分图:

下面简要介绍下各个部分意义:

【1】Process address space

0x0000 0000 ~ PAGE_OFFSET - 1 :用户进程虚拟地址空间,用于用户空间地址映射。每个进程独有,进程通过mmap()系统调用建立的映射都在这个区域内(其实这个区间高地址还包含内核模块区域,范围为MODULES_VADDR ~ MODULES_END-1)。

【2】Physical memory mapping

PAGE_OFFSET ~ high_memory - 1 :物理内存映射区,又名“Kernel direct-mapped RAM region”,即内核直接物理内存映射区域。这个区域用于将内核空间前896M和物理空间的前896M进行直接映射。

high_memory是指超过能直接映射的物理内存部分,超过“high_memory”的虚拟地址属于高端内存区域,“高端”是相应直接映射区的“low memory”而定的。引入高端内存映射这样一个概念的主要原因就是我们所安装的内存大于1G时,内核的1G线性地址空间无法建立一个完全的直接映射来触及整个物理内存空间,而对于80x86开

启PAE的情况下,允许的最大物理内存可达到64G,因此内核将自己的最后128M的线性地址空间腾出来,用以完成对高端内存的暂时性映射。而在64位的系统上就不存在这样的问题了,因为可用的线性地址空间远大于可安装的内存。

用于映射高端物理内存的虚拟地址空间划分,因平台而异,上图给出的是x86中一种经典划分,下面分析下高端内存映射区域是如何使用的。

【3】Vmalloc area

VMALLOC_START ~ VMALLOC_END :区域由vmalloc ioremap使用,物理不连续,是内核动态映射区域,用于动态映射物理内存。此区域由vmalloc函数执行动态地址分配,虚拟地址连续但物理地址不连续的内存。物理地址一般是HIGH_MEM区域,但也可以是其他物理地址,比如外设寄存器地址。Vmalloc 区域和直接映射区有一个8MB的隔离区,另外每个独立的Vmalloc area中间都有4KB的隔离区,主要是为了“捕获”对内存的越界访问(因为空洞未映射,访问会报错,以达到捕捉越界行为的目的)。

【4】persistent kernel map

PKMAP_START ~ FIXADDR_START:区域是kmap 内核永久映射空间。这里的永久并不是指调用kmap()建立的映射关系会一直持续下去无法解除,而是指在调用kunmap()解除映射之前这种映射会一直存在,这是相对于临时内核映射机制而言的。另外kmap申请不到会导致阻塞。

【5】fix-map area

FIXADDR_START ~ end :区域是kmap_atomic 使用的内核固定映射空间,又称临时映射区,固定映射区不是线性转换,而是强制指定的任意映射,每个固定的线性地址都映射到一块物理内存页。以任意方式映射任意物理地址。(ARM中有3MB空间)。临时是因为会强制映射,覆盖以前已经有的映射,所以这种映射不会阻塞,可以用在中断处理流程中。主要用于使用线性地址常量代替指针变量,提高内存访问效率。

 

 

IMX6ULL 配置如下

CONFIG_VMSPLIT_2G=y

 

所以 PAGE_OFFSET 是 0x80000000,即内核空间的起始虚拟地址是 0x80000000。

PAGE_OFFSET: the virtual address of the start of the kernel image // 内核固件存储的起始地址是 PAGE_OFFSET

 

由于 IMX6ULL DDR 内存所在的物理地址是 0x80000000,内核固件存储在 DDR 首地址,所以内核空间的物理地址等于虚拟地址。

链接脚本设置的起始链接地址就是 0x80008000,因为在内核启动时执行自解压完成后,会跳转到解压后的地址处 0x80008000 运行

 

标签:映射,虚拟地址,地址,内存,linux,空间,内核
From: https://www.cnblogs.com/god-of-death/p/17380315.html

相关文章

  • 在linux上使用Qt开发动态库项目,怎么只生成一个so文件
     背景:在linux系统上,我们使用Qt开发动态库项目时,会默认生成四个文件:x.so 、x.so.1、x.so.1.0、x.so.1.0.0四个文件,只有一个真实的so库,剩下的三个都是链接文件。我们交付的时候,不可能发一堆文件出去,所以我们需要对Qt项目进行设置,保证输入的只有一个so文件......
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力
    作者:卢文双资深数据库内核研发序言:以前对MySQL测试框架MTR的使用,主要集中于SQL正确性验证。近期由于工作需要,深入了解了MTR的方方面面,发现MTR的能力不仅限于此,还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能,因此,本着分享的精神,将其......
  • 如何在Linux中查找一个文件
    《Linux就该这么学》-必读的Linux系统与红帽RHCE认证免费自学书籍免费电子版下载地址:https://www.linuxprobe.com/book导读对于新手而言,在Linux中使用命令行可能会非常不方便。没有图形界面,很难在不同文件夹间浏览,找到需要的文件。本篇教程中,我会展示如何在Linux中查找特......
  • Linux运维实战项⽬进阶
    项⽬描述项⽬需求近年来为适应业务发展的需求,世界500强XX企业准备进⾏⼤规模的电⼦商务建设,同时,希望能通过Linux平台,利⽤开源技术,来实现⼤型互联⽹电⼦商务⽹站架构建设和业务⽀撑,现要求成⽴运维技术保障部门,并邀请你担当运维部门经理,对整个运维部门进⾏部署和规划。当你拿到该......
  • Linux知识点
    LinuxLinux没有盘符这个概念,只有一个根目录/,所有文件都在它下面。./当前目录../上一级目录Linux主要目录速查表/根目录,一般根目录下只存放目录,在linux下有且只有一个根目录,所有的东西都是从这里开始。在终端里输入/home,其实是在告诉电脑,先从/(根目录)开始,再进入到hom......
  • linux 中查看各个子目录占用磁盘的大小
     001、[root@PC1test]#lsdir1dir2dir3[root@PC1test]#du-h##查看所有子目录占用磁盘的大小100M./dir1300M./dir230M./dir3430M. ......
  • 挂载NTFS分区,离线安装NTFS-3G(Linux挂载NTFS格式磁盘的方法)
    挂载NTFS分区,离线安装NTFS-3G(Linux挂载NTFS格式磁盘的方法)本文档环境为centos7.9版本目录挂载NTFS分区,离线安装NTFS-3G(Linux挂载NTFS格式磁盘的方法)一、NTFS-3G说明二、在线安装(有网络环境)三、离线安装(无网络环境)1单独下载软件包(gcc、ntfs-3g)2将下载的软件包传输目标虚拟机(......
  • linux下安装es+kibana
    1、下载安装包##下载es安装包##wgethttps://repo.huaweicloud.com/elasticsearch/7.9.3/elasticsearch-7.9.3-linux-x86_64.tar.gz##下载kibana安装包##wgethttps://artifacts.elastic.co/downloads/kibana/kibana-7.9.3-linux-x86_64.tar.gz2、安装elasticsearch解压......
  • (第26章)LinuxC本质中链表、二叉树和哈希表
    文章目录一、单链表的结构决定只能出栈,入栈1.链表的结构2.链表与数组的区别3.单链表所有基本操作代码(1)链表的插入(2)链表的查找(3)链表的删除(3)遍历整个链表(4)销毁整个链表4.习题5.C++NULL指针二、双向链表结构决定可以出队和入队1.在上面的单项链表上改改,得到双向链表2.改进双向链表:新增......
  • linux挂载的ntfs格式硬盘无法使用回收站
    linux挂载的ntfs格式硬盘无法使用回收站 解决办法:新建回收站文件,文件名为Trash-XXX.比如Trash-1000这里的1000就是你的$UID.sudomkdir/.Trash-1000sudochownuser:user/.Trash-1000 挂载ntfs硬盘时,指定好UID,比如: UUID=XXXXXXXXXXXXX/mnt/Entf......