全部博文(516)
发布时间:2013-01-04 17:49:38
在完成了zImage自解压之后,就跳转到了解压后的内核(也就是vmlinux的bin版本Image),具体的入口可以在arch/arm/kernel/vmlinux.lds.S(最终的链接脚本是通过这个文件产生的)中获得: ...... SECTIONS { #ifdef CONFIG_XIP_KERNEL . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR); #else . = PAGE_OFFSET + TEXT_OFFSET; #endif .init : { /* Init co......【阅读全文】
发布时间:2013-01-04 17:49:31
Linux内核在启动的时候需要一些参数,以获得当前硬件的信息或者启动所需资源在内存中的位置等等。这些信息可以通过bootloader传递给内核,比较常见的就是cmdline。以前我在启动内核的时候习惯性的通过uboot传递一个cmdline给内核,没有具体的分析这个过程。最近在分析内核启动过程的时候,重新看了一下内核启动参数的传递过程,彻底解决一下在这方面的疑惑。 一、bootloader与内核的通讯协议 内核的启动参数其实不仅仅包含在了cmdline中,cmdline不过是bootloader传递给内核的信......【阅读全文】
发布时间:2013-01-04 17:49:26
前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化。在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就是创建并启动内核线程init。这个函数虽然意思为剩下的初始化,但是这个“剩下”的可是内容颇多,下面详细分析如下:/* * 我们必须确定在一个非__init函数或 * 其他根线程(root thread)和初始化线程(init thread)间的竞态。 * (这种竞态可能导致start_kernel在根线程运作到cpu_idle前被free_......【阅读全文】
发布时间:2013-01-04 17:49:20
在分析start_kernel函数的时候,其中有构架相关的初始化函数setup_arch。此函数根据构架而异,对于ARM构架的详细分析如下:void __init setup_arch(char **cmdline_p){ struct machine_desc *mdesc; 点击(此处)折叠或打开此为设备描述结构体,对于任何板子都定义了这样的一个结构体,我以前的文章有介绍:《Uncompressing Linux... done, booting the kernel》 1、machine type 不匹配  ......【阅读全文】
发布时间:2013-01-04 17:49:09
在构架相关的汇编代码运行完之后,程序跳入了构架无关的内核C语言代码:init/main.c中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段, 下面我就顺这代码逐个函数的解释,但是这里并不会过于深入每个函数,因为这样就会只见树木,不见森林。分析代码首先要从构架上宏观地理解,然后再去考虑细节问题(这和小时候学语文要概括中心思想和段落大意是一个道理)。今后对于每个子系统的初始化,特别是内存子系统,有空都会分析一遍。asmlinkage void __init start_kernel(void){ &nbs......【阅读全文】