/system/core/init初始化程序

1.执行sigaction函数,对SIGCHILD信号进行处理。实际上暂时屏蔽

2.设置umask来清空后面创建文件的mask

3. 创建文件系统mount point & mount 内存文件系统

4. open_devnull_stdio 0 1 2 is the fd. They are all the file descriptor of /dev/__null__

5.open /dev/__kmsg__ as log fd.

6.parse_config_file

首先打开/init.rc然后读出所有的数据到内存,然后调用parse_config函数进行分析。将comand,service等放入链表中等待处理。

7.import_kernel_cmdline 会从/proc/cmdline中获取bootargs,然后分析之,并使用import_kernel_nv填充qemu,console,bootmode,serialno,baseband,carrier,bootloader,hardware变量。如果设置了android.ril参数,还要设置对应的permissions,也就是uid,gid。

8.get_hardware_name根据/dev/cpuinfo获取hardware和rev参数,放到hardware和revision全局变量中

9. 解析init.hardware.rc config文件,然后执行early init中的action,通过drain_action_queue

10. 执行device_init,首先open_uevent_socket,然后设置socket的属性。最后对/sys/class、/sys/block、/sys/devices执行coldboot。

11.在向/sys/class等目录下的uevent文件写入”add/n”之后,从uevent的socket接收消息,并对消息进行解析,完成对uevent结构的赋值。然后根据uevent以及在全局devperms预定义的权限创建各个dev下的目录和设备节点

12.初始化__system_property_area__(打开ashmem设备,申请内存,并将之初始化为prop_area结构)

13.执行property_init,读取buid.prop,然后将之设置到property中

14.根据build.prop中设置过的ro.debuggerable,确定是否open_keychord

15. 打开console,如果console数组设置过,会使用console数组的设置,如果没有,默认会使用/dev/console作为console。如果有console设备,have_console变量为1

16.设置一些property,比如ro.serialno,ro.bootmode,ro.baseband,ro.carrier,ro.bootloader,ro.hardware,ro.revision

17. 执行init.rc和init.hardware.rc里的init组

18.从/system/build.prop、system/default.prop、data/local.prop中读取property并设置,读取property读取data/propery下的各个persist值,根据文件名和内容设置property

19.创建property_service socket并进行监听

20.创建配对的socket

21.确保uevent的socket fd、property_service的fd,signal_receive的fd全部有效

22. run all property triggers based on current state of the properties

23.创建并打开以下log文件。

#define LOG_ROOT "/data/bootchart"

#define LOG_STAT LOG_ROOT"/proc_stat.log"

#define LOG_PROCS LOG_ROOT"/proc_ps.log"

#define LOG_DISK LOG_ROOT"/proc_diskstats.log"

24.调用acct函数,记录内核每次进程的terminate消息。写入LOG_ROOT"/kernel_pacct"

25.将/proc/cmdline、/proc/version、/proc/cpuinfo写入LOG_ROOT"/header"。Bootchart会根据#define LOG_STARTFILE "/data/bootchart-start"设置的时间进行记录

26.进入死循环,在内部对前面提到的几个fd进行poll操作,并在poll成功之后,handle_device_fd或handle_property_set_fd或handle_keychord

从以上分析中可以看出需要注意的几个事项,比如permissions,还可以根据data/bootchard下的几个log文件分析log信息。还可以知道untracket pid的原因。几个prop文件的加载顺序,如何让系统从ramdisk启动并且加载loop设备。rc文件的更多选项。socket通信,如何自动创立设备节点。

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. android抓取网络数据包工具
  6. android ubuntu9.10 源码的编译 Eclipse工程 Contacts编译 应用
  7. android wifi ralink rt3070开发记录
  8. 使用NotificationCompat获得好看的通知 (Android(安卓)Developme
  9. Android(安卓)Studio 的简单配置使用以及各文件用途(一)

随机推荐

  1. android 游戏导引(1. 建立 OpenGL 项目)
  2. android filter
  3. Android应用层学习-Intent和Layout
  4. Android(安卓)振动器(Vibrator)系统
  5. Android上常见度量单位【xdpi、hdpi、mdp
  6. Android逆向
  7. Android运行底层linux外部命令的实现
  8. Android(安卓)从properties配置文件读取
  9. Android的MediaPlayer架构介绍
  10. AirFree远程协助(Android)