在kermel cmdline中我们经常会设置androidboot.xxx比如androidboot.selinux=disabled,
但是代码中并不能搜到对应的内容,其实是init做了统一转换。
init进程中有:
main -> process_kernel_cmdline -> import_kernel_cmdline -> import_kernel_nv:
- void import_kernel_cmdline(int in_qemu,
- void (*import_kernel_nv)(char *name, int in_qemu))
- {
- ......
-
- fd = open("/proc/cmdline", O_RDONLY);
- if (fd >= 0) {
- int n = read(fd, cmdline, sizeof(cmdline) - 1);
- if (n < 0) n = 0;
- ......
- import_kernel_nv(ptr, in_qemu);
- ......
- }
- static void import_kernel_nv(char *name, int for_emulator)
- {
- ......
-
- } else if (!strncmp(name, "androidboot.", 12) && name_len > 12) {
- const char *boot_prop_name = name + 12;
- char prop[PROP_NAME_MAX];
- int cnt;
-
- cnt = snprintf(prop, sizeof(prop), "ro.boot.%s", boot_prop_name);
- if (cnt < PROP_NAME_MAX)
- property_set(prop, value);
- }
- }
事实上接下来还会再替换一次: - static void export_kernel_boot_props(void)
- {
- ......
- struct {
- const char *src_prop;
- const char *dest_prop;
- const char *def_val;
- } prop_map[] = {
- { "ro.boot.serialno", "ro.serialno", "", },
- { "ro.boot.mode", "ro.bootmode", "unknown", },
- { "ro.boot.baseband", "ro.baseband", "unknown", },
- { "ro.boot.bootloader", "ro.bootloader", "unknown", },
- };
-
- for (i = 0; i < ARRAY_SIZE(prop_map); i++) {
- ret = property_get(prop_map[i].src_prop, tmp);
- if (ret > 0)
- property_set(prop_map[i].dest_prop, tmp);
- else
- property_set(prop_map[i].dest_prop, prop_map[i].def_val);
- }
- ......
- }