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

在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调用函数,使用方法如下:      

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

  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. Troubleshooting FIM: (No Display Name) in FIM Portal

    from: http://social.technet.microsoft.com/wiki/contents/articles/12682.troubleshooting-fim-no-displa ...

  2. 什么时候用Application的Context,什么时候用Activity的Context

    单例模式用application的context 如果我们在Activity A中或者其他地方使用Foo.getInstance()时,我们总是会顺手写一个『this』或者『mContext』(这个变 ...

  3. Android studio git 本地仓库和远程仓库节点对比

    1.初始状态 2.本地修改文件,然后commit 3.本地再次修改文件,然后commit 4.本地push 从上图可以看出,push完成后,本地仓库的节点和远程仓库的节点是一样的.

  4. java url方法解释

    java 的url类中有很多get方法 以下是获取值的意义 // 首先先看一下wikipedia上关于url的一个描述 //Every HTTP URL conforms to the syntax ...

  5. iOS 9 使用HTTP的方法

    问题 在ios 9中使用HTTP请求,Xcode就会抛出下面的Exception: App Transport Security has blocked a cleartext HTTP (http: ...

  6. 网络编程---HTTP

    URL: 什么是URL ? URL的全称是Uniform Resource Locator(统一资源定位符) 通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址.位置,互联网上的每个资 ...

  7. MicroStation VBA 操作提示

    Sub TestShowCommand() ShowCommand "画条线" ShowPrompt "选择第一个点" ShowStatus "选择第 ...

  8. [css]我要用css画幅画(二)

    接着之前的[css]我要用css画幅画(一) , 今天,我又画一个房子,很简单,屋顶.墙壁.门. 现在开始,做得效果都只兼容chrome,所以下面的css3的属性可能只有-webkit-前缀. 我只是 ...

  9. Android 播放电影时滑动屏幕调整屏幕亮度(转)

    (转自:http://blog.csdn.net/piaozhiye/article/details/6544450) 发现有一些主流的播放器播放电影时可以通过滑动屏幕调整屏幕亮度,其实实现起来也很容 ...

  10. subversion-1.8.5 windows install dist

    python build\win32\make_dist.py subversion-1.8.5 d:/rapm