zoukankan      html  css  js  c++  java
  • Linux学习 :Uboot, Kernel, 根文件系统初步分析

    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

  • 相关阅读:
    Integrating AngularJS with RequireJS
    commonjs AMD,CMD
    JavaScript Module Pattern: In-Depth
    Javascript模块化编程(一):模块的写法
    Javascript模块化编程(三):require.js的用法
    Javascript模块化编程(二):AMD规范
    Log4J日志管理类使用详解 (转)
    细说JAVA反射
    test1
    test
  • 原文地址:https://www.cnblogs.com/blogs-of-lxl/p/5843396.html
Copyright © 2011-2022 走看看