linux ARM64架构用户空间和内核空间的区分

一、ARM64 架构地址空间的「黄金分割」

ARM64(ARMv8-A)采用 48 位虚拟地址(Linux 默认配置),总空间为 256TB,分为高低两个 128TB 区域:

1. 地址空间整体布局
虚拟地址空间(48位,256TB)
┌───────────────────────────────────────┐
│            用户空间(低128TB)         │
│ 0x000000000000 ~ 0x000FFFFFFFFF       │ (低地址段,用户进程使用)
├───────────────────────────────────────┤
│            保留隔离区                 │
│ 0x010000000000 ~ 0xFFFFEFFFFFFFFFFF   │ (未使用,防止地址越界)
├───────────────────────────────────────┤
│            内核空间(高128TB)         │
│ 0xFFFF00000000 ~ 0xFFFFFFFFFFFFFFFF   │ (高地址段,内核专属空间)
└───────────────────────────────────────┘
2. 核心划分依据
  • 分界线0xFFFF00000000(由内核配置CONFIG_ARM64_PAGE_OFFSET决定)
  • 用户空间:低 128TB,地址最高位为 0b00...(前 16 位为 0)
  • 内核空间:高 128TB,地址最高位为 0b111111...(前 16 位为全 1)

二、图形化对比:用户空间 vs 内核空间 

1. 地址范围与用途对比图 

          虚拟地址空间(ARM64, 48位)
低地址───────────────────────────────────────高地址
┌───────────────────────────────────────┐
│               用户空间(128TB)         │
│  ╔══════════════════════════════════╗  │
│  ║  进程A的代码/数据/堆/栈           ║  │
│  ║  进程B的代码/数据/堆/栈           ║  │
│  ║  ...                              ║  │
│  ╚══════════════════════════════════╝  │
│                                         │
├───────────────────────────────────────┤
│               内核空间(128TB)         │
│  ╔══════════════════════════════════╗  │
│  ║  内核代码(.text/.data)          ║  │
│  ║  物理内存映射(memmap)           ║  │
│  ║  设备寄存器映射(ioremap)         ║  │
│  ║  动态分配内存(vmalloc)           ║  │
│  ║  全局内核数据(如task_struct)     ║  │
│  ╚══════════════════════════════════╝  │
└───────────────────────────────────────┘

2. 关键差异点对比表

特征用户空间地址内核空间地址
地址范围0x000000000000 ~ 0x000FFFFFFFFF0xFFFF00000000 ~ 0xFFFFFFFFFFFFFFFF
最高位标志前 16 位为0b00...(低地址段)前 16 位为0b111111...(高地址段)
访问权限用户态受限(仅本进程可访问)内核态全权限(所有进程共享)
页表机制每个进程独立页表(地址隔离)全局页表(所有进程共享同一映射)
特权标志页表项设置PXN=1(用户态禁止执行)页表项设置PXN=0(内核态允许执行)
典型场景存储用户程序、堆、栈、动态库存储内核代码、设备驱动、物理内存映射

三、技术实现:ARM64 如何隔离两个空间?

1. 页表项中的「权限开关」

ARM64 通过 页表项(PTE)标志位 控制访问权限,核心标志:

  • PXN(Permission Execute Never)
    • 用户空间页表项:PXN=1 → 用户态下禁止执行该页的代码(防恶意代码注入)。
    • 内核空间页表项:PXN=0 → 内核态下允许执行(如内核函数调用)。
  • UXN(User Execute Never)
    • 用户空间数据页:UXN=1 → 用户态下禁止执行数据页(防栈溢出攻击)。

graph TD
A[用户态程序访问地址] --> B{地址 < 0xFFFF00000000 ?}
B -->|是| C[查询用户进程页表]
C --> D{页表项PXN=1 ?}
D -->|是| E[允许访问(用户空间数据/代码)]
D -->|否| F[触发页错误(用户态禁止执行)]
B -->|否| G[触发页错误(用户态禁止访问内核空间)]H[内核态程序访问地址] --> I{地址 >= 0xFFFF00000000 ?}
I -->|是| J[查询全局内核页表]
J --> K[允许访问(内核态无PXN限制)]
I -->|否| L[查询用户进程页表(需通过copy_from_user)]

3. 实战代码:判断地址所属空间

// ARM64内核空间起始地址(Linux默认)
#define KERNEL_SPACE_START 0xFFFF00000000ULLbool is_kernel_address(unsigned long addr) {// 检查地址是否位于高128TB(内核空间)return (addr & 0xFF0000000000ULL) == 0xFF0000000000ULL;
}// 示例:
unsigned long user_addr = 0x12345678ABCDULL;      // 低地址,用户空间
unsigned long kernel_addr = 0xFFFF12345678ABCDULL; // 高地址,内核空间printf("user_addr属于%s空间\n", is_kernel_address(user_addr) ? "内核" : "用户");
// 输出:user_addr属于用户空间

四、64 位 vs 32 位 ARM 地址空间对比 

特征ARM64(48 位)ARM32(32 位,3:1 划分)
总空间256TB4GB
用户空间低 128TB(0x000... ~ 0x00F...)低 3GB(0x00000000 ~ 0xBFFFFFFF)
内核空间高 128TB(0xFFF... ~ 0xFFFF...)高 1GB(0xC0000000 ~ 0xFFFFFFFF)
地址标志最高 16 位全 1(内核)/ 全 0(用户)最高 2 位为 11(内核,如 0xC0000000)
隔离方式物理地址标签 + PXN/UXN 硬件保护软件页表权限 + PAGE_OFFSET 划分

五、典型场景:进程切换时的地址空间变化 

当用户态进程通过 syscall 进入内核时:

  1. 地址切换
    • 用户态栈地址(如0x0000...)→ 内核态栈地址(如0xFFFF...)。
  2. 权限升级
    • CPU 从 EL0(用户态) 切换到 EL1(内核态),解除 PXN/UXN 限制。
  3. 页表共享
    • 用户空间页表继续使用,但内核空间通过全局页表访问高地址段。

总结:3 步快速区分 ARM64 地址空间

  1. 看最高位:前 16 位是否为 0b111111...(内核空间)或 0b00...(用户空间)。
  2. 查访问权限:用户态程序能否直接访问(能→用户空间,否则→内核空间)。
  3. 看上下文:代码是否运行在内核态(如中断处理、系统调用),若是则为内核空间地址。

通过这种「地址范围 + 硬件权限 + 执行环境」的三重判断,就能准确区分 ARM64 架构下的用户空间与内核空间地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87728.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87728.shtml

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

相关文章

51单片机重要知识点1

1. 在读IO口状态前必须先写该IO口1. 即让下拉MOS高阻断路。如&#xff1a; P221; KEYP22; 复位状态各IO口1的。另外大多数情况都不会IO口即做输入又做输出的。设计思想永远不要复杂化高难度编程&#xff0c;而要简单明了。 2.

【解析法与几何法在阻尼比设计】自控

解析法与几何法在阻尼比设计中的详细对比 一、解析法&#xff1a;基于数学方程的定量求解 核心思想&#xff1a;通过特征方程与根轨迹条件建立代数关系&#xff0c;直接求解满足阻尼比要求的系统参数。 1. 适用场景 二阶系统或可简化为二阶系统的高阶系统&#xff08;主导极…

搭建pikachu靶场

文章目录 一、pikachu是什么?二、搭建环境1.下载链接三、安装教程phpstudy安装配置pikachu 靶场安装配置总结一、pikachu是什么? Pikachu 靶场是一个专门为网络安全爱好者和学习者设计的 Web 安全靶场。它旨在帮助用户学习和实践常见的 Web安全漏洞和攻击手法。Pikachu 靶场通…

OpenStack Dashboard在指定可用域(Availability Zone)、指定节点启动实例

通过OpenStack Dashboard在指定可用域&#xff08;Availability Zone&#xff09;中创建实例的完整配置&#xff0c;涵盖可用域创建、节点管理、关系与限制的详细步骤&#xff1a; 一、可用域&#xff08;Availability Zone&#xff09;的概念与关系 0.指定域、指定节点、指定…

6.时间序列预测的模型部署

6.1实验设置和python版的Azure机器学习SDK介绍 6.1.1 WorkSpace 6.1.2 Experiment 6.1.3 Run 6.1.4 Model 6.1.5 ComputeTarget、RunConfiguration和ScriptRunConfig 6.1.6 Image 和 Webservice 6.2 机器学习模型部署 6.3 时间序列预测的解决方案体系结构部署示例 6.3.1 训练…

加密货币:比特币

比特币&#xff08;Bitcoin&#xff0c;简称BTC是一种去中心化的数字货币&#xff0c;由中本聪&#xff08;Satoshi Nakamoto&#xff09;在2008年提出&#xff0c;并于2009年正式推出。它是首个基于区块链技术的加密货币&#xff0c;旨在实现点对点的价值传输&#xff0c;无需…

【Dv3Admin】应用WSGI启动配置文件解析

在 Django 项目部署中&#xff0c;WSGI 是连接 Web 服务器与应用的标准接口。它负责接收请求、交由 Django 处理并返回响应&#xff0c;是系统上线运行的基础组件。理解其作用&#xff0c;有助于掌握项目的启动流程与部署逻辑。 本文解析 application/wsgi.py 模块的结构与功能…

aws各类服务器编号

在 AWS 中&#xff0c;服务器实例编号通常由一个字母和数字组合而成&#xff0c;每个字母代表不同的实例系列&#xff0c;数字则表示该系列的不同版本或规格。以下是对常见实例系列编号的解释&#xff1a; T 系列&#xff08;突发性能型&#xff09; 特点&#xff1a;T 系列实例…

Netty实战:从核心组件到多协议实现(超详细注释,udp,tcp,websocket,http完整demo)

目录 前言 一、为什么选择Netty&#xff1f; 二、Netty核心组件解析 三、多协议实现 1. TCP协议实现&#xff08;Echo服务&#xff09; 2. UDP协议实现&#xff08;广播服务&#xff09; 3. WebSocket协议实现&#xff08;实时通信&#xff09; 4. HTTP协议实现&#x…

MCP出现的意义是什么?让 AI 智能体更模块化

AI 智能体现在能做的事情真的很厉害&#xff0c;可以思考、规划&#xff0c;还能执行各种复杂任务&#xff0c;而且代码量并不大。这让开发者看到了一个机会&#xff1a;把那些庞大复杂的代码库和 API 拆解成更实用的模块。 不过要让这些智能变成现实世界里真正能用的东西&…

【深度剖析】领信卓越:福耀玻璃的数字化转型(下篇3:阶段成效3-打造从功能部件到数据终端跃迁的智能化产品)

在数字经济持续发展的背景下,企业数字化转型方案成为实现转型的关键。不同行业内的企业因转型动机和路径的差异,其转型成效也各异。福耀玻璃自1983年创立以来,从一家濒临破产的乡镇水表玻璃厂蜕变为全球汽车玻璃行业的领军企业,其发展历程堪称中国制造业的典范。创始人曹德…

告别停机烦恼!AWS EC2实例升级的“零中断”实战方案

引言&#xff1a; “服务器要升级了&#xff0c;今晚得停机维护...” —— 这句话曾是多少运维工程师的“噩梦”&#xff0c;也是业务部门最不愿听到的通知。在追求极致用户体验和7x24小时业务连续性的今天&#xff0c;停机窗口已成为难以承受之重。尤其是在云时代&#xff0c…

奇葩的el-checkbox-group数组赋值

背景。自定义表单。多选组件封装。当选项被多选后&#xff0c;el-checkbox-group中v-model的值以数组形式存储了选中的内容。奇葩问题。存储的值时label属性。而渲染时需要使用插值单独将选项的名称渲染出来。而在el-checkbox标签中:label要赋值option.value很别扭。 <temp…

【Python系列PyCharm实战】ModuleNotFoundError: No module named ‘sklearn’ 系列Bug解决方案大全

【Python系列Colab实战】ModuleNotFoundError: No module named ‘sklearn’ 系列Bug解决方案大全 一、摘要 在使用 Jupyter、PyCharm 或 Google Colab 进行机器学习开发时&#xff0c;导入 sklearn&#xff08;scikit-learn&#xff09;相关模块时&#xff0c;常会遇到一系列…

小白的进阶之路系列之十六----人工智能从初步到精通pytorch综合运用的讲解第九部分

从零开始学习NLP 在这个由三部分组成的系列中,你将构建并训练一个基本的字符级循环神经网络 (RNN) 来对单词进行分类。 你将学习 如何从零开始构建循环神经网络NLP 的基本数据处理技术如何训练 RNN 以识别单词的语言来源。从零开始学自然语言处理:使用字符级 RNN 对名字进行…

MySQL在ubuntu下的安装

前言&#xff1a; 安装与卸载中&#xff0c;用户全部进行切换为root ,一旦安装&#xff0c;普通用户也是可以进行使用 初期联系mysql时不进行用户的管理&#xff0c;直接使用root 进行即可&#xff0c;尽快适应mysql语句&#xff0c;后面进行学了用户管理再考虑新建普通用户。&…

低代码技术实战:从 0 到 1 构建高效业务流程应用

引言 在当今竞争激烈的商业环境中&#xff0c;企业迫切需要简化运营并提高效率。低代码技术作为一种新兴的解决方案&#xff0c;正逐渐成为企业实现这一目标的有力工具。它能够将繁琐的手工业务流程转化为数字资产和应用程序&#xff0c;为企业带来诸多优势。本文将详细介绍低…

RPGMZ游戏引擎 如何手动控制文字显示速度

直接上代码 const _Window_Base_prototype_initialize Window_Base.prototype.initialize;Window_Base.prototype.initialize function(rect) {_Window_Base_prototype_initialize.call(this, rect);this.文字速度缓冲 0;}; this.文字速度缓冲 0; 进行缓冲 Window_Base…

Leetcode-1750. 删除字符串两端相同字符后的最短长度

Problem: 1750. 删除字符串两端相同字符后的最短长度1750. 删除字符串两端相同字符后的最短长度 1750. 删除字符串两端相同字符后的最短长度 思路 双指针遍历 解题过程 模拟题目描述的过程&#xff0c;使用指针 l, r 指向首尾两端。 如果相同就向中心移动。为了尽可能的删除多…

【mysql】通过information_schema.tables查询表的统计信息

1 查询表的统计信息 information_schema.tables 是 MySQL 中的一个系统视图&#xff0c;包含数据库中所有表的信息。 如何查询当前数据库的所有表信息&#xff1a; SELECT * FROM information_schema.tables WHERE table_schema DATABASE(); 返回的字段有&#xff1a; 字段名…