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

目录

    • 一、简介
    • 二、内存空间定义
    • 三、内存权限
    • 四、内存空间映射图
      • 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.mzph.cn/pingmian/56757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chapter 2 - 7. Understanding Congestion in Fibre Channel Fabrics

The Culprit Host In this case, is Host-1 really a culprit? The answer depends on whether to look from Host-1’s perspective or fabric’s perspective. If looking from Host-1’s perspective, calling it a culprit may not be entirely correct because it’s no…

HTTP cookie 与 session

一种关于登录的场景演示 - B 站登录和未登录 问题&#xff1a;B 站是如何认识我这个登录用户的&#xff1f;问题&#xff1a;HTTP 是无状态&#xff0c;无连接的&#xff0c;怎么能够记住我&#xff1f; 一、引入 HTTP Cookie 定义 HTTP Cookie&#xff08;也称为 Web Cooki…

Python的numpy库矩阵计算(数据分析)

一、创建矩阵 import numpy as np#创建矩阵anp.arange(15).reshape(3,5) bnp.arange(15,30).reshape(3,5) 使用arrange和reshape创建的二维数组就可以看成矩阵。 此时a和b存储的是&#xff1a; [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] [[15 16 17 18 19]…

VuePress集成到Vue项目的方法

VuePress 可以作为一个独立的静态站点生成器来使用&#xff0c;也可以集成到现有的 Vue 项目中。以下是将 VuePress 集成到 Vue 项目的几种方法&#xff1a; 1. 作为本地依赖集成 如果你想在现有的 Vue 项目中使用 VuePress 来管理文档&#xff0c;你可以将 VuePress 安装为本…

将两张图片的不同标记出来

差异过于细微&#xff0c;阈值设置不当&#xff1a;您的差异可能是颜色或位置的微小变化&#xff0c;当前的阈值和处理方式可能不足以检测到这些细微差异。 图像配准不够精确&#xff1a;由于两张图片内容高度相似&#xff0c;特征点匹配可能存在误差&#xff0c;导致图像对齐…

如何区分不同类型的光源

" 声明&#xff1a;此文档中的大部分内容来源于网络&#xff0c;经校对和整理后分享给大家&#xff0c;仅供学习参考使用。" 1、问题背景 之前调试的项目中&#xff0c;客户提供的客观验收标准中要求用到TL83光源&#xff0c;用来测试图像的颜色误差及白平衡。 TL83光…

用Java爬虫API,轻松获取taobao商品SKU信息

在电子商务的世界里&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;是商品管理的基础。对于商家来说&#xff0c;SKU的详细信息对于库存管理、价格策略制定、市场分析等都有着重要作用。taobao作为中国最大的电子商务平台之一&#xff0c;提供…

windows下载配置CAS单点登录

下载 github下载 云盘瞎子啊 版本对应jdk&#xff0c;根据自身环境下载对应版本的cas。 安装 下载完成之后解压 按照.md文档执行打包命令 build.bat package配置 如果不用https&#xff0c;需要进行以下配置&#xff1a; 修改配置文件application.properties 在最后一行…

SAP推出AI支出管理解决方案

SAP公司近日宣布&#xff0c;已将其生成式人工智能助手Joule整合至SAP Ariba和SAP Fieldglass的支出管理解决方案中&#xff0c;以增强企业在战略协作、生产力、合规性和业务洞察等方面的能力。这一消息是在10月15日于拉斯维加斯举行的SAP Spend Connect Live大会上发布的。嵌入…

【远程监控新体验】OpenObserve结合内网穿透无公网IP远程访问全攻略

文章目录 前言1. 安装Docker2. Docker镜像源添加方法3. 创建并启动OpenObserve容器4. 本地访问测试5. 公网访问本地部署的OpenObserve5.1 内网穿透工具安装5.2 创建公网地址6. 配置固定公网地址前言 本文主要介绍如何在Linux系统使用Docker快速本地化部署OpenObserve云原生可观…

Ajax处理错误信息(处理响应报文)

<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><form action""><div>用户名<input type"text" class"username"></div>…

时间序列神器Prophet教程2-饱和预测

公众号&#xff1a;尤而小屋编辑&#xff1a;Peter作者&#xff1a;Peter 大家好&#xff0c;我是Peter~ 本文是时间序列预测神器Prophet的第二篇&#xff1a;使用Prophet如何实现饱和预测 饱和预测增长-Saturating Forecasts 默认情况下&#xff0c;Prophet 使用线性模型来…

单点登录(Single Sign-On, SSO)

单点登录&#xff08;Single Sign-On, SSO&#xff09;是一种身份验证机制&#xff0c;允许用户使用一组凭据&#xff08;如用户名和密码&#xff09;登录一次&#xff0c;即可访问多个相关但独立的软件系统。SSO 的主要目的是简化用户的登录过程&#xff0c;提高用户体验&…

【C++】string类(2)

&#x1f973;个人主页: 起名字真南 &#x1f973;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 引言1 模拟实现string类基本框架2 实现string类中的主要成员函数2.1 Push_Back 函数2.2 reserve 函数2.3 append 函数2.4 c_str 函数2.5 begin ,end 函数2.5 operator 函数2.6…

基于STM32设计的实验室安全预警系统(OneNet)(246)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成【4】ESP8266工作模式配置1.2 设计思路【1】整体设计思路【2】整体构架1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要1.4 开发工具的选择【1】设备端开发【2】上…

除了 Python,还有哪些语言适合做爬虫?

以下几种语言也适合做爬虫&#xff1a; 一、Java* 优势&#xff1a; 强大的性能和稳定性&#xff1a;Java 运行在 Java 虚拟机&#xff08;JVM&#xff09;上&#xff0c;具有良好的跨平台性和出色的内存管理机制&#xff0c;能够处理大规模的并发请求和数据抓取任务&#x…

VScode写Java项目的教程

VScode写Java项目的教程 1.首先必选先安装Java解释器2.安装插件Java Extension Pack3.创建项目创建项目结构选择项目类型 4.测试结果源码内容 今天用一台老式笔记本写代码&#xff0c;IDEA跑不动就准备用VScode突然间就蒙了&#xff0c;怎么创建项目啊&#xff1f;于是就有了这…

自动驾驶系列—加速自动驾驶系统开发:多型号SoC快速适配的最佳实践

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Python编程探索:从基础语法到循环结构实践(下)

文章目录 前言&#x1f377;四、 字符串拼接&#xff1a;连接多个字符串&#x1f378;4.1 使用 操作符进行字符串拼接&#x1f378;4.2 使用 join() 方法进行字符串拼接&#x1f378;4.3 使用 format() 方法进行格式化拼接&#x1f378;4.4 使用 f-string&#xff08;格式化字…

闭包导致内存泄漏是个伪命题?

什么是闭包&#xff1f; 在JavaScript中&#xff0c;闭包是一个函数与其外部词法环境的组合。闭包允许函数访问其外部作用域的变量&#xff0c;即使在外部函数已经返回之后。这是JavaScript中一个强大的特性&#xff0c;常用于数据封装、模块化等。 什么是内存泄漏&#xff1…