|
/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通信,如何自动创立设备节点。 |
详细解决方案
Android init初始化程序分析
热度:41 发布时间:2024-01-21 13:17:21.0
相关解决方案
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android RadioButton如何设置默认选中
- android 怎么重新设置锚点
- android 图片对象获取的有关问题
- android 关于服务连接的疑义
- android 怎么实现对view的放大和缩小
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java) 中文乱码的有关问题
- HttpApplication.Init()和Application_Start有什么区别?解决方法
- android 动态设立控件高度
- Android test project 编译方法
- android 4.03启动出错,显示"Encryption Unsuccessful"该如何解决
- Android 下面的listView的动态效果怎么实现的?求源代码,多谢
- Android?Palm?Symbian?Windows Mobile?学哪个有“钱图”?解决方案
- Android 开发语言,该怎么解决
- 单个人去做手机开发选什么平台好?android,iphone?解决办法
- Android 虚拟机崩溃的有关问题
- Android 上的如何读写设备文件
- Android 2.2 API 汉语文档系列(3) —— AccessibilityService
- 【先睹为快】ArcGIS Android SDK上一版本新特性
- ArcGIS for Android app v2.0.4公布
- android.hardware.USB种介绍
- android linux开发 在线电子书解决方案