<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    從ramdisk根文件系統啟動Linux 二

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    今天做了個試驗,讓Linux2.6.29.4從ramdisk根文件系統啟動成功,總結一下。
    其中涉及的內容較多,很多東西不再詳述,如需深入研究請查閱相關資料(百度或谷歌一下一大堆)。


    開發環境:Fedora 9
    交叉編譯工具鏈:arm-linux-gcc 4.3.2 with EABI
    嵌入式Linux內核版本:2.6.29.4-FriendlyARM。昨天寫貼子的時候具體記不清了,今天起來啟動開發板用uname -r查一下,就是叫做2.6.29.4-FriendlyARM,帖子已經改好了。本文就是友善之臂的2.6.29.4-FriendlyARM的那個版本的內核的基礎上改的。其它版本的應該也類似,僅供參考。
    開發板:mini2440-128M Nand Flash
    Bootloader:u-boot-2009.11


    具體步驟如下:
    1.解壓內核源碼樹
    解壓linux-2.6.29-mini2440-20090708.tgz到自己的工作目錄,會生成一個友善之臂修改過的并且有幾個mini2440默認配置文件的內核源碼目錄linux-2.6.29。具體步驟參照友善之臂mini2440開發板用戶手冊,具體不詳述了。

    2.修改內核配置選項
    進入內核源碼目錄linux-2.6.29目錄
    #cp config_mini2440_t35 .config
    #make menuconfig ARCH=arm
    打開配置菜單,修改兩個配置項,分別是:
    a):General setup-->選擇 Initial RAM filesystem and RAM disk...... 項
    b):Device Drivers-->Block devices-->選擇 RAM block device support 項

    并檢查Optimize for size是否被選中,如果沒有則選中,此項優化內核大小,根據需要進行配置。
    修改(8192)Default RAM disk size kbytes選項為(4096)Default RAM disk size kbytes,之所以修改是因為我之后制作的ramdisk是4096KB大小的。當然如果你想制作8192KB大小的ramdisk,這里就要對應為8192了,以此類推。但是最小系統嘛,是不用那么大的ramdisk的。此項的默認配置就是(4096),以前我改過這個配置,所以是(8192)了。如果這個大小和你做的ramdisk不匹配,則啟動時仍然會出現kernel panic內核恐慌,提示ramdisk格式不正確,掛載不上ramdisk。
    然后特別要注意的一點是,ramdisk是一種內存虛擬磁盤技術,實質上并不是一種文件系統,它使用的文件系統時ext2文件系統。所以一定要在make menuconfig ARCH=arm的時候進入File systems菜單,選上<*> Second extended fs support。以提供內核對ext2文件系統的支持。我以前添加過了ext2文件系統了,所以開始的時候在此沒有說明,在此為了說明為什么有的人照著我的方法做了,但是仍然kernel panic,特別把這一步也加上。
    然后保存配置退出。
    這樣就為內核添加好了ramdisk啟動功能和ramdisk的驅動支持了。

    3.修改內核啟動參數
    方法有二:
    a):修改.config的第310行,修改CONFIG_CMDLINE=""的定義
    修改為CONFIG_CMDLINE="initrd=0x31000000,0x200000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M"
    保存。
    意思為從ramdisk啟動,ramdisk壓縮文件起始地址在內存地址0x31000000處,文件大小為0x200000。
    此參數也可以在make menuconfig ARCH=arm時進入Boot options菜單,然后在Default kernel command string里修改。效果是一樣的。
    b):或者不修改.config的的第310行CMDLINE定義,而是用u-boot的bootargs環境變量來傳遞啟動參數。
    同樣也是修改該環境變量為bootargs=initrd=0x31000000,0x200000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M
    并saveenv保存u-boot環境變量
    以上a),b)的效果是一樣的。

    4.編譯內核
    #make zImage ARCH=arm CROSS_COMPILE=arm-linux-
    然后是二十分鐘左右的等待。
    編譯完成后在當前目錄下就出現了zImage內核映像了。
    好像友善之臂把內核源碼目錄里的uImage目標給注釋了,以前在論壇里看到過有人說,直接make uImage好像提示沒有uImage的目標。所以我就先制作zImage,然后再用u-boot的mkimage工具轉化為uImage。其實uImage就是在zImage的開頭部分增加了一個64字節的內核映像說明。

    5.制作uImage內核映像
    由于我使用的Bootloader是u-boot,所以要將zImage轉化為uImage,方法如下:
    #mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -n "Linux kernel Image" -d zImage uImage-ramdisk
    說明:mkimage工具是u-boot格式uImage內核映像制作工具。如果成功編譯u-boot之后,它會在u-boot源碼樹下的tools目錄之下。建議將其拷貝到宿主機的/sbin/目錄下,以方便使用。mkimage使用時的具體參數不再詳述,不清楚的請自己查閱。

    6.制作ramdisk根文件系統
    該過程是制作ramdisk根文件系統的核心步驟,方法如下:
    a)創建根文件系統目錄:
    #cd轉入到你的工作目錄。
    #mkdir rootfs
    #cd rootfs
    #mkdir bin dev etc lib proc sbin sys usr mnt tmp var
    #mkdir usr/bin usr/lib usr/sbin lib/modules

    b)創建最基本的設備文件:
    #cd dev
    #mknod -m 666 console c 5 1
    #mknod -m 666 null c 1 3
    #cd ..

    c)安裝/etc配置文件:
    這里可以直接把友善之臂的root_qtopia里的幾個基本的配置文件拷貝過來,只拷貝必要的即可,并對其內容進行刪減,因為我做的ramdisk并不包含Qtopia等,全拷貝過來也沒有用。
    我是從網上找的最小系統的etc配置文件直接解壓到我制作的根文件系統里了,并做參照友善之臂的root_qtopia添加了一些內容,見最后的說明。
    操作如下:
    #tar etc.tar.gz -C /xxx/rootfs
    xxx表示你要制作的rootfs所在的目錄。

    d)編譯內核模塊:
    方法是如下:
    進入Linux內核源碼目錄(linux-2.6.29)
    #make modules ARCH=arm CROSS_COMPILE=arm-linux-

    e)安裝內核模塊:
    #make modules_install ARCH=arm INSTALL_MOD_PATH=/xxx/rootfs
    xxx表示你要制作的rootfs所在的目錄。

    f)配置busybox
    進入busybox目錄執行#make menuconfig
      進入Busybox Settings -> build Options ->選中"Build busybox as a static binary“,即靜態鏈接,免去拷貝大量的庫文件。
      Installation Options -> 選中"Don't use /usr",以免busybox不慎被安裝到宿主機系統的相應目錄下,破壞宿主機系統。
      Busybox Installation Prefix (/xxx/rootfs),修改該選項表明編譯后的busybox將安裝到該位置。

    g)編譯、安裝busybox
    #make ARCH=arm CROSS_COMPILE=arm-linux-
    幾分鐘編譯完成后
    #make install
    安裝到Busybox Installation Prefix (/xxx/rootfs)設定的目錄里。當前為我要制作的根文件系統目錄(/xxx/rootfs)。

    h)制作ramdisk根文件系統鏡像
    方法如下:
    http://genext2fs.sourceforge.net/下載可以簡單方便的制作ramdisk文件系統的工具genext2fs,這樣就不用像網上大多數說的那樣繁瑣的制作ramdisk映像了,當前最新版本為genext2fs-1.4.1.tar.gz 。
    編譯生成該工具genext2fs,并將其放入宿主機的/sbin/目錄下以方便使用。
    跳轉到要制作的rootfs的上一級目錄
    #genext2fs -b 4096 -d rootfs ramdisk
    -b是指制作的ramdisk大小為4096K字節
    -d是指要制作成ramdisk的根文件系統目錄
    最后的ramdisk是制作出來的ramdisk的名字,當然可以改名了。
    #gzip -9 -f ramdisk
    將該ramdisk以最優方式壓縮為ramdisk.gz

    7.下載內核映像和ramdisk映像
    啟動u-boot,暫停u-boot自動啟動,在u-boot命令行中鍵入如下命令下載內核和ramdisk映像:
    [u-boot@MINI2440]# tftp 0x32000000 uImage-ramdisk
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:08:11:18:12:27
    operating at 100M full duplex mode
    Using dm9000 device
    TFTP from server 192.168.31.117; our IP address is 192.168.31.230
    Filename 'uImage-ramdisk'.
    Load address: 0x32000000
    Loading: T T #################################################################
             #################################################################
             #
    done
    Bytes transferred = 1917752 (1d4338 hex)
    [u-boot@MINI2440]# tftp 0x31000000 ramdisk.gz
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:08:11:18:12:27
    operating at 100M full duplex mode
    Using dm9000 device
    TFTP from server 192.168.31.117; our IP address is 192.168.31.230
    Filename 'ramdisk.gz'.
    Load address: 0x31000000
    Loading: T T #################################################################
             ####
    done
    Bytes transferred = 1002594 (f4c62 hex)

    8)使用ramdisk根文件系統啟動內核
    在u-boot命令行下鍵入如下命令啟動系統:
    bootm 0x32000000
    ## Booting kernel from Legacy Image at 32000000 ...
       Image Name:   Linux-2.6.29.4-FriendlyARM
       Created:      2010-04-09  15:13:52 UTC
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    1917688 Bytes =  1.8 MB
       Load Address: 30008000
       Entry Point:  30008000
       Verifying Checksum ... OK
       Loading Kernel Image ... OK
    OK

    Starting kernel ...

    Uncompressing Linux.............................................................
    ................................................................ done, booting t
    he kernel.
    Linux version 2.6.29.4-FriendlyARM (root@localhost.localdomain) (gcc version 4.3
    .2 (Sourcery G++ Lite 2008q3-72) ) #3 Fri Apr 9 23:13:36 CST 2010
    CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
    CPU: VIVT data cache, VIVT instruction cache
    Machine: FriendlyARM Mini2440 development board
    Memory policy: ECC disabled, Data cache writeback
    ……中間過長的內容在此省略了……
    RAMDISK: Compressed image found at block 0
    VFS: Mounted root (ext2 filesystem) on device 1:0.
    Freeing init memory: 136K
    eth0: link down

    Processing /etc/profile... Done

    # eth0: link up, 100Mbps, full-duplex, lpa 0x45E1

    至此系統啟動成功。

    ----------------------------------------------------------------------------------
    后記:由于友善之臂mini2440默認的配置文件是將驅動等直接編譯到內核里去了,并沒有使用內核模塊。所以上述第6步制作根文件系統中的d)編譯和e)安裝內核模塊的步驟可以不做。我就沒有編譯內核模塊。因為參照友善之臂的root_qtopia根文件系統發現/lib/modules/`uname -r`里根本沒有東西。而且以前用友善之臂的config_mini2440_t35默認配置編譯內核模塊的時候。發現友善只做了個hello_modules的內核模塊示例。在此我們不需要使用這個hello_modules,所以這兩步就略過去了。

    說明:由于最小系統里的etc配置文件沒有寫自動啟動網卡的腳本,所以我做的ramdisk開始時并不能自動啟動網卡。后來參照友善之臂的root_qtopia根文件系統里的腳本做如下修改,即可自動啟動腳本。
    修改如下:
    修改要制作的ramdisk根文件系統的rootfs下的/etc/init.d/rcS文件
    在最下邊添加如下兩行命令即可自動啟動網卡:
    /sbin/ifconfig lo 127.0.0.1
    /sbin/ifconfig eth0 192.168.31.230 netmask 255.255.255.0 up

    這個方法是通過分析友善之臂的root_qtopia根文件系統的啟動流程時發現的。
    通過分析友善之臂的root_qtopia根文件系統,我們還能發現更多的內容。在此不在詳述。
    鍛煉一下自己分析解決問題的能力吧。呵呵。

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全