我现在正在分析android框架内部,我发现mmap()被android框架中的每个模块调用了两次,因为引用了同一个文件“dev/binder”。
1)有人能解释一下mmap()是如何两次刷新同一个文件的吗?
2)有人能解释一下mmap()在这种情况下是如何组织内存Map的吗?
1.---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BINDER_VM_SIZE:1M-8K
mDriverFD:引用“dev/binder”
public void run(){
mmap(0,BINDER_VM_SIZE,PROT_READ,MAP_PROVATE| MAP_NORESERVE,mDriverFD,0);
}
1.---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在service_manager.c中,binder_open()被如下调用。
Map大小:128 K
struct binder_state *binder_open(unsigned mapsize){
b = open(“dev/binder”,O_RDWR);
mmap(NULL,mapsize,PROT_READ,MAP_PRIVATE,bs->fd,0);
}
先谢谢你了。
1条答案
按热度按时间4szc88ey1#
这是你的答案我把它转成英语https://blog.csdn.net/mafei852213034/article/details/117783841
binder_open()的工作也相对简单;它分为以下步骤:
1.通过系统调用open()打开/dev/binder;获取句柄信息;在Binder驱动程序中,对应的函数binder_open()
1.通过ioctl获取绑定器的版本信息;比较绑定协议的版本是否相同;如果不一样,就会跳出来;在绑定器驱动程序中,对应的函数binder_ioctl()
1.通过mmap内存Map128 K内存空间;将绑定驱动文件的128 K字节Map到存储空间;该128 K存储器空间由服务管理器使用。Binder驱动程序中的相应函数是binder_mmap()。其他binder服务进程将MapBINDER_VM_SIZE((1 * 1024 * 1024)- sysconf(_SC_PAGE_SIZE)* 2)的内存空间;
sysconf(_SC_PAGE_SIZE)= 4096是1页大小。
service_manager.c
//在用户空间https://android.googlesource.com/platform/frameworks/native/+/refs/tags/android-9.0.0_r60/cmds/servicemanager/binder.c
BINDER_SET_CONTEXT_MGR为128K
////////////////////////////
https://android.googlesource.com/platform/frameworks/native/+/jb-dev/libs/binder/IPCThreadState.cpp
IPCThreadState.h
1 M-8 K用于使用onTransact的数据BINDER_WRITE_READ
//跟踪到linux驱动https://elixir.bootlin.com/linux/v5.13.19/source/drivers/android/binder.c#L4721