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

在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. 如何用JavaScript探测CSS动画是否已经完成

    不啰嗦上代码: WN:(function(){ var el = $('<fakeelement>'), transition="transition", transi ...

  2. 一次简单的分析手机APK病毒木马

    写个笔记记录一下,起因是朋友在QQ上发了个连接叫我看看 安不安全,叫我帮他看看,反正在店里待着也没生意,那就顺便看看咯. 打开这个网址  会自动弹出下载一个名为OOXX的APK安装包. 起先我的思路是 ...

  3. putty不能连接linxu,报:connection refused

    用putty连接新装的centos6.5,出现了connection refused问题, 后参考http://blog.sina.com.cn/s/blog_60d2d62a0100tq2l.htm ...

  4. myeclipse 2015 CI 16发布【附下载】

    2015升级版再次来袭! 更新日志: Slack Integration 新版本集成了Slack,你只需要注册一个Slack帐号然后就可以发送和接收代码片段.你甚至不需要登录Slack就可以直接在Ec ...

  5. 《The Linux Command Line》 读书笔记04 Linux用户以及权限相关命令

    Linux用户以及权限相关命令 查看身份 id:Display user identity. 这个命令的输出会显示uid,gid和用户所属的组. uid即user ID,这是账户创建时被赋予的. gi ...

  6. App开发流程之右滑返回手势功能续

    上一篇记录了利用系统私有变量和方法实现右滑返回手势功能:http://www.cnblogs.com/ALongWay/p/5893515.html 这篇继续记录另一种方案:利用UINavigatio ...

  7. eclipse怎样在线安装hibernate tools插件并使用

    不知不觉,小Alan已经将近3个月没有上班了,最近在复习一些知识,随时准备回到代码世界的战场,今天复习到了Hibernate,记录一下一点点小知识,那就是eclipse下hibernate Tools ...

  8. classpath: 和classpath*:的区别

    classpath本质是jvm的根路径,jvm获取资源都是从该根路径下找的,注意这个根路径是个逻辑路径,并不是磁盘路径.比如两个jar包的路径是/a/a.jar和/b/b.jar,但是用classpa ...

  9. .net开发中常用的第三方组件

    .net开发中常用的第三方组件 2013-05-09 09:33:32|  分类: dotnet |举报 |字号 订阅     下载LOFTER 我的照片书  |   RSS.NET.dll RSS. ...

  10. XML 在SQLServer中的使用

    SQL Server对于XML支持的核心在于XML数据的格式,这种数据类型可以将XML的数据存储于数据库的对象中,比如variables, columns, and parameters.当你用XML ...