前言

近期几个月将Linux Kernel的大概研究了一下,以下须要进行深入具体的分析。主要将以S3C2440的一块开发板为硬件实体。大概包含例如以下内容:

1 bootloader分析,以uboot为主,结合详细开发板的情况。我的目标是解释清楚uboot的工作原理(说实话,分析过程中不太想被硬件绑架,可是须要以一个实际的样例

来做分析)

2 kernel部分,这就非常多内容了。打算从kernel启动的流程開始分析。

3 除kernel本身外,还有非常多的知识,比如ld的输入script分析等,这里会一起介绍。

kernel启动流程概要

一:内核Image的组成
1 ES(Embed System)启动的时候,CPU加电,运行的第一条语句是Bootloader,这个很类似PC机上的BIOS。BL将内核载入后,控制器移交给LK
2 LK运行的第一条语句是什么?vmlinux是单体的内核表示。依据前面说的内核编译连接知识,第一条语句是head.S中(历史原因,MD,有非常多文件都叫head.S)
 我们须要又一次分析一下内核(这里就是zImage了)的组成,(方法非常easy,研究make的运行过程,通过make V=1 zImage能够得到差点儿所有信息)
  • vmlinux,这个是未压缩、未strip的内核模块,ELF结构
  • Image:二进制、未压缩、可是strip后的内核
  • head.o:ARM相关的,由BL将控制权转交给它。即前面提到的head.S生成
  • pigg.gz:Image文件的gzip压缩
  • piggy.o:由piggy.S生成,这个S文件通过include Bin方式将Image包括进来。piggy的意思就是背负、肩扛。非常形象不是?
  • misc.o:从上面看,涉及到一些解压方面的内容,而misc提供一些辅助函数
  • vmlinux:悲催.....这个文件是head+pigg+misc构成的vmlinux。名字一样不是?真的非常混淆!
  • zImage:再由上面这个vmlinux压缩而来
图1非常好得展示了这个过程。

图1 内核的构成
3 piggy的故事
piggy.S非常有意思,建立了一个section,而且有一个标志来指示piggy.gz的边界。
piggy相应的是一个叫bootstrap的image,注意,Bootstrap和Bootloader不一样,它是在BL之后的一段代码,用来
解压kernel,设置内存等作用。也能够叫second stage boot。
 
4 Bootloadre和BootstrapLoader
BL和BSL的差别是什么?
  • BL仅仅是初始化硬件,不依赖linux,不处理linux
  • BSL在BL后执行,依赖linux,由于要解压linux。另外一个重要点就是BSL须要为LINUX的执行建立环境
BSL的工作包含:
  • head.O:初始化CPU等工作
  • misc.O:解压,重定位(比如将kernel移动到另外一个位置上) decompress_kernel
  • 其它工作
init/main.c:start_kernel
启动调用图见图2.

图2 启动调用流程图
以下来分析这个启动流程
1 kernel中的head.o分析:尽量保持CPU系列的通用,比如arm的CPU等初始化都在做。可是详细板子(比如CPU+其它硬件)怎么初始化?这就是由mach文件夹中的初始化函数做到的。所以,kernel初始化分为:generic CPU初始化+详细板子的初始化。head.o初始化后,跳转到main.o的start_kernel,继续后面的流程
2 start_kernel:(init/main.c):start_kernel的转移由head.O做的,只是代码一般包括在更通用的head_common.S中
   以后想做kernel的分析,就从main開始吧. start_kernel做了什么事情呢?
  • 刚才仅仅是初始化了cpu相关的,而详细和板子相关的由start_arch运行
3 kernel 參数分析:kernel command line。注意,这个參数是由BL传递给kernel的,只是这个參数又是谁设置的呢?又存在什么地方呢?这个line放在一个global的地方,
  另外,kernel怎样处理这些參数呢?有一个比較好的办法,__set_up宏,将一些參数和相应的函数指针存在一个特殊的section中,然后循环调用这个section中的函数。(和驱动module中的非常像)。定义在init.h中。关于一些特殊參数的取值,在arch/arm/kernel/vmlinux.lds.S中定义。(以后得去看看ld的manual了)__set_up这个宏另一个flags比方early,表示处理阶段是否在early-stage做。标志有__init的section终于占用的内存会被抛弃..
4 子系统初始化:包含中断、等。?section嵌套section?
5 kernel_init进程:start_kernel最后会fork一个kernel_init进程,而原运行进程变成idle进程了..
6 用户空间的init进程:由kernel_init进程终于通过execve init完毕
7 參考文献。ELP这本书给的參考文献都巨强..

 

Linux Kernel系列一:开篇和Kernel启动概要的更多相关文章

  1. linux kernel系列四:嵌入式系统中的文件系统以及MTD

    本节介绍File System和MTD技术 一 FS 熟知的FS有ext2,3,4.但是这些都是针对磁盘设备的.而ES中一般的存储设备为Flash,由于Flash的特殊性: Flash存储按照Bloc ...

  2. Linux Kernel系列三:Kernel编译和链接中的linker script语法详解

    先要讲讲这个问题是怎么来的.(咱们在分析一个技术的时候,先要考虑它是想解决什么问题,或者学习新知识的时候,要清楚这个知识的目的是什么). 我在编译内核的时候,发现arch/arm/kernel目录下有 ...

  3. 嵌入式之Linux系统裁剪和定制---(kernel+busyboxy+dropbear+nginx)

    本文将介绍通过完全手动定制内核,在此基础上添加 busybox ,并实现远程登陆,使裁剪的 linux 能够运行 nginx . 在此之前介绍一下 linux 系统的启动流程. linux系统启动流程 ...

  4. Linux下USB烧写uImage kernel

    Linux下USB烧写uImage kernel   1.启动开发板,进入u-boot:(如果开发板中没有系统,可以通过用SD卡方式启动开发板进入)   U-Boot 2011.06 (Mar 19 ...

  5. Samsung_tiny4412(驱动笔记01)----linux 3.5,U-Boot,Busybox,SD卡启动环境搭建

    /*********************************************************************************** * * linux 3.5,U ...

  6. (4)top详解 (每周一个linux命令系列)

    (4)top详解 (每周一个linux命令系列) linux命令 top详解 引言:今天的命令是用来看cpu信息的top top 我们先看man top top - display Linux pro ...

  7. (2)free详解 (每周一个linux命令系列)

    (2)free详解 (每周一个linux命令系列) linux命令 free详解 引言:今天的命令是用来看内存的free free 换一个套路,我们先看man free中对free的描述: Displ ...

  8. linux入门系列12--磁盘管理之分区、格式化与挂载

    前面系列文章讲解了VI编辑器.常用命令.防火墙及网络服务管理,本篇将讲解磁盘管理相关知识. 本文将会介绍大量的Linux命令,其中有一部分在"linux入门系列5--新手必会的linux命令 ...

  9. ARM linux解析之压缩内核zImage的启动过程

    ARM linux解析之压缩内核zImage的启动过程 semilog@163.com 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s  ...

随机推荐

  1. 一种全新的MEMS开关——高性能、快速、低能耗以及双稳态

    这种开关最早由申军教授和研究生阮梅春发明,研究生埃里克·朗格卢瓦在简化结构和缩小尺寸上作了探索,黄志林用相同原理做出了MEMS光学镜子开关,曹志良改变设计.材料和工艺后制作出了能同步开关的矩阵.这种M ...

  2. mfc subclasswindow attach setwindowlong使用区别

    1. CWnd::Attach BOOL Attach( HWND hWndNew ); 返回值:如果成功,则返回非零值:否则返回0. 参数: hWndNew 指定了Windows窗口的句柄. 说明: ...

  3. js混淆 反混淆 在线

    js反混淆地址:http://www.bm8.com.cn/jsConfusion/ 在线javascript 混淆http://www.moralsoft.com/jso-online/hdojso ...

  4. 【LeetCode练习题】Climbing Stairs

    Climbing Stairs You are climbing a stair case. It takes n steps to reach to the top. Each time you c ...

  5. nyoj 325 zb的生日(dfs)

    描述今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb ...

  6. 步步学LINQ to SQL:为实体类添加关系【转】

    [IT168 专稿]本文详细为你阐述了如何在你的应用程序中实现LINQ to SQL.附件的示例程序包括了这里探讨的所有代码,还提供了一个简单的WPF图形界面程序来显示通过数据绑定返回的结果集. 第一 ...

  7. Memcached安装卸载

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度.Memcached ...

  8. 自己动手写处理器之第四阶段(1)——第一条指令ori的实现

    将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第11篇,我尽量每周四篇 第4章 第一条指令ori的实现 前面几章介绍了非常多预备知识,也描绘了即将要实现的OpenMIPS处 ...

  9. 后台特殊字符处理,ajax

    Dictionary<string, string> d = new Dictionary<string, string>(); d.Add("price" ...

  10. 理解js异步的概念

    js引擎在执行的时候是单线程的,这是大家都知道的.我们先来看一段代码: <html> <head> <meta http-equiv="Content-Type ...