• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 構造嵌入式Linux

    構造嵌入式Linux

    作者: 時間:2012-05-14 來源:網絡 收藏

    自身具備一整套工具鏈,容易自行建立系統的開發環境和交叉運行環境,并且可以跨越系統開發中的仿真工具(ICE)的障礙。內核的完全開放使人們可以自己設計和開發出真正的硬實時系統,軟實時系統在中也容易得到實現。強大的網絡支持使得可以利用的網絡協議棧將其開發成為的TCP/IP網絡協議棧。

    本文引用地址:http://www.czjhyjcfj.com/article/149072.htm

    Linux提供了完成嵌入功能的基本內核和所需要的所有用戶界面,它是多面的。它能處理嵌入式任務和用戶界面。

    一個小型的嵌入式Linux系統只需要下面三個基本元素:

    *引導工具

    *Linux微內核,由內存管理、進程管理和事務處理構成

    *初始化進程

    如果要讓它能干點什么且繼續保持小型化,還得加上:

    *硬件驅動程序

    *提供所需功能的一個或更多應用程序。

    再增加功能,或許需要這些:

    *一個文件系統(也許在ROM或RAM)中

    *TCP/IP網絡堆棧

    下面我們就從精簡內核、系統啟動、驅動程序將、X-Window換成MicroWindows四個步驟介紹嵌入式Linux的實際開發。

    精簡內核

    內核的常用命令包括:makeconfig、dep、clean、mrproper、zImage、bzImage、modules、modules_install。命令說明略。

    現在舉個例子說明一下:

    我使用的是Mandrake內附的2.2.15。我沒有修改任何一行程序碼,完全只靠修改組態檔得到這些數據。

    首先,使用makeconfig把所有可以拿掉的選項都拿得。

    不要floppy;不要SMP、MTRR;不要Networking、SCSI;把所有的blockdevice移除,只留下oldIDEdevice;把所有的characterdevice移除;把所有的filesystem移除,只留下minix;不要sound支援。相信我,我己經把所有的選項都移除了。這樣做之后,我的到了一個188K的核心。

    還不夠小嗎?OK,再加上一招,請把下列兩個檔案中的-O3,-O2用-Os取代。

    ./Makefile

    ./arch/i386/kernel/

    Makefile

    這樣一來,整個核心變小了9K,成為179K。

    不過這個核心恐怕很難發揮Linux的功能,因此我決定把網絡加回去。把General中的networksupport加回去,重新編譯,核心變成189K。10K就加上個TCP/IPstack,似乎是很上算的生意。

    有stack沒有driver也是枉然,所以我把embeddedboard常用的RTL8139的driver加回去,195K。

    如果你需要DOS檔案系統,那大小成為213K。如果minix用ext2換代,則大小成長至222K。

    Linux所需的內存大約在600K~800K之間。1MB內存就可能可以開機了,但不太有用,因為連載入C程序庫都有困難。2MB內存應該就可以做點事了,但要到4MB以上才可以執行一個比較完整的系統。

    因為Linux的filesystem相當大,大約在230K左右,占了1/3的體積。內存管理占了80K,和核心其它部分的總和差不多。TCP/IPstack占了65K,驅動程序占了120K。SysVIPC占了21K,必要的話可以拿掉,核心檔應該可以再小個10K左右。

    如果要裁剪核心大小,應該動那里呢?答案很明顯,當然是文件系統。Linux的VFS簡化了檔案系統的設計,buffercache,directorycache增加了系統的效率。但這些embedded系統根本就用處不大。如果可以把它們拿掉,核心可以馬上縮小20K左右。如果跳過整個VFS,直接將文件系統寫成一個driver的型式,應該可以將230K縮減至50K左右。整個核心縮到100K左右。

    系統啟動

    系統的啟動順序及相關文件仍在核心源碼目錄下,看以下幾個文件:

    ./arch/$ARCH/boot/

    bootsect.s

    ./arch/$ARCH/boot/setup.s

    ./init/main.c

    bootsect.S及setup.S

    這個程序是Linuxkernel的第一個程序,包括了Linux自己的bootstrap程序,但是在說明這個程序前,必須先說明一般IBMPC開機時的動作(此處的開機是指“打開PC的電源”)。

    一般PC在電源一開時,是由內存中地址FFFF:0000開始執行(這個地址一定在ROMBIOS中,ROMBIOS一般是在FEOOOh到FFFFFh中),而此處的內容則是一個jump指令,jump到另一個位于ROMBIOS中的位置,開始執行一系列的動作。

    緊接著系統測試碼之后,控制權會轉移給ROM中的啟動程序(ROMbootstraproutine)。這個程序會將磁盤上的第零軌第零扇區讀入內存中,至于讀到內存的哪里呢?--絕對位置07C0:0000(即07C00h處),這是IBM系列PC的特性。而位于Linux開機磁盤的bootsector上的,正是Linux的bootsect程序。

    把大家所熟知的MSDOS與Linux的開機部分做個粗淺的比較。MSDOS由位于磁盤上bootsector的boot程序負責把IO.SYS載入內存中,而IO.SYS則負有把DOS的kernel--MSDOS.SYS載入內存的重任。而Linux則是由位于bootsector的bootsect程序負責把setup及Linux的kernel載入內存中,再將控制權交給setup。

    驅動程序

    在Linux系統里,設備驅動程序所提供的這組入口點由一個結構來向系統進行說明。

    設備驅動程序所提供的入口點,在設備驅動程序初始化的時候向系統進行登記,以便系統在適當的時候調用。Linux系統里,通過調用register_chrdev向系統注冊字符型設備驅動程序。

    在Linux里,除了直接修改系統核心的源代碼,把設備驅動程序加進核心里以外,還可以把設備驅動程序作為可加載的模塊,由系統管理員動態地加載它,使之成為核心的一部分。也可以由系統管理員把已加載的模塊動態地卸載下來。Linux中,模塊可以用C語言編寫,用gcc編譯成目標文件(不進行鏈接,作為*.o文件存在)。為此需要在gcc命令行里加上-c的參數。在成功地向系統注冊了設備驅動程序后(調用register_chrdev成功后),就可以用mknod命令來把設備映射為一個特別文件。其它程序使用這個設備的時候,只要對此特別文件進行操作就行了。

    將X-Window換成MicroWindows

    MicroWindows是使用分層結構的設計方法。允許改變不同的層來適應實際的應用。在最底一層,提供了屏幕、鼠標/觸摸屏和鍵盤的驅動,使程序能訪問實際的硬件設備和其它用戶定制設備。在中間一層,有一個輕巧的圖形引擎,提供了繪制線條、區域填充、繪制多邊形、裁剪和使用顏色模式的方法。在最上一層,提供了不同的API給圖形應用程序使用。這些API可以提供或不提供桌面和窗口外形。目前,MicroWindows支持WindowsWin32/WinCEGDI和Nano-XAPI。這些API提供了Win32和X窗口系統的緊密兼容性,使得別的應用程序可以很容易就能移植到MicroWindows上。

    linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

    p2p機相關文章:p2p原理



    上一頁 1 2 下一頁

    關鍵詞: Linux 嵌入式 構造

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 南城县| 伊宁县| 惠安县| 丹寨县| 南安市| 陆丰市| 余庆县| 突泉县| 石渠县| 观塘区| 龙泉市| 滕州市| 临江市| 临桂县| 西华县| 逊克县| 任丘市| 鹿泉市| 香格里拉县| 夏河县| 大邑县| 阿克苏市| 基隆市| 武宁县| 喜德县| 灌阳县| 鸡泽县| 新营市| 伊吾县| 宁津县| 如东县| 元氏县| 化隆| 西峡县| 吉林省| 重庆市| 陆川县| 绵阳市| 斗六市| 宁海县| 长汀县|