所以我的問題:如果它會在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
完成cgrops
和SELinux
(不知道)不被初始化:
系統/核心/ ROOTDIR /初始化。rc:
on init
...
# Mount cgroup mount point for cpu accounting
mount cgroup none /acct cpuacct
mkdir /acct/uid
P.S.但是如果一個服務在passthrough模式下通信?