文章目录

  • 一、物理地址空间
  • 二、外围设备寄存器
  • 三、外围设备寄存器物理地址 映射到 虚拟地址空间

一、物理地址空间


" 物理地址空间 “ 是 CPU 处理器 在 ” 总线 " 上 访问内存的地址 ,

RISC 处理器 只能访问 物理地址空间 , 系统的 外围设备 与 物理内存 都使用 统一的物理地址空间 访问 ;

RISC 全称 " Reduced Instruction Set Computer " , 精简指令集计算机 ;

分配给 " 外围设备 " 的 物理地址 , 又称为 " 设备内存 " ;

ARM64 架构的系统中 , 物理地址空间 分为 222 类 :

  • ① 正常内存 : Normal Memory , 指的是 随机存取存储器 RAM 和 只读存储器 ROM ;
  • ② 设备内存 : Device Memory , 指的是 分配给 " 外围设备寄存器 " 的 物理地址 ;

ARM64 架构 , 参考 【Linux 内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init ) 博客 , 物理地址最大支持 484848 位 ;

二、外围设备寄存器


CPU 处理器 访问 " 外围设备 “ 是通过 ” 外围设备控制器 " 的 " 寄存器 " 实现的 ;

处理器芯片 中的 寄存器 分为 333 大类 :

  • 控制寄存器
  • 状态寄存器
  • 数据寄存器

外围设备寄存器 有 222 种 编址方式 :

  • ① I/O 映射方式 , I/O-Mapped
  • ② 内存映射方式 , Memory-Mapped

外围设备寄存器 一般是 连续编址 的 ,

三、外围设备寄存器物理地址 映射到 虚拟地址空间


用户空间 的 应用进程 , 访问 " 外围设备寄存器 " 只能通过 " 虚拟地址 " 实现 ,

Linux 内核 提供了 相关 API 函数 , 将 " 外围设备寄存器 “ 对应的 ” 物理地址 “ 映射到了 ” 虚拟地址空间 " 中 ;

【Linux 内核 内存管理】内存映射原理 ① ( 物理地址空间 | 外围设备寄存器 | 外围设备寄存器的物理地址 映射到 虚拟地址空间 )相关推荐

  1. Linux内核如何管理内存

    在学习了进程的 虚拟地址布局 之后,让我们回到内核,来学习它管理用户内存的机制.这里再次使用 Gonzo: Linux kernel mm_struct Linux 进程在内核中是作为进程描述符 ta ...

  2. 详细讲解Linux内核源码内存管理(值得收藏)

    Linux的内存管理是一个非常复杂的过程,主要分成两个大的部分:内核的内存管理和进程虚拟内存.内核的内存管理是Linux内存管理的核心,所以我们先对内核的内存管理进行简介. 一.物理内存模型 物理内存 ...

  3. Linux内存管理内存映射以及通过反汇编定位内存错误问题

    提到C语言,我们知道C语言和其他高级语言的最大的区别就是C语言是要操作内存的! 我们需要知道--变量,其实是内存地址的一个抽像名字罢了.在静态编译的程序中,所有的变量名都会在编译时被转成内存地址.机器 ...

  4. linux内核工程导论,Linux内核工程导论——内存管理(3)

    Linux内核工程导论--内存管理(三) 用户端内核内存参数调整 /proc/sys/vm/ (需要根据内核版本调整) 交换相关 swap_token_timeout Thisfile contain ...

  5. 纯干货,linux内存管理——内存管理架构(建议收藏)

    一.内存管理架构 内存管理子系统架构可以分为:用户空间.内核空间及硬件部分3个层面,具体结构如下所示: 1.用户空间:应用程序使用malloc()申请内存资源/free()释放内存资源. 2.内核空间 ...

  6. Linux内核高端内存

    Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存. 段页式机制如下图.   Linux内核地址空间划分 通常32 ...

  7. linux内核申请内存的方法,Linux内核空间的内存申请常用函数

    在Linux内核编程中内存的申请不同于系统编程,她有自己的一套机制. 1. kmalloc 函数原型:void *kmalloc( size_t size, int flags ) 参数说明:size ...

  8. ND4J/DL4J的内存管理:工作原理

    ND4J/DL4J的内存管理:工作原理 ND4J使用堆外内存存储N维数组NDArray,以便提升从本机代码(例如BLAS和CUDA库)使用NDArray时的性能. "堆外"意味着系 ...

  9. iOS 内存管理机制与原理

    内存分区 内存一般分为五大区:栈区.堆区.常量区.全局区.代码区.如图 1.栈区 是由编译器自动分配并释放的,主要用来存储局部变量.函数的参数等,是一块连续的内存区域,遵循先进后出(FILO)原则.一 ...

  10. Linux内核页表管理-那些鲜为人知的秘密

    1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.11 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 通用操作系统,通常都会开启mmu来支持虚拟 ...

最新文章

  1. 轻量级HTTP服务器Nginx
  2. java 重定向和转发 的区别
  3. 总编下午茶:挑战者心态能否帮助微软重回云计算巅峰?
  4. Online ML那点事-!
  5. 将json 填入表格_如何将Google表格用作JSON端点
  6. hdu 1507 Largest Rectangle in a Histogram 动态规划计算最大面积
  7. mysql人脸数据库_人脸数据库汇总
  8. 用Spotlight实时监控Windows Server 08
  9. “天才少年” 27岁华为副总裁 百度CTO 成为阶下囚的传奇经历
  10. m4a怎么转换成mp3,m4a转mp3的简单方法
  11. mysql8.0.15下载后怎么打开_mysql8.0.15下载安装详细教程新手必备!
  12. mysql在centos下改24小时制
  13. 独立站谷歌付费广告关键词选词技巧实操
  14. go语言的类型之间的相互转化和float保留小数时的四舍五入
  15. traits简单介绍
  16. 三阶魔方还原程序心得
  17. Android大赛首轮获奖作品解析
  18. 1700人参加的钢铁行业盛会,下面是你必须知道的!
  19. 西门子系列全套学习视频,免费领取!
  20. 1024程序员节|基于Springboot实现运动场馆预约信息管理系统

热门文章

  1. WebServices | 期末复习 · WebService基本概念、XML
  2. Linux Debian 分区出错Partition 2 does not start on physical sector boundary 解决方法 + swap
  3. 一路走来,关于光城那些事
  4. 性能测试指标和报告解析
  5. 工具-安装redis和安装redis客户端
  6. Educoder_Web_移动端电商页面制作
  7. c语言程序灵魂编译后,谭浩强C程序设计第4版精讲视频课程
  8. SpringBoot一站式功能提供框架(一)整合MybatisPlus、整合Swagger Knif4j、整合Druid多数据源--柚子真好吃
  9. PAROT: Translating natural language to SPARQL(PAROT:将自然语言翻译成SPARQL)--10
  10. 手把手教你从零写一个日志框架