Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26955
  • 博文数量: 8
  • 博客积分: 35
  • 博客等级: 民兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 17:40
文章分类
文章存档

2013年(7)

2011年(1)

我的朋友

发布时间:2013-01-05 11:09:56

    研究内核源码和内核运行原理的时候,很总要的一点是要了解内核的初始情况,也就是要了解内核启动过程。我在研究内核的内存管理的时候,想知道内核启动后的页表的放置,页表的初始化等信息,这促使我这次仔细地研究内核的启动代码。    CPU在bootloader的帮助下将内核载入到了内存中,并开始执行。当然,bootloader必须为zImage做好必要的准备: 1. CPU 寄存器的设置:R0=0;R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach-types);R2=内......【阅读全文】

阅读(1149) | 评论(0) | 转发(0)

发布时间:2013-01-05 11:09:49

    在完成了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......【阅读全文】

阅读(1480) | 评论(0) | 转发(0)

发布时间:2013-01-05 11:09:46

  在构架相关的汇编代码运行完之后,程序跳入了构架无关的内核C语言代码:init/main.c中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段,   下面我就顺这代码逐个函数的解释,但是这里并不会过于深入每个函数,因为这样就会只见树木,不见森林。分析代码首先要从构架上宏观地理解,然后再去考虑细节问题(这和小时候学语文要概括中心思想和段落大意是一个道理)。今后对于每个子系统的初始化,特别是内存子系统,有空都会分析一遍。asmlinkage void __init start_kernel(void){  &nbs......【阅读全文】

阅读(1498) | 评论(0) | 转发(0)

发布时间:2013-01-05 11:09:36

在分析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 不匹配   ......【阅读全文】

阅读(1393) | 评论(0) | 转发(0)

发布时间:2013-01-05 11:09:32

    前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化。在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就是创建并启动内核线程init。这个函数虽然意思为剩下的初始化,但是这个“剩下”的可是内容颇多,下面详细分析如下:/* * 我们必须确定在一个非__init函数或 * 其他根线程(root thread)和初始化线程(init thread)间的竞态。 * (这种竞态可能导致start_kernel在根线程运作到cpu_idle前被free_......【阅读全文】

阅读(1050) | 评论(0) | 转发(0)
给主人留下些什么吧!~~
留言热议
请登录后留言。

登录 注册