Gom*_*omu 3 embedded android init
我是一个初学者,我想了解Kernel-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);
Run Code Online (Sandbox Code Playgroud)
接下来是对电路板特定init.rc文件的解析。
在ueventd_main解析板特有uevent.rc的文件。
在watchdogd_main试图设置逾时则保持写一个空字符到/dev/watchdog一个无限循环。
在Karim Yaghmour撰写的《嵌入式Android》一书中,提到的是:
init做的第一件事就是检查它是否是作为ueventd调用的。初始化包括udev hotplug事件处理程序的实现。因为此代码是在init自己的代码中编译的,所以init检查用于调用它的命令行,如果通过/ sbin / ueventd符号链接到/ init调用了它,则init立即作为ueventd运行。
我的问题是
1)我相信这个主函数的参数是从内核bootcmd参数“ init =”接收的。我对吗?
2)在哪种情况下,将调用initd或watchdogd运行的init?
3)通过符号链接到/ init意味着什么?
小智 5
1)我相信这个主函数的参数是从内核bootcmd参数“ init =”接收的。我对吗?
不,不是bootcmd参数。 argv[0]是正在启动的可执行文件的名称。
如果你看一下Android.mk的init,你会看到:
# 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
Run Code Online (Sandbox Code Playgroud)
在这里您可以看到创建了两个额外的符号链接,都指向init。这些将包含在最终的Android启动映像中/sbin/
2)在哪种情况下,将调用initd或watchdogd运行的init?
在init.rc中,您可以看到:
## Daemon processes to be run by init.
##
service ueventd /sbin/ueventd
class core
critical
seclabel u:r:ueventd:s0
shutdown critical
Run Code Online (Sandbox Code Playgroud)
这是声明服务未声明并指定该路径的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
Run Code Online (Sandbox Code Playgroud)
您可以看到它unxz链接到xz
xz的From手册页:unxz is equivalent to xz --decompress.
因此,这里只有一个可执行文件,但是根据使用哪个可执行文件名称来启动它,其行为是不同的。
3)通过符号链接到/ init意味着什么?
在前两个答案中得到了回答。