kernel镜像执行跳转到start_kernel开始执行,在rest_init会创建两个kernel 进程(线程),其分别是为kernel_init 与kthreadd,创建完后系统通过init_idle_bootup_task蜕化为idle进程(cpu_idle)。 调用kernel_thread()创建1号内核线程,该线程随后转向用户空间, 演变为init进程 调用kernel_thread()创建kthreadd内核线程。 init...
2.内核载入到内存之后首先进入内核引导阶段,最后调用start_kernel进入内核启动。start_kernel终于会启动init程序 3.init程序负责解析init.rc文件并开启守护进程。最重要的两个守护进程就是zygote和ServiceManager 4.zygote启动子进程system_server,在system_server中开启android核心服务并加入到SystemManager之中,系统进入system...
arch/am/kernel/head.S start_kernel setup_arch //解析uboot传入的启动参数 setup_command_line(command_line);//解析uboot传入的启动参数 parse_early_param do_early_param //从 __setup_start到 __setup_end;执行标志early的函数,这个没哟走 obsolete_checksetup //走的是这个从 __setup_start到 __set...
kernel镜像执行跳转到start_kernel开始执行,在rest_init会创建两个kernel 进程(线程),其分别是为kernel_init 与kthreadd,创建完后系统通过init_idle_bootup_task蜕化为idle进程(cpu_idle)。 调用kernel_thread()创建1号内核线程,该线程随后转向用户空间, 演变为init进程 调用kernel_thread()创建kthreadd内核线程。 init...
调用kernel_thread()函数为进程1创建内核线,同时执行init程序 调用fork_init()函数初始化进程创建机制 调用vfs_caches_init()初始化虚拟文件系统 start_kernel执行完后,接下来会进入rest_init函数的执行 它会生成两个线程kernel_init和kthreadd。其中kernel_init也叫init进程,主要是初始化和执行进程,kthreadd是用来管理...
1)start_kernel()函数中执行了大量的初始化操作: 2)setup_arch():主要做一些板级初始化,cpu初始化,tag参数解析,u-boot传递的cmdline解析,建立mmu工作页表,初始化内存布局,调用mmap_io建立GPIO、IRQ、MEMCTRL、UART,及其他外设的静态映射表,对时钟,定时器,uart进行初始化 ...
start_kernel函数执行到最后调用了rest_init函数进行后续的初始化,该函数的最主要任务就是启动内核线程kernel_init。kernel_init函数将完成设备驱动程序的初始化,并调用init_post函数启动用户空间的init进程,到init_post函数为止,内核的初始化已经基本完成。 文件路径:...
该部分的代码实现在arch/arm/kernel的 head.S中,该文件的汇编代码通过查找处理内和类型的机器码类型调用相应的初始化函数,再建立页表,最后跳转到start_kernel()函数开始内核的初始化工作。检查处理器是汇编子函数__lookup_processor_type中完成的,通过以下代码可实现对它的调用:bl__lookup_processor_type(在文件head...
找到了vmlinux的起始代码我们就来进行分析了,先总体概括一下这部分代码所完成的功能,head.S会首先检查proc和arch以及atag的有效性,然后会建立初始化页表,并进行CPU必要的处理以后打开MMU,并跳转到start_kernel这个symbol开始执行后面的C代码。这里有很多变量都是我们进行kernel移植时需要特别注意的,下面会一一讲到。
看一下start_kernel的汇编 对应启动日志是符合的,地址正确 这时我们可以导出完整的符号表并用脚本载入IDA 导出符号表:cat /proc/kallsyms > /sdcard/kallsyms.txt adb pull到电脑上后在ida python执行如下脚本 (自动创建代码会很卡,没有需求可以注释掉) ...