计算机内存管理之内存访问

article/2025/9/24 1:25:55

文章目录

  • 一、设备I/O内存访问
    • ioremap & ioremap_nocache
    • ioremap_cached
    • ioremap_wc & ioremap_wt
    • I/O内存访问流程
  • 二、设备地址映射到用户空间
    • mmap过程
  • 三、devmem原理
    • “/dev/mem”设备
    • devmem命令原理
  • 四、malloc原理
    • malloc的工作原理
    • 缺页中断
    • malloc的free

一、设备I/O内存访问

在linux上电时,并不会为外设地址空间建立页表。
但我们知道,linux访问内存使用的都是虚拟地址,因此如果想访问外设的寄存器(一般包括数据寄存器、控制寄存器与状态寄存器),需要在驱动初始化中将外设所处的物理地址映射为虚拟地址,使用ioremap接口可以实现该功能。

ioremap & ioremap_nocache

ioremap和ioremap_nocache实现相同,使用场景为映射device memory类型内存。同时不使用cache(device memory本身就没有cacheable这个属性),即CPU的读写操作直接操作设备内存。

ioremap_cached

ioremap_cached用来映射memory type为normal memory的设备,同时使用cache,这会提高内存的访问速度,提高系统的性能。

ioremap_wc & ioremap_wt

ioremap_wc用来映射memory type为normal memory的设备,同时不使用cache。

I/O内存访问流程

request_mem_region
ioremap
rw
iounmap
release_mem_region

二、设备地址映射到用户空间

一般情况下,用户空间是不能够直接访问设备的。mmap可实现这个功能。

mmap通过将设备内存映射到用户空间的一段内存上,这样,当用户访问用户空间的这段地址范围时,实际是访问设备内存。这样在每次访问时,节省了用户空间和内核空间的复制过程。

无论是普通文件还是设备文件,读写都是基于系统的虚拟文件系统接口,普通文件为了保护磁盘,避免频繁读写,还引入带缓冲页机制,通过read/write/ioctl访问文件时,都需经历“用户到内核”的内存拷贝过程,然后才将文件内容写入磁盘。

通过mmap方法,将文件(包括设备文件)映射到用户进程虚拟内存空间,代替read/write/ioctl的访问方式,此时内存拷贝过程只有“用户空间到虚拟内存空间”,省去了“用户到内核”的拷贝过程,在数据量大的情况下能显著提升读写效率。因此,mmap也称为“零拷贝”(zero copy)技术。

caddr_t *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

fd为文件描述符,一般由open返回。fd也可指定为-1,并指定flags参数中的MAP_ANON,表示匿名映射。
length指映射的字节数,从offset开始计算;
prot指定访问权限;
start指定文件被映射到用户空间的起始地址,一般设为NULL,由内核指定改地址;
函数返回值为映射到用户空间的地址。

mmap过程

1、在虚拟内存中查找一块VMA
2、将这块VMA进行映射
3、如果设备驱动程序或文件系统的file_operation定义了mmap接口,则调用它;
4、将VMA插入进程的VMA链表中

进程在映射空间的对共享内容的修改不会实时同步写回到磁盘文件中,只有调用munmap()函数释放映射后才会执行同步操作。mmap机制提供msync()函数,用于手动同步修改内容到磁盘源文件。

linux内核使用vm_area_struct结构来表示一个独立的虚拟内存区域,由于每个不同质的虚拟内存区域功能和内部机制都不同,因此一个进程使用多个vm_area_struct结构来分别表示不同类型的虚拟内存区域。各个vm_area_struct结构使用链表或者树形结构链接,方便进程快速访问,如下图所示:
在这里插入图片描述
vm_area_struct结构中包含区域起始和终止地址以及其他相关信息,同时也包含一个vm_ops指针,其内部可引出所有针对这个区域可以使用的系统调用函数。这样,进程对某一虚拟内存区域的任何操作需要用要的信息,都可以从vm_area_struct中获得。mmap函数就是要创建一个新的vm_area_struct结构,并将其与文件的物理磁盘地址相连。

三、devmem原理

“/dev/mem”设备

“/dev/mem”是linux系统的一个虚拟字符设备,无论是标准linux系统还是嵌入式linux系统,都支持该设备。
“/dev/mem”设备是内核所有物理地址空间的全映像,这些地址包括:

物理内存(RAM)空间
物理存储(ROM)空间
cpu总线地址
cpu寄存器地址
外设寄存器地址,GPIO、定时器、ADC

“/dev/mem”设备通常与“mmap”结合使用,可将指定内存映射到用户空间。
类似的还有/dev/kmem设备,kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。

devmem命令原理

应用程序通过mmap函数实现对/dev/mem驱动中mmap方法的使用,映射了设备的内存到用户空间,实现对这些物理地址的读写操作。
类似的有devkmem命令,通过mmap函数实现对/dev/kmem驱动中mmap方法的使用,映射了设备的内核空间到用户空间,实现对这些物理地址的读写操作。

四、malloc原理

malloc的工作原理

可执行文件加载到内存中的时候,就给栈和堆划分了固定大小的空间。使用vm_area_struct结构体指明了一个连续区域的头地址和尾地址。

malloc函数分配内存主要是使用brk和mmap系统调用

brk():		小于128k在堆段分配malloc的内存,将堆顶的指针brk往上推;
mmap():		大于128k是在堆和栈之间(文件映射区域)找分配一块空闲的虚拟内存,

malloc系统调用后,并没有实际分配物理内存。
这时候读虚拟内存地址,返回值是0;
第一次写的时候,发生缺页中断,才会实际分配物理内存,建立虚拟内存与物理内存的映射关系。

缺页中断

malloc的空间没有实际分配的情况下,在写的时候会报缺页中断。实际上:
进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(即存在位为0),那么停止该指令的执行,并产生一个页不存在的异常,对应的故障处理程序可通过从外存加载该页的方法来排除故障,之后,原先引起的异常的指令就可以继续执行,而不再产生异常。

当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:

1、检查要访问的虚拟地址是否合法
2、查找/分配一个物理页
3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)
4、建立映射关系(虚拟地址到物理地址)

重新执行发生缺页中断的那条指令
如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。

如何查看进程发生缺页中断的次数:
ps -o majflt,minflt -C program

majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。
这两个数值表示一个进程自启动以来所发生的缺页中断的次数。

malloc的free

前面知道,通过移动brk申请的内存,存放在进程的堆区域中。
free是由运行库实现,它只是在已分配的堆块前面加一个可用标志,并不实际释放内存,不论是物理内存还是进程的堆空间。
在下次的malloc时,这块空间可能被重用。
如果进程的堆空间出现较多的碎片(这是逻辑地址中的碎片),运行库的堆管理例程会移动/合并碎片,此时可能会出现物理内存的释放/重新分配。
而对于brk指针,只有它指向的那片内存被free的时候才会下移。比如先malloc了一个A,然后malloc了一个B。free掉A之后,brk是不会下移的;free掉B的时候brk才会下移。


http://chatgpt.dhexx.cn/article/6aFdxWkP.shtml

相关文章

0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法(内存对齐)

0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法(内存对齐) 顺带总结相关的内存问题: 1)写入位置发生冲突(内存对齐造成) 2)delete造成的this->0xFFFFFFFF内存问题链接 其它的话,由于当时项目测试忘了截图只能口述…

内存访问冲突问题(非法内存访问)

无独有偶,我居然又碰上了同样的问题。 原因跟之前一样,对象在内存中已经被销毁,或者这个对象压根就没有被创建过。 慢慢的查找p_Screen在哪里被复制以及在哪里被销毁,最有效的方法就是看函数调用栈。 当我把断点设置在p_Screen赋值…

访问固定的内存位置(Accessing fixed memory locations)

背景 如果有学过汇编,那么访问内存将不是一件难事,因为汇编要求你熟悉每一个内存模块,每一个内存地址。我记得当初上汇编的第一节课,老师就说汇编如果不懂的,直接debug那个地址,在命令控制台里找出那个地址…

访问非法内存为什么不会出错?

大家好,我是杂烩君。 上篇文章分享几个实用的代码片段(第二弹)我们分享了一段代码: 有位读者在朋友圈评论我的文章:(type * )0不是指向空地址吗?(type*)0->…

关于ImportError: DLL load failed: 内存位置访问无效的解决方案

一、首先确定import XXX哪个出错了。我的是import ibm_db出错了! 二、cmd,输入 pip uninstall ibm_db,先是删除这个驱动包!前提是你必须安装pip,如果没有安装命令不能识别。 三、删除成功后,输入 pip ins…

MUI框架详解-全面讲解MUI框架使用

课程目录: 01MUI 介绍、新项目创建、 基础布局.mp4 02MUI - accordion(折叠面板)、button.mp4 03MUI - actionsheet(操作表)、badge.mp4 04MUI - 复选框、单选框、使用js获取选择值.mp4 05MUI - datepicker&#xff08…

腾讯开源的Android UI框架——QMUI Android

各位同学,早上好,我是你们的老朋友D_clock爱吃葱花,前些天忙着发版本,最近也在看各种各样的新知识,有好多东西想写啊啊啊啊啊。嗯,先冷静捋一下,卖个关子。扯回正题,今天继续为大家推…

vue开发移动端,mui框架的各种使用方法

前面提到使用vue开发APP,自己不太熟悉,后来了解到有这个mui框架,然后改变状态栏颜色和监听返回键也是使用的这个框架,后来又遇到了一些问题,但是官网没有写操作方法(也许是没找到),后…

Android原生集成MUI框架进行混合开发

开发APP中我们经常进行原生结合H5进行混合开发,下面将进行详细讲解Android原生集成MUI框架进行混合开发(项目Demo如下,有需要的可以下载查看),下一篇讲述,Android原生和MUI(也适合H5与原生交互&…

MUI 前端框架体验

前端框架有很多&#xff0c;在做混合开发APP 时&#xff0c;MUI 的UI 看起来更像原生APP&#xff0c;所以就选择MUI 来体验一下。 1 首先下载 安装 HBuilder X 2 创建并选择5app 项目 3.比较关键的index页面 Markup <!DOCTYPE html> <html> <head><me…

Android引入QMUI框架

前言 作为一个JAVA后端开发&#xff0c;学习Android开发&#xff0c;Android原生UI控件样式单一&#xff0c;简单&#xff0c;下面考虑引入UI框架QMUI。具体步骤如下&#xff1a; 一、创建一个Empty项目 二、打开QMUI官网查看相关步骤(对新手很不友好) https://qmuiteam.com…

vue框架和uniapp框架区别,前端vue和uniapp哪个好用

uniapp和vue有什么区别&#xff1f; vue和uni-app的区别如下&#xff1a;1、uni-app可以通过打包实现一套代码多端运行&#xff0c;而vue不行。2、uni-app有自动的框架预载&#xff0c;加载页面的速度更快&#xff0c;vue没有。 3、uniapp使用小程序的标签&#xff0c;vue使用…

vue介绍及vue与其它框架的优缺点

一.vue介绍 1.什么是vue.js Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有…

MUI框架-05-用MUI做简单App界面

MUI框架-05-用MUI做一个简单App MUI 是一个前端框架&#xff0c;前端框架就像 Bootstrap&#xff0c;EasyUI&#xff0c;Vue ,为了做 app 呢&#xff0c;就有了更加高效的 MUI&#xff0c;我觉得前端框架有很多&#xff0c;也没有必要都取掌握&#xff0c;找一个比较出名的&am…

MUI--高性能前端框架

MUI是什么&#xff1f; 最接近原生APP体验的高性能前端框架。 相比同类框架的优势&#xff1f; 性能和体验的差距&#xff0c;一直是mobile app开发者放弃HTML5的首要原因。 浏览器天生的切页白屏、不忍直视的转页动画、浮动元素的抖动、无法流畅下拉刷新、侧滑抽屉卡顿等问题…

移动端开发框架mui介绍

MUI 官网&#xff1a;https://www.dcloud.io/mui.html MUI 文档&#xff1a;https://dev.dcloud.net.cn/mui/ui/ 演示地址&#xff1a;https://dcloud.io/hellomui/ &#xff08;支持手机和电脑浏览器&#xff09; 开发工具&#xff1a;https://www.dcloud.io/hbuilderx.htm…

MUI(最接近原生APP体验的高性能前端框架)

MUI-最接近原生APP体验的高性能前端框架MUI: 最接近原生APP体验的高性能前端框架https://dev.dcloud.net.cn/mui/ 最接近原生APP体验的高性能前端框架&#xff0c;追求性能体验&#xff0c;是我们开始启动MUI项目的首要目标&#xff0c;轻量必然是重要特征。 MUI不依赖任何第…

关于MUI一个很实用的前端框架

今天也是我接触mui的第一天。首先先上MUI的官网上面瞧一瞧。http://dev.dcloud.net.cn/mui/window/#closewindow我这里上的不是官网&#xff0c; 我是先把他的基本能实现的功能先做了一个简单的了解。下面大家跟着我看&#xff1a; 一、Mui的组件 mui的组件都很原生比如拓展阅读…

MUI框架快速开发

文章目录 创建项目快速编写标题页面主体底部选项卡常用关键词 字体图标事件处理常见手势事件 窗口对象底部选项卡-页面切换底部选项卡窗口对象设置点击事件处理 栅格系统页面传值通过openWindow通过自定义事件 常用关键词参考 创建项目 使用MUI框架搭建项目&#xff0c;首先我…

MUI框架学习——了解MUI

MUI框架-01-介绍-准备-创建项目 从0开始快速高效学习 MUI 框架官方文档&#xff1a;http://dev.dcloud.net.cn/mui/ui/ &#xff08;1&#xff09;MUI 介绍 MUI 是什么&#xff0c;解决了什么问题&#xff1f;MUI 官方号称最接近原生APP体验的高性能前端框架简单的说就是webap…