mmap 和 phys_to_virt
##
一般情况下,Linux 系统中,进程的 4GB 内存空间被划分成为两个部分 —— 用户空间和内核空间,大小分别为 03G,34G。
用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间。
每个进程的用户空间都是完全独立、互不相干的,用户进程各自有不同的页表。而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表,内核的虚拟空间独立于其他程序。
3~4G 之间的内核空间中,从低地址到高地址依次为:物理内存映射区—隔离带—vmalloc 虚拟内存分配区—隔离带—高端内存映射区—专用页面映射区—保留区。
mmap
内存映射函数 mmap 负责把文件内容映射到进程的虚拟内存空间,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用 read,write 等操作。
mmap 设备操作
映射一个设备是指把用户空间的一段地址关联到设备内存上,当程序读写这段用户空间的地址时,它实际上是在访问设备。这里需要做的两个操作:
- 找到可以用来关联的虚拟地址区间
- 关联
phys_to_virt
phys_to_virt 是将已经映射的物理内存的地址转换为虚拟地址