Linux學習 :Uboot, Kernel, 根文件系統初步分析

1.U-Boot啓動內核的過程能夠分爲兩個階段html

  1)第一階段的功能linux

  • 硬件設備初始化
  • 加載U-Boot第二階段代碼到RAM空間
  • 設置好棧
  • 跳轉到第二階段代碼入口

  2)第二階段的功能git

  • 初始化本階段使用的硬件設備
  • 檢測系統內存映射
  • 將內核從Flash讀取到RAM中
  • 爲內核設置啓動參數
  • 啓動內核

關於uboot 啓動分析如下這條連接寫的不錯,使用的是MINI2440平臺: 網絡

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

 

2.編譯Kernel:測試

Makefile 能夠參考:/arch/arm/kernel/kbuild/Makefile.txtui

config : (1) autoconf.hspa

      (2) auto.confrest

編譯後可根據:  /arch/arm/kernel/head.S   和 /arch/arm/kernel/vmlinux.lds  分析啓動流程。server

內核啓動完掛接根文件系統,而後啓動應用程序。

 

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文件系統製做工具    

    一、下載yaffs2源碼包:git clone git://www.aleph1.co.uk/yaffs2

    二、解壓

    三、爲了使內核支持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

相關文章
相關標籤/搜索