Linux下内核空间和用户空间内存映射图详解

ops/2024/10/20 16:37:55/

目录

    • 一、简介
    • 二、内存空间定义
    • 三、内存权限
    • 四、内存空间映射图
      • 4.1 32位系统
      • 4.2 64位系统
      • 4.3 映射空间解析
    • 五、其他相关链接
      • 1、关于linux内存管理内容总结
      • 2、Linux内核中kzalloc分配内存时用的参数GFP_KERNEL详解
      • 3、Linux下stream内存带宽测试参数和示例详解附源码总结

一、简介

本文主要介绍内核和用户空间的物理地址到虚拟地址的映射,通过详细图解方便读者快速掌握。

二、内存空间定义

内核空间定义
内核空间是操作系统内核运行的区域,它包括了操作系统内核代码、数据结构和设备驱动程序等。内核空间通常是操作系统中的一块保护内存区域,只有操作系统内核才能够访问这个区域。
用户空间定义
用户空间是指用户应用程序运行的区域,包括用户应用程序代码、数据和堆栈等。
内核空间、用户空间的具体划分:针对 Linux 操作系统而言,最高的 1G 字节由内核使用,称为内核空间。而较低的 3G 字节由各个进程使用,称为用户空间。

以32位机器为例:
最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF);
较低的 3G 字节(从虚拟地址 0x00000000 到 0xBFFFFFFF)。

三、内存权限

1、内存访问权限不同
内核空间的内存访问权限比用户空间更高,因为内核需要访问整个系统的物理资源,例如设备驱动、中断处理程序等。
2、虚拟地址映射方式不同
用户空间的虚拟地址空间是由操作系统分配和管理的,它们通过页表映射到物理地址空间。而内核空间的虚拟地址空间是由内核自己管理的,它们不需要通过页表进行映射,而是直接映射到物理地址空间。
3、运行环境不同
内核空间是操作系统内核的运行环境,用户空间是应用程序的运行环境。

四、内存空间映射图

4.1 32位系统

3G用户态,1G内核态
在这里插入图片描述

4.2 64位系统

1.用户空间:0x0000 0000 0000 0000到0x0000 ffff ffff ffff,一共有256TB。
2.非规范区域。
3.内核空间:0xffff 0000 0000 0000到Oxffff ffff ffff ffff。一共有256TB.

在这里插入图片描述

4.3 映射空间解析

(1)线性映射区域的范围是[PAGE OFFSET,264-1],起始位置是PAGE OFFSET=(0xFFFFFFFF FFFF FFFF <<(VA BITS-1)),长度是内核虛拟地址空间的一半。称为线性映射区域的原因是虚拟地址和物理地址是线性关系:
虚拟地址=((物理地址-PHYS OFFSET)+PAGE OFFSET),:其中PHYS OFFSET是内存的起始物理地址。
内核空间又由线性映射、非线性映射区(包含vmaloc区、动态映射区、固定映射区)组成,我们kmalloc()/get free_page()分配内存就是从normal直接映射区的分配一片内核空间,这片空间的内存地址便是内核态虚拟地址,与物理内存构成线性偏移关系。表面是从直接映射区内核空间分配走一片内核虚拟空间,实际在读写这片内存时,读写对应的是构成映射关系的物理内存。

(2)固定映射区域的范围是[FIXADDR_START,FIXADDR_TOP),长度是FIXADDR_SIZE,结束地址是FIXADDR_TOP=(PCI I/O START-2MB)。
固定地址是编译时的特殊虚拟地址,编译的时候是一个常量,在内核初始化的时候映射到物理地址。
(3)vmalloc区域的范围是[VMALLOC_START_VMALLOC_END),起始地址是VMALLOC_START,等于内核模块区域的结束地址,结束地址是VMALLOC_END=(PAGE_OFFSET - PUD SIZE-VMEMMAP SIZE - 64KB),其中PUD SIZE是页上级目录表项映射的地址空间的长度。
vmalloc区域是函数vmalloc使用的虎拟地址空间内核使用vmalloc分配虚拟地址连续但物理地址不连续的内存。
内核镜像在vmalloc区域,起始虚拟地址是(KIMAGE_VADDR + TEXT OFFSET),其中

内核镜像在vmalloc区域,起始虚拟地址是(KIMAGE VADDR + TEXT OFFSET),其中KIMAGE VADDR是内核镜像的虚拟地址的基准值,等于内核模块区域的结束地址
MODULES END;TEXT OFFSET是内存中的内核镜像相对内存起始位置的偏移。
(6)内核模块区域的范围是[MODULES_VADDRMODULES END),长度是128MB,起始地址是MODULES_VADDR=(内核虚拟地址空间的起始地址 +KASAN影子区域的长度)。
内核模块区域是内核模块使用的虚拟地址空间,
(7)KASAN影子区域的起始地址是内核虚拟地址空间的起始地址,长度是内核虚拟地址空间长度的1/8。
内核地址消毒剂(KernelAddress SANitizer,KASAN)是一个动态的内存错误检查工具。它为发现释放后使用和越界访问这两类缺陷提供了快速和综合的解决方案。

五、其他相关链接

1、关于linux内存管理内容总结

2、Linux内核中kzalloc分配内存时用的参数GFP_KERNEL详解

3、Linux下stream内存带宽测试参数和示例详解附源码总结


http://www.ppmy.cn/ops/127028.html

相关文章

数据仓库-数仓分层建设

数仓分层设计的作用 支持数据的重用 通过在数据仓库中创建可重用的数据模型&#xff0c;可以减少数据的重复处理&#xff0c;提高数据的处理效率。 优化性能 通过在数据仓库的不同层次上进行数据聚合和汇总&#xff0c;可以提高查询性能&#xff0c;尤其是在面对大量数据时…

TiDB替换Starrocks:业务综合宽表迁移的性能评估与降本增效决策

作者&#xff1a; 我是人间不清醒 原文来源&#xff1a; https://tidb.net/blog/6638f594 1、 场景 业务综合宽表是报表生成、大屏幕展示和数据计算处理的核心数据结构。目前&#xff0c;这些宽表存储在Starrocks系统中&#xff0c;但该系统存在显著的性能瓶颈。例如&#…

儿童饰品上架亚马逊美国站CPC认证的重要性

儿童饰品上架亚马逊美国站时&#xff0c;CPC&#xff08;Childrens Product Certificate&#xff0c;儿童产品证书&#xff09;认证的重要性不容忽视。以下是CPC认证在此过程中的几个关键重要性&#xff1a; 1. 法律合规性 在美国&#xff0c;所有面向12岁及以下儿童销售的产…

系统架构设计师教程 第9章 19.6 大数据架构设计案例分析 笔记

19.6 大数据架构设计案例分析 19.6.1 Lambda架构在某网奥运中的大数据应用 系统架构 基于Lambda架构&#xff0c;由数据集成层、数据存储层、数据计算层和数据应用层构成 数据集成层分为离线数据集成和实时数据集成。 实时数据集成集群采用Nginx和 Flume服务器对实时流数据…

【verilog】3_8-4_16数选器

文章目录 前言一、实验原理二、实验过程三、实验结果参考文献 前言 进行 实验 一、实验原理 二、实验过程 三、实验结果 代码 timescale 1ns/1ns module decoder_38_tb ; reg a; reg b; reg c; wire [7:0]data;decoder_38 u0 (.a(a),.b(b),.c(c),.data(data) ); init…

效果不错的论文介绍:Im2Flow2Act:-跨领域机器人操控技术

Im2Flow2Act: 跨领域机器人操控技术 简介 今天介绍一个比较惊艳的论文&#xff0c;Im2Flow2Act&#xff0c;可以预测应该怎么移动图象中的物体预测移动方法完成需要执行的动作任务。 Im2Flow2Act 是一个基于学习的机器人操控框架&#xff0c;旨在通过多种数据源为机器人提供操…

LabVIEW提高开发效率技巧----用户权限控制

在LabVIEW开发中&#xff0c;用户权限控制是一个重要的设计模块&#xff0c;尤其在多用户系统中&#xff0c;它可以确保数据安全并控制不同用户的操作权限。为了实现用户权限控制&#xff0c;可以通过角色与权限管理模块来进行设计和实施。以下将从多个角度详细说明如何在LabVI…

【目标检测论文解读复现NO.39】基于改进 YOLOv8 的轻量级复杂环境苹果叶片病害检测方法

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…