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本身獨立的進程地址空間;

相關文章
相關標籤/搜索