某些机root也不能访问dma-buf

从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

posted on 2018-03-22 15:26  bbqz007  阅读(561)  评论(0编辑  收藏  举报