编译的内核可能会很大,故这里可以压缩一下。而在内核文件中需要解压,所以就会有一段自解压代码。

在uboot启动内核的时候,调用了函数: thekernel(0,MACH_ID,params_addr )

  0 存放在r0寄存器

  MACH_ID 存放在r1

  params_addr存放在r2

1. 首先处理uboot传入的参数。

  获取处理器id,查看内核是否支持这个处理器CPU。

  获取uboot传入的机器ID,查看内核是否支持所运行该系统的单板。

  建立一级页表,使能mmu。

  跳转到start_kernel。内核的第一个C函数。

  处理传入的启动参数。

  启动参数包括: 内存大小等。

start_kernel

  setup_arch

  setup_command_line

  parse_early_param

    do_early_param

      从__setup_start到__setup_end调用函数,使用方法如下:      

for (p = __setup_start; p < __setup_end; p++) {
if (p->early && strcmp(param, p->str) == 0) {
if (p->setup_func(val) != 0)
printk(KERN_WARNING
"Malformed early option '%s'\n", param);
}

  unkown_bootption

  reset_init

    kernel_init

      prepare_namespace

        mount_root      //挂载根文件系统

      init_post

        //执行运用程序

        /* 打开“/dev/console”终端设备文件 */

        /*  启动execute_command定义的函数 一旦执行,将做为第一个应用程序,不会退出 */

        /* 如果没有以上函数,将执行 “/sbin/init” 函数  */

        /* /etc/init */

        /* /bin/init */

        /* 如果没有以上的第一个应用,则系统无法启动 */

挂载根文件系统。

最终目的是运行应用程序

busybox

    /* parse_inittab  打开解析配置文件 /etc/inittab */

      /* inittab格式 */

      /* <id>:<runlevel>:<action>:<process> */

      /* id 转化为  /dev/id   用作终端

        runlevels:  忽略

        action    : 执行时机askfist sysinit等

        process  :  应用程序或脚本     

       */

      new_init_action( action, command, cons )

      创建一个action,并填写结构体

      将这个结构体放入init_action_list链表

      运行链表中的函数,创建为进程,并从链表中删除。

构造inittab

  console ::askfirst:-/bin/sh

添加虚拟文件系统。

  ::sysinit:/etc/init.d/Rcs      /*开机启动脚本*/

可将下面命令添加到rcs,开机可自己启动mount -t proc none /proc

也能用mount -a  /*依赖 /etc/fstab文件 */

    /etc/fstab文件格式

    device  mount-option    type    options    dump  fsck  order

    proc    /proc        proc    defaults      0   0  

执行之后就能使用ps命令。

udev为自动创建到/dev/设备节点的简化版本。

mdev为udev的简化版本。

  在/etc/fstab中添加

    sysfs  /sys  sysfs  defaults  0  0

    tmpfs  /dev  tmpfs  defaults  0  0

  在rcs中添加

    mkdir  /dev/pts

    mount -t devpts devpts /dev/pts

    echo /sbin/mdev >  /proc/sys/kernel/hotplug  //支持热插拔设备

    mdev -s

嵌入式Linux驱动学习之路(七)Linux内核启动流程的更多相关文章

  1. 嵌入式Linux驱动学习之路(九)Linux系统调用、驱动程序框架

    应用程序通过open  read  write close 等函数来操作计算机硬件.类似是一个接口. 当应用程序调用这些接口程序时,计算机是如何进入内核的呢?这是经过了系统调用. 实际上当调用接口函数 ...

  2. 嵌入式Linux驱动学习之路(二十三)NAND FLASH驱动程序

    NAND FLASH是一个存储芯片. 在芯片上的DATA0-DATA7上既能传输数据也能传输地址. 当ALE为高电平时传输的是地址. 当CLE为高电平时传输的是命令. 当ALE和CLE都为低电平时传输 ...

  3. 嵌入式Linux驱动学习之路(五)u-boot启动流程分析

    这里说的u-boot启动流程,值得是从上电开机执行u-boot,到u-boot,到u-boot加载操作系统的过程.这一过程可以分为两个过程,各个阶段的功能如下. 第一阶段的功能: 硬件设备初始化. 加 ...

  4. 嵌入式Linux驱动学习之路(一)嵌入式系统的软硬件架构

    硬件资料: 操作系统:(非虚拟机) zws@z-pc:~$ lsb_release -aNo LSB modules are available.Distributor ID: Ubuntu Desc ...

  5. 嵌入式Linux驱动学习之路(二十五)虚拟网卡驱动程序

    一.协议栈层次对比 设备无关层到驱动层的体系结构 1).网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过 ...

  6. 嵌入式Linux驱动学习之路(二十四)Nor Flash驱动程序

    Nor Flash和Nand Flash的不同: 类型 NOR Flash  Nand Flash  接口 RAM-like,引脚多 引脚少 容量 小(1M.2M...) 大(512M.1G) 读 简 ...

  7. 嵌入式Linux驱动学习之路(二十二)用内存模拟磁盘

    安装驱动后,可在/dev/目录下发现已经生成了相应的设备文件. 格式化设备:mkdosfs /dev/ramblock. 挂载设备. 读写设备 . 驱动程序代码: /***************** ...

  8. 嵌入式Linux驱动学习之路(二十)USB设备驱动

    USB在接入系统的时候,以0的设备ID和主机通信,然后由主机为其分配新的ID. 在主机端,D+和D-都是下拉接地的.而设备端的D-接上拉时,表明此设备为高速设备:12M/s. D+接上拉时则是全速设备 ...

  9. 嵌入式Linux驱动学习之路(十八)LCD驱动

    驱动代码: /************************************************************************* > File Name: lcd ...

随机推荐

  1. Egret白鹭H5小游戏开发入门(三)

    前言: 在上一篇文章中着重介绍了H5小游戏开发的起步阶段,如Wing面板的使用,素材的处理,类的说明等等,那么今天主要是涉及到场景的创建,loading的修改等等的代码编写. 对于这一节,我在讲解的过 ...

  2. 2013 Visual Studio Magazine读者选择奖界面框架类获奖情况

    2013 Visual Studio Magazine读者选择奖已经正式揭晓了!据了解,截至今年此奖项已经评选了21次,非常值得.NET开发人员信赖和参考.此次评选共有400多个产品角逐28个分类的奖 ...

  3. Android UI线程和非UI线程

    Android UI线程和非UI线程 UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这 ...

  4. 阿帕奇apache服务器和webDav服务器快速配置。

    当自己在家敲代码需要发请求时,就可以配置本地apache,Mac电脑自带的服务器.这个比windows上的本地服务器还要好用,下面写下最快速配置方案. 0.在开始之前需要给自己的电脑设置下开机密码,想 ...

  5. Fragment与FragmentActivity的关系

    前阵用viewpaper+fragment做滑动引导,查阅了下网上的资料,发现在有两种做法,一个是自建类直接继承Activity另一种是继承FragmentActivity,很是迷惑,在查了些goog ...

  6. Android 隐式意图的配置

    本文地址:http://www.cnblogs.com/wuyudong/p/5677473.html,转载请注明源地址. <Android 显示意图激活另外一个Actitity>一文介绍 ...

  7. OC 动态类型,动态绑定,动态加载

    OC 动态类型,动态绑定,动态加载 Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有 动态类型(Dynamic typing) 动态绑定(Dynamic binding) ...

  8. 【原+转】用CMake代替makefile进行跨平台交叉编译

    在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: ./configu ...

  9. UEditor无法复制的解决方法

    今天终于知道UEditor不能复制的真正原因啦,还是自己一直没有仔细研究. UEditor 粘贴 Excell 中的表格时报错导致无法粘贴的解决办法 在UEditor一些版本中,如果粘贴Excell中 ...

  10. .Net魔法堂:提取注释生成API文档

    一.前言 在多人协作的项目中,除了良好的代码规范外,完整的API文档也相当重要.通过文档我们快速了解系统各模块的实际接口,及其使用场景.使用示例,一定程度上降低沟通成本,和减少后期维护中知识遗失等风险 ...