android手机启动各个进程的前世此生

以前作过一个给客户apk进程开放cap_net_raw权限的事情,为了客户能用本身的方法抓取tcp/ip包,对android的fork有了一些了解android

首先这个apk进程是zygote fork的,zygote进程的权限包含了cap_net_raw,但fork后android对apk的permission作了重写经过setcapabilities(),这时只须要在重写时加上这个cap_net_raw权限便可app

这里先介绍一下流程tcp

     fork     fork     fork函数

1,swapper  -- swapper   -- swapper线程

       -- init            -- initrest

                           -- service~进程

            -- zygote       -- zygoteip

                  -- apkci

       -- kthreaddit

 

2,第一次fork,kernel/init/main.c

rest_init->kernel_thread()->do_fork(clone_vm),kthreadd和init共享swapper的地址空间,可是kernel_init执行do_execve去alloc进程地址空间mm_struct;

第二次fork,android/system/core/init/service.cpp,解析并启动init.rc

bool Service::Start()->fork();

第三次fork,android/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

static pid_t ForkAndSpecializeCommon()->fork()

3,对于kthreadd,kernel要建立新进程时,会把该进程放到kthread_create_list中由kthreadd进程建立出来

4,再说一下fork函数,fork()->clone()->do_fork(),do_fork()中彻底copy父进程(子进程会建立本身独立的进程地址空间),只是子进程返回pid=0,父进程返回子进程的pid,以此来区分

5,进程和线程的区别,就是是否有独立的地址空间;因此内核线程的建立(kernel_thread())最终都是调用do_fork(clone_vm)来共享地址空间,用户线程的建立(pthread_create())最终也是调用do_fork(clone_vm);而用户进程的建立(fork())调用do_fork(),其中会新alloc本身独立的进程地址空间;

相关文章
相关标签/搜索