我是初学者,我正在尝试了解内核 - Android界面。
在system/core/init/init.c中,初始部分包含以下代码。
if (!strcmp(basename(argv[0]), "ueventd"))
return ueventd_main(argc, argv);
if (!strcmp(basename(argv[0]), "watchdogd"))
return watchdogd_main(argc, argv);
然后解析特定于董事会的init.rc
个文件。
ueventd_main
解析特定于董事会的uevent.rc
个文件。
watchdogd_main
尝试设置超时&然后继续在无限循环中向/dev/watchdog
写一个空字符。
在书中嵌入式Android'作者Karim Yaghmour提到,
init做的第一件事就是检查它是否被调用为 ueventd。 init包括udev hotplug事件的实现 处理程序。因为这段代码是在init自己的代码中编译的,所以init 检查用于调用它的命令行,如果是的话 通过/ sbin / ueventd符号链接调用/ init,然后是init 马上就像ueventd一样。
我的问题是
1)我相信这个main函数的参数是从内核bootcmd参数" init ="中获得的。我对吗?
2)在什么情况下,人们会调用init只能作为ueventd或watchdogd运行?
3)它们与符号链接到/ init是什么意思?
答案 0 :(得分:3)
1)我相信收到了这个主要功能的论据 来自内核bootcmd参数“init =”。我是对的吗?
不,不是bootcmd参数。 argv[0]
是正在启动的可执行文件的名称。
如果您查看init
的{{3}},您会看到:
# Create symlinks.
LOCAL_POST_INSTALL_CMD := $(hide) mkdir -p $(TARGET_ROOT_OUT)/sbin; \
ln -sf ../init $(TARGET_ROOT_OUT)/sbin/ueventd; \
ln -sf ../init $(TARGET_ROOT_OUT)/sbin/watchdogd
在这里你可以看到创建了两个额外的符号链接,都指向init。这些将包含在/sbin/
2)在什么情况下,人们只会调用一个init来运行 ueventd或watchdogd?
在Android.mk中,您可以看到:
## Daemon processes to be run by init.
##
service ueventd /sbin/ueventd
class core
critical
seclabel u:r:ueventd:s0
shutdown critical
这是声明服务ueventd并指定ueventd
路径的路径。因此,当ueventd
服务启动时,它将是init可执行文件,但argv[0]
参数将是ueventd
。
watchdogd
以同样的方式完成。
因此,它是使用三个不同名称init
,ueventd
或watchdogd
调用的相同可执行文件。根据调用的名称,执行三个不同代码路径之一(如您引用的代码中所示)。
这通常在不同命令在实现中基本相同时完成。在我的Ubuntu系统上:
$ ls -l /usr/bin/unxz
lrwxrwxrwx 1 root root 2 Oct 3 11:04 /usr/bin/unxz -> xz
您可以看到unxz
与xz
相关联
从xz:unxz is equivalent to xz --decompress.
所以在这里,只有一个可执行文件,但根据使用哪个可执行文件名来启动它,行为是不同的。
3)它们与符号链接到/ init是什么意思?
回答前两个答案。