Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1174680
  • 博文数量: 93
  • 博客积分: 7185
  • 博客等级: 准将
  • 技术积分: 3560
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-02 13:54
文章分类
文章存档

2011年(43)

2010年(11)

2009年(27)

2008年(12)

分类:

2011-06-02 15:16:04

/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函数进行分析。将comandservice等放入链表中等待处理。

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

8.get_hardware_name根据/dev/cpuinfo获取hardwarerev参数,放到hardwarerevision全局变量中

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”之后,从ueventsocket接收消息,并对消息进行解析,完成对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.rcinit.hardware.rc里的init

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

19.创建property_service socket并进行监听

20.创建配对的socket

21.确保ueventsocket fdproperty_servicefdsignal_receivefd全部有效

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_fdhandle_property_set_fdhandle_keychord

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

阅读(1050) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~