mmap编程
应用程序和驱动程序之间传递数据时,可以通过 read、write 函数进行。这涉及在用户态 buffer 和内
核态 buffer 之间传数据,如下图所示:
应用程序不能直接读写驱动程序中的 buffer,需要在用户态 buffer 和内核态 buffer 之间进行一次数据拷贝。这种方式在数据量比较小时没什么问题;但是数据量比较大时效率就太低了。
比如更新 LCD 显示
时,如果每次都让 APP 传递一帧数据给内核,假设 LCD 采用 102460032bpp 的格式,一帧数据就有102460032/8=2.3MB 左右,这无法忍受。
CPU 发出的地址是虚拟地址,它经过 MMU(Memory Manage Unit,内存管理
单元)映射到物理地址上,对于不同进程的同一个虚拟地址,MMU 会把它们映射到不同的物理地址。如下图:
当前运行的是 app1 时,MMU 会把 CPU 发出的虚拟地址 addr 映射为物理地址 paddr1,用 paddr1 去访问内存。
当前运行的是 app2 时,MMU 会把 CPU 发出的虚拟地址 addr 映射为物理地址 paddr2,用 paddr2 去访问内存。
MMU 负责把虚拟地址映射为物理地址,虚拟地址映射到哪个物理地址去?