从4.3后,回顾《从surfaceflinger历史变更谈截屏》,只能通过生产消费者队列向surfaceflinger服务申请显示缓冲,这个缓冲就是dma-buf映射的共享内存。
binder服务受selinux安全服务管制,root权限的程序也必须受selinux策略限制,所以必须放行。
程序顺利通过surfaceflinger服务取出一帧显示缓冲,但是缓冲内容却无法访问。
通过查看进程的内存映射有
上面的那就是dma-buf,用于显示的帧缓冲都是通过共享映射访问dma-buf。上面的 's' 标记指明了映射区间为共享share,相对于私有 'p'。但是问题来了,就是Cannot access memory at address,不能访问dma-buf映射过来的内存,尽管映射的权限为rw-s。
即使通过gdb重定义内存区间的属性,也无效
内存区间被重定义了,其它区间是不可访问
2018.04.12
补充: 在gdb调试中,不能通过ptrace,对进程的 io-map 地址进行访问。在 stackflow上找到两条相关的 thread,才恍然觉悟。
https://stackoverflow.com/questions/3640095/gdb-cant-access-mmapd-kernel-allocated-memory
https://stackoverflow.com/questions/654393/examining-mmaped-addresses-using-gdb