2017-09-09 37 views
0

Android中的啓動序列通過system/core/rootdir/init.rc和其他*.rc文件定義。這種方法允許將任何操作綁定到任何啓動階段(early-init,init等)。還在system/core/init/init.cpp中定義了以下開機順序:
- ...;
- early-init;
- wait_for_coldboot_done;
- ...;
- init;
- ...在冷啓動之前的早期初始化啓動本地服務

這意味着,一些動作裏面進口*.rc文件綁定到early-init階段之前coldboot(和SELinux的初始化)將被ueventd完成,可以開始了。

所以我的問題:如果一個本地服務在coldboot完成之前啓動(顯然這意味着這種服務不需要任何應該由ueventd創建的設備)

回答

0

所以我的問題:如果它會在coldboot完成之前啓動,那麼本機服務是否正常工作?

有時它可能正常工作,但一般情況下可能會失敗。如果本機服務不與任何設備交互,則不需要/dev/文件系統。但binderized服務通過Binder IPC這是需要打開粘合劑驅動程序(互動之間的內核和用戶空間層)通信:

框架/本地/包括/粘合劑/ BinderService.h

template<typename SERVICE> 
class BinderService 
{ 
public: 
    ... 
    static void instantiate() { publish(); } 
    ... 
    static status_t publish(bool allowIsolated = false) { 
     sp<IServiceManager> sm(defaultServiceManager()); 
     return sm->addService(
       String16(SERVICE::getServiceName()), 
       new SERVICE(), allowIsolated); 
    } 

框架/native/libs/binder/IServiceManager.cpp

sp<IServiceManager> defaultServiceManager() 
{ 
       ... 
       ProcessState::self()->getContextObject(NULL)); 

框架/本地/庫/ BI的nDer/ProcessState.cpp:在所述coldboot階段由ueventd根據ueventd.rc創建

sp<ProcessState> ProcessState::self() 
{ 
    ... 
    gProcess = new ProcessState("/dev/binder"); 
    return gProcess; 
} 

ProcessState::ProcessState(const char *driver) 
    : mDriverName(String8(driver)) 
    , mDriverFD(open_driver(driver)) 
    ... 
    { 
     if (mDriverFD >= 0) { 
     // mmap the binder, providing a chunk of virtual address space to receive transactions. 
     mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0); 
     if (mVMStart == MAP_FAILED) { 
      // *sigh* 
      ... 
      ALOGE("Using /dev/binder failed: unable to mmap transaction memory.\n"); 
    LOG_ALWAYS_FATAL_IF(mDriverFD < 0, "Binder driver could not be opened. Terminating."); 
} 

static int open_driver(const char *driver) 
{ 
    int fd = open(driver, O_RDWR | O_CLOEXEC); 
    if (fd >= 0) { 
    ... 
    } else { 
     ALOGW("Opening '%s' failed: %s\n", driver, strerror(errno)); 
    } 
    return fd; 
} 

但粘合劑驅動/der/binder(以及/dev/hwbinder/dev/vndbinder)。

系統/核心/ ROOTDIR/ueventd.rc

... 
/dev/binder    0666 root  root 
/dev/hwbinder    0666 root  root 
/dev/vndbinder   0666 root  root 
... 

所以,如果一個本地服務在之前啓動coldboot做它不會打開/dev/binder

此外,在之前coldboot完成cgropsSELinux(不知道)不被初始化:
系統/核心/ ROOTDIR /初始化。rc

on init 
    ... 
    # Mount cgroup mount point for cpu accounting 
    mount cgroup none /acct cpuacct 
    mkdir /acct/uid 

P.S.但是如果一個服務在passthrough模式下通信?

相關問題