0%

内存映射

mmapphys_to_virt

##

一般情况下,Linux 系统中,进程的 4GB 内存空间被划分成为两个部分 —— 用户空间和内核空间,大小分别为 03G,34G。

用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间。

每个进程的用户空间都是完全独立、互不相干的,用户进程各自有不同的页表。而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表,内核的虚拟空间独立于其他程序。

3~4G 之间的内核空间中,从低地址到高地址依次为:物理内存映射区—隔离带—vmalloc 虚拟内存分配区—隔离带—高端内存映射区—专用页面映射区—保留区。

mmap

内存映射函数 mmap 负责把文件内容映射到进程的虚拟内存空间,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用 read,write 等操作。

mmap 设备操作
映射一个设备是指把用户空间的一段地址关联到设备内存上,当程序读写这段用户空间的地址时,它实际上是在访问设备。这里需要做的两个操作:

  1. 找到可以用来关联的虚拟地址区间
  2. 关联

phys_to_virt

phys_to_virt 是将已经映射的物理内存的地址转换为虚拟地址

Ref

  1. linux 内核之 phys_to_virt
  2. Linux 驱动修炼之道 - 内存映射 mmap()/phys_to_virt()
  3. inux 驱动虚拟地址和物理地址的映射
  4. 使用 mmap 来共享内存