1.U-Boot启动内核的过程可以分为两个阶段

1)第一阶段的功能

  • 硬件设备初始化
  • 加载U-Boot第二阶段代码到RAM空间
  • 设置好栈
  • 跳转到第二阶段代码入口

2)第二阶段的功能

  • 初始化本阶段使用的硬件设备
  • 检测系统内存映射
  • 将内核从Flash读取到RAM中
  • 为内核设置启动参数
  • 启动内核

关于uboot 启动分析以下这条链接写的不错,使用的是MINI2440平台: 

http://www.cnblogs.com/heaad/archive/2010/07/17/1779829.html

2.编译Kernel:

Makefile 可以参考:/arch/arm/kernel/kbuild/Makefile.txt

config : (1) autoconf.h

      (2) auto.conf

编译后可根据:  /arch/arm/kernel/head.S   和 /arch/arm/kernel/vmlinux.lds  分析启动流程。

内核启动完挂接根文件系统,然后启动应用程序。

3.构建根文件系统:jffs2 , yaffs2

内核启动应用程序:①open(/dev/console)  : 终端。  ②通过run_init_process 启动程序。

init程序(即busybox):①读取配置文件(/etc/inittab)。 ②解析配置文件。 ③执行(客户定制程序)。

busybox : ls, cp, cd等指令(应用)的集合。

  ->init_main  -> parse_inittab -> file = fopen(INITTAB, "r");

inittab格式:<id>:<runlevels>:<action>:<process>

id => /dev/id ,用作终端:stdin,   stdout,   stderr: printf,scanf,err.
   runlevels: 忽略
   action: 执行时机: sysinit, respawn, askfirst, wait, once, restart, ctrlaltdel, shutdon.
   process: 应用程序或脚本

(一)根据配置文件或默认设置构造action:

static void new_init_action(init action, const char *command, const char *cons)

   ->     new_init_action(ASKFIRST, "-/bin/sh", "/dev/tty2");  反推出配置文件:tty2::askfirst:-/bin/sh

①创建一个init_action结构,填充。

②放入init_action_list链表。

(二)执行action:多种action类型

run_actions(SYSINIT);

run_actions(WAIT);

run_actions(ONCE);

while(1){

  run_actions(RESPAWN);

  run_actions(ASKFIRST);

  wpid = wait(NULL);

  while (wpid > 0){

    a->pid = 0;

  }

}

最小根文件系统构成:①/dev/console , /dev/null  ②init => busybox. ③/etc/inittab ④inittab配置文件指定的程序 ⑤程序依赖的库(C库)。

构建根文件系统:

①參考INSTALL如何編譯busybox:(以下构建init)

make defconfig      : 使用默认配置减少一些配置工作

make menuconfig   : Build Options  配置編譯選項。
   make
   make CROSS_COMPILE=arm-linux-     或 在Makefile中指定编译工具链。

                          ARCH ?=arm   
                        CROSS_COMPILE ?= arm-linux-

 make CONFIG_PREFIX=/work/nfs_root/fs_mini/    install (指定你要编译到的目录,直接install可能会破坏pc机系统)

②制作根文件系统:(完善最小系统)

 测试指令: sudo mknod console c 5 1

安装glibc库:  mkdir -p /work/nfs_root/fs_mini/lib
        cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib   //进入交叉编译器glibc库目录
        cp *so*  /work/nfs_root/fs_mini/lib -d(如果是链接文件依然保持链接形式)

制作系统映像:
   编译安装yaffs2image文件系统制作工具    

    1、下载yaffs2源码包:git clone git://www.aleph1.co.uk/yaffs2

    2、解压

    3、为了使内核支持yaffs2源码,必须为内核打补丁:.

     进入yaffs2根目录,执行/patch-ker.sh c m /home/zdl/study/linux-2.6.10-fs2410/linux-2.6.10,

    其中c表示复制    m代表复合版本,另外与之相对立的参数 l表示仅链接不复制文件,s代表单一版本,因为yaffs目前具有yaffs和yaffs2两个源码包。

 使用方法:mkyaffs2image /work/nfs_root/fs_mini   fs_mini.yaffs2

挂在虚拟根文件系统:mkdir proc
           mount -t proc null /proc   //可以加入/etc/init.d/rcS 脚本中开机自动挂载

     另一种方法:mount -a   //依赖/etc/fstab

      fstab格式:#device  mount-point  type  options  dump  fsck  order  

             proc     /proc      proc     defaults      0        0

udev机制:自动创建/dev/设备节点
  busybox默认的简化版mdev使用:参考mdev.txt   ,同样可以在fstab中指定mount。

 编译制作jffs2映像文件的工具

  cd /work/GUI/xwindow/X/deps
  tar xzf zlib-1.2.3.tar.gz  
  cd zlib-1.2.3
      ./configure --shared --prefix=/usr
      make
      sudo make install
    然后编译 mkfs.jffs2
  cd /work/tools
      tar xjf mtd-utils-05.07.23.tar.bz2
  cd mtd-utils-05.07.23/util
  make
      sudo make install

制作jffs2映像文件:
  cd /work/nfs_root
  mkfs.jffs2 -n -s 2048-e 128KiB -d fs_mini -o fs_mini.jffs2

网络文件系统NFS使用:  

配置nfs服务:sudo vi /etc/exports    
      重启nfs服务:sudo /etc/init.d/nfs-kernel-server restart
      使用nfs服务:mount -t nfs -o nolock 192.168.1.19:/work/nfs_root/   mini_fs
      直接从nfs启动:参考nfsroot.txt配置  ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
      bootargs=noinitrd root=/dev/nfs nfsroot=192.168.1.19:/work/nfs_root/mini_fs ip=192.168.1.11:192.168.1.19:192.168.1.1:255.255.255.0::eth0:off

Linux学习 :Uboot, Kernel, 根文件系统初步分析的更多相关文章

  1. 关于UBOOT,LINUX内核编译,根文件系统的15个小问题

    (1)内核默认运行地址和加载地址在哪里设置? 由 arch/arm/kernel/vmlinux.lds.S 生成的 arch/armkernel/vmlinux.lds决定   (2)从FLASH什 ...

  2. 如何在 Linux 虚拟机上扩展根文件系统

    问题描述 通过 Azure 平台部署的 Linux 虚拟机默认的根文件系统容量有限,需要进行扩展. 问题分析 由于 Azure 平台部署的 Linux 虚拟机默认根文件系统容量比较小,客户在使用过程中 ...

  3. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  4. linux 内核移植和根文件系统的制作

    1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起. 1.1.1  Linux版本 Linux内核的版本号 ...

  5. Linux学习笔记之 Btrfs文件系统简介及使用

    Btrfs 也有一个重要的缺点,当 BTree 中某个节点出现错误时,文件系统将失去该节点之下的所有的文件信息.而 ext2/3 却避免了这种被称为”错误扩散”的问题. Btrfs相关介绍: Btrf ...

  6. linux学习10 Linux目录结构和根文件系统全面讲解

    一.回顾 1.如何获取使用帮助 help,--help,man,info 官方文档,自带文档(README,CHANGELOG,INSTALL),官方文档 发行版的文档 Google Linux Ke ...

  7. Linux--安装过程中的根文件系统的分析

    前言: 在这篇文章中S3C6410公版的Linux BSP和U-Boot为了分析,名词和数据文件的所有内容本文是基于环境为例,所有的代码是在设置的示例进行分析的过程中.哈. 假设有不对或者不完好的地方 ...

  8. 第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)

    本章学习如何启动第一个应用程序 1.在前面的分析中我们了解到,在init进程中内核挂接到根文件系统之后,会开始启动第一个应用程序: kernel_init函数代码如下: static int __in ...

  9. Linux内核启动及根文件系统载入过程

    上接博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令,就进入Linux内核启动阶段.与u-bo ...

随机推荐

  1. laravel old

    最近做一个laravel框架下的一个网页.遇到了old 无法点击选中的问题,捉摸好久,原来,laravel下的old 是基于seesion下的. 如果想用old必须要在session有的情况下.

  2. python成长之路【第十五篇】:JavaScript初步认识

    JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.如何编写 1.J ...

  3. php+js进度读取条

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  4. Js Map 实现

    /* * MAP对象,实现MAP功能 * * 接口: * size() 获取MAP元素个数 * isEmpty() 判断MAP是否为空 * clear() 删除MAP所有元素 * put(key, v ...

  5. ORACLE误删除ASM磁盘修复

    在数据库运维中,总会遇到一些粗心大意的DBA,一不小心删除一些东西,这里举例讲解在误删除ASM磁盘之后,如果用KFED工具进行恢复: [grid@RAC1 ~]$ sqlplus / as sysas ...

  6. MyISAM与InnoDB区别

    两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用. 我作为使用MySQL的用户角度出发,Innodb和My ...

  7. 有关Fragment的知识点

    关于判断Fragment是否可见,可以尝试参考使用Fragment中的两个方法: final boolean isHidden() Return true if the fragment has be ...

  8. Vs2010在C#类文件头部添加文件注释的方法

    步骤: 1.VS2010 中找到(安装盘符以C盘为例) 32位操作系统路径:C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Item ...

  9. 一步一步将Vim打造成C++超级IDE

    文/嶽永鹏 最近从MS Windows 转到了Liunx,花了一段时间熟悉和学习Liunx环境.有时候,真的很是怀念MS Vistual Studio那种超级智能的开发环境,总是想在Vim拾起那些曾进 ...

  10. VRML开发环境配置

    Vrml真的是个好老的语言啊~~~~ 1. 安装xp虚拟机 vm已经安装过.现在安装xp系统. 发现个网站,msdn itellyou,这里能够下载很多不同的操作系统,都是纯净版的. 选择xp系统:h ...