• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      用SD卡定制嵌入式Linux系統(tǒng)的最小系統(tǒng)

      2017-11-09 01:11:31,,
      關(guān)鍵詞:單板內(nèi)核內(nèi)存

      ,,

      (蘇州大學(xué) 電子信息學(xué)院,蘇州 215006)

      用SD卡定制嵌入式Linux系統(tǒng)的最小系統(tǒng)

      茅勝榮,肖家文,喬東海

      (蘇州大學(xué) 電子信息學(xué)院,蘇州 215006)

      以經(jīng)典ARM應(yīng)用處理器S3C6410為例,通過移植u-boot-2013.04-rc2和linux-3.18.57,制作EXT4格式的根文件系統(tǒng),來定制基于SD卡的嵌入式Linux最小系統(tǒng),并通過Appweb服務(wù)器的移植進(jìn)一步完善了嵌入式系統(tǒng)的軟件功能。實(shí)驗(yàn)結(jié)果表明,SD卡即插即用的特性大大方便了系統(tǒng)的開發(fā)、維護(hù)與升級。

      S3C6410;嵌入式Linux;U-Boot;EXT4文件系統(tǒng);Appweb

      引 言

      在一個完整的嵌入式Linux系統(tǒng)中,F(xiàn)lash扮演著數(shù)據(jù)與代碼存儲器的角色,其中NAND類型的Flash具有容量大、成本低的優(yōu)點(diǎn),所以很多處理器內(nèi)部集成了專門的控制器來驅(qū)動NAND Flash。但是其工藝決定了它內(nèi)部容易產(chǎn)生壞塊,讀寫Flash同時需要做額外的ECC校驗(yàn),這增加了驅(qū)動移植的難度。而SD卡利用特殊的封裝工藝將NAND Flash顆粒與控制器集成在一起,對外提供高速的SDIO接口進(jìn)行讀寫控制,底層驅(qū)動程序徹底擺脫了復(fù)雜的壞塊管理工作。本文在SD卡上搭建U-Boot來引導(dǎo)Linux內(nèi)核,然后掛載位于SD卡分區(qū)上的根文件系統(tǒng),在此基礎(chǔ)上移植嵌入式web服務(wù)器Appweb。

      圖1 配置單板信息

      然后將內(nèi)核從存儲介質(zhì)讀取到內(nèi)存中運(yùn)行。本文以u-boot-2013.04-rc2為例,分析其移植的一般規(guī)律。

      1.1 基本配置

      U-Boot支持絕大多數(shù)CPU體系結(jié)構(gòu),首先在boards.cfg文件中配置單板計(jì)算機(jī)的基本信息。如圖1所示,單板名字為smdk6410,CPU架構(gòu)為arm,體系結(jié)構(gòu)為arm1176,制造商為samsung,SoC系列為s3c64xx,U-Boot編譯系統(tǒng)通過讀取這些信息來篩選需要編譯的體系結(jié)構(gòu)相關(guān)的源代碼??紤]到S3C6410和S3C6400屬于一個系列,功能基本相同,因此可以選擇U-Boot中的smdk6400作為模板,復(fù)制一份相同的源碼并重命名,這樣可以迅速搭建起一個框架。其次,位于include/configs目錄下的smdk6410.h文件中包含了所有板級的配置信息,需要根據(jù)實(shí)際單板的情況作修改,比如DRAM的大小、命令行提示符等。U-Boot編譯系統(tǒng)將單板目錄下的u-boot.lds作為默認(rèn)的鏈接腳本文件,此外在config.mk文件中指定鏈接地址的基地址CONFIG_SYS_TEXT_BASE=0x57e0 0000。代碼搬移后,u-boot.bin的代碼段將從該地址開始,其余段也會根據(jù)鏈接腳本文件確定好在內(nèi)存中的分布位置。

      如圖2所示,U-Boot將分多個階段依次完成最底層的初始化工作,最終創(chuàng)建好Linux內(nèi)核運(yùn)行所需要的環(huán)境。首先,u-boot.lds文件中的ENTRY(_start)語句指定了u-boot.bin代碼段的第一條指令位于start.S文件中的_start標(biāo)號處,程序直接跳轉(zhuǎn)到reset異常處理代碼中運(yùn)行。在low_level_init函數(shù)中,僅需對必需的外設(shè)做初始化,比如關(guān)閉看門狗、配置系統(tǒng)時鐘、初始化調(diào)試串口和內(nèi)存控制器等。

      圖2 UBoot工作流程

      圖3所示為SD卡的分區(qū)信息,單板上電后,固化在S3C6410內(nèi)部ROM中的程序會自動把位于SD卡BL1處的代碼讀取到SRAM中,BL1的主要工作是從SD卡中拷貝完整的u-boot.bin至DRAM中。實(shí)際上SRAM的大小只有8 KB,所以必須通過修改u-boot.lds文件來設(shè)置代碼搬移的程序在u-boot.bin的前8 KB中。代碼搬移的工作主要包括SD驅(qū)動器初始化、SD卡設(shè)備初始化,以及底層I/O的讀寫驅(qū)動。廠商已經(jīng)把這些功能固化在了ROM中,并且把針對SD卡的拷貝函數(shù)的指針存放在0x0C00 4008地址處,函數(shù)原型為:

      int CopyMMCtoMem(int channel, uint32_t StartBlkAddress, uint16_t blockSize, uint32_t *memoryPtr, int with_init);

      其中channel是SD控制器的通道號,StartBlkAddress是待拷貝數(shù)據(jù)在SD卡上的起始扇區(qū)號,blockSize是需要拷貝的扇區(qū)數(shù),memoryPtr是拷貝到內(nèi)存的目標(biāo)地址,with_init表示是否需要初始化。

      圖3 SD卡分區(qū)信息

      Linux內(nèi)核一般使用低端的內(nèi)存地址,為了盡可能給內(nèi)核騰出多的空間,U-Boot會再一次將當(dāng)前執(zhí)行的代碼搬移到DRAM內(nèi)存的頂部,這一過程即為重定位,通過匯編函數(shù)relocate_code來實(shí)現(xiàn)。圖4為重定位前后SRAM和DRAM內(nèi)存的劃分情況,重定位前系統(tǒng)堆棧位于SRAM中,破壞了BL1末尾的代碼,具有一定的風(fēng)險。距離DRAM內(nèi)存底部0x100處存放著Linux內(nèi)核的啟動參數(shù),U-Boot在最后階段通過do_bootm_linux函數(shù)將該地址告知內(nèi)核,以使內(nèi)核正確掛載根文件系統(tǒng)。

      S3C6410的啟動機(jī)制表明U-Boot只能燒寫在SD卡尾部的特定區(qū)域,如圖3所示,在偏移SDHC卡末尾521 KB處開始燒寫u-boot.bin的前8 KB,這一地址是強(qiáng)制要求的。除此之外的布局可以自定義,但要保證鏡像燒寫的位置與U-Boot搬移代碼時搜索的位置一致。顯然,燒寫之前必須要獲取SD卡總共的扇區(qū)數(shù),Linux下使用fdisk-l命令可以查看當(dāng)前SD卡所有的信息,然后通過簡單的字符串處理便能提取出SD卡總共的扇區(qū)數(shù),具體腳本如下:

      TOTAL_BLKCNT=`sudo fdisk-l $FLASH_MEDIA|head-n 1|awk ‘{print $7}’`

      其中FLASH_MEDIA變量代表SD卡的設(shè)備文件名,通常為/dev/sdx,x可以是a,b,c,d等。

      為了方便燒寫,需要把BL1和BL2兩個部分拼在一起制作成U-Boot刷機(jī)包,步驟如下:

      ① 創(chuàng)建空白鏡像:dd if=/dev/zero of=$LOADER bs=1K count=$LOADER_SIZE。

      ② 把鏡像文件設(shè)置為回環(huán)設(shè)備:sudo losetup /dev/loop0 $LOADER。

      ③ 拼接BL1與BL2:sudo dd if=u-boot.bin of=/dev/loop0 bs=1k seek=0和sudo dd if=u-boot.bin of=/dev/loop0 bs=1k seek=528 count=8。

      ④ 卸載回環(huán)設(shè)備:sudo losetup -d /dev/loop0。

      圖4 SRAM與DRAM的內(nèi)存劃分

      腳本中的LOADER和 LOADER_SIZE代表U-Boot刷機(jī)包的名字和大小。最后將刷機(jī)包燒寫進(jìn)SD卡設(shè)備:

      sudo dd if=$LOADER of=$FLASH_MEDIA bs=1k count=$LOADER_SIZE seek=$SEEK_OFFSET

      其中SEEK_OFFSET的值可以通過表達(dá)式`expr $TOTAL_SIZE - $LOADER_SIZE`來求得。圖5所示為最終燒寫在SD卡中的U-Boot啟動界面,因?yàn)镾D卡中還未燒寫環(huán)境變量,因此U-Boot警告bad CRC,將使用U-Boot代碼中默認(rèn)的環(huán)境變量。

      圖5 UBoot啟動界面

      2 Linux內(nèi)核移植

      U-Boot啟動后,在沒有檢測到用戶終端輸入的情況下會自動執(zhí)行環(huán)境變量bootcmd中的指令,其具體內(nèi)容定義在全局配置文件smdk6410.h中:

      #define CONFIG_BOOTCOMMAND "fatload mmc 0:2 50008000 uImage; bootm 50008000"。

      U-Boot通過fatload命令將SD卡第二個分區(qū)上的uImage文件讀取到內(nèi)存0x5000 8000處,然后程序跳轉(zhuǎn)到該地址運(yùn)行Linux內(nèi)核。本文以linux-3.18.57為例,分析內(nèi)核鏡像uImage制作的一般規(guī)律。

      2.1 基本配置

      內(nèi)核的移植非常復(fù)雜,不可能一步到位,可以先移植出一個基本能用的內(nèi)核,再逐步向其中添加新的功能,直至內(nèi)核最終能夠驅(qū)動開發(fā)板上所有設(shè)備。Linux內(nèi)核支持的使用S3C6410芯片的單板非常多,這里選擇友善之臂的MINI6410作為模板。將板級初始化文件mach-mini6410.c重命名為mach-suda6410.c,并將文件中所有的mini(MINI)修改為suda(SUDA)。將mach-suda6410.c編譯進(jìn)內(nèi)核中,需要由Kconfig和Makefile配合完成,即在Kconfig中加入config MACH_SUDA6410條目,并且在Makefile中添加編譯選項(xiàng):obj-$(CONFIG_MACH_SUDA6410) += mach-suda6410.o。這樣就能通過make menuconfig選中SUDA6410來把文件編譯到內(nèi)核中。圖6為U-Boot和內(nèi)核對機(jī)器碼的定義,一個U-Boot只能引導(dǎo)一種單板,兩者之間使用機(jī)器碼來匹配。U-Boot在do_bootm_linux函數(shù)中會將機(jī)器碼作為參數(shù)傳遞給內(nèi)核,內(nèi)核會嘗試引導(dǎo)該機(jī)器碼對應(yīng)的單板,一旦不匹配,將停止加載。

      嵌入式Linux通常需要一個完整的網(wǎng)絡(luò)環(huán)境,Linux內(nèi)核不僅具有成熟穩(wěn)定的網(wǎng)絡(luò)協(xié)議棧,還支持各種主流的網(wǎng)卡驅(qū)動。圖7為網(wǎng)卡配置界面,通常只需要在內(nèi)核配置中添加對網(wǎng)絡(luò)子系統(tǒng)的支持,并選擇實(shí)際使用的網(wǎng)卡對應(yīng)的驅(qū)動,就可以使單板具備入網(wǎng)功能。

      2.2 制作uImage

      make menuconfig結(jié)束后,會生成.config文件,保存著有關(guān)內(nèi)核的所有配置選項(xiàng),make命令將根據(jù)它來指導(dǎo)內(nèi)核編譯系統(tǒng)的工作,并最終生成zImage鏡像文件。U-Boot的bootm命令無法直接加載zImage,需要使用mkimage工具給zImage額外增加64字節(jié)的頭部信息,具體使用方法為:

      mkimage -A arm -O linux -T kernel -C none -a 50008000 -e 50008040 -n "$KERNEL_NAME"-d zImage uImage

      圖6 機(jī)器碼

      圖7 網(wǎng)卡配置選項(xiàng)

      其中-A指定CPU的體系結(jié)構(gòu),-O指定操作系統(tǒng)類型,-T指定鏡像類型,-C指定鏡像的壓縮方式,-a指定uImage在內(nèi)存中的加載地址,-e指定鏡像運(yùn)行的入口點(diǎn)地址,-n指定鏡像名字,-d指定zImage的路徑。

      2.3 燒寫uImage到SD卡

      uImage的燒寫不同于U-Boot,它是一個分區(qū)+格式化的過程,由圖3可知,uImage保存在SD卡的第二個分區(qū)上。U-Boot的fatload命令只能識別vfat格式的分區(qū),因此需要將該分區(qū)格式化成vfat,具體燒寫步驟如下:

      ① SD卡分區(qū):sudo fdisk $FLASH_MEDIA和sudo partprobe $FLASH_MEDIA。

      ② 格式化內(nèi)核分區(qū):sudo mkfs.vfat $FLASH_MEDIA$KERNEL_PART。

      ③ 掛載內(nèi)核分區(qū):sudo mount -t vfat $FLASH_MEDIA$KERNEL_PART /mnt。

      ④ 燒寫uImage:sudo cp $KERNEL_OUTPUT/uImage /mnt。

      ⑤ 卸載內(nèi)核分區(qū):sudo umount /mnt。

      3 根文件系統(tǒng)制作

      內(nèi)核啟動的最后階段會根據(jù)設(shè)置的啟動參數(shù)掛載對應(yīng)的根文件系統(tǒng),最后運(yùn)行根文件系統(tǒng)中的init用戶進(jìn)程。

      3.1 內(nèi)核啟動參數(shù)

      內(nèi)核的啟動參數(shù)保存在U-Boot的bootargs環(huán)境變量中,也可以在smdk6410.h文件中進(jìn)行設(shè)置:

      #define CONFIG_BOOTARGS "root=/dev/mmcblk0p1 rootfstype=ext4 rootwait=5 console=ttySAC0,115200 init=/linuxrc"

      其中的rootfstype參數(shù)指定根文件系統(tǒng)的類型,root參數(shù)指定根文件系統(tǒng)所掛載的物理設(shè)備,console參數(shù)指定用戶終端設(shè)備,init參數(shù)指定內(nèi)核啟動的第一個用戶進(jìn)程在根文件系統(tǒng)中的路徑。

      3.2 構(gòu)建最小根文件系統(tǒng)

      要構(gòu)建一個可用的根文件系統(tǒng),需要按照FHS(Filesystem Hierarchy Standard)的標(biāo)準(zhǔn)布局文件目錄,并且創(chuàng)建必要的二進(jìn)制文件和庫文件。Buildroot是一個簡單高效,用于定制嵌入式Linux文件系統(tǒng)的工具,底層封裝了很多busybox軟件的配置工作。如圖8所示,通過make menuconfig對Buildroot進(jìn)行配置,Target options菜單中是與體系結(jié)構(gòu)相關(guān)的配置選項(xiàng),System configuration菜單中是用戶系統(tǒng)相關(guān)的配置選項(xiàng),Toolchain菜單中是交叉編譯工具的配置選項(xiàng)。此外,還可以在Target packages中選擇常用的第三方應(yīng)用程序包。盡管Buildroot能夠生成一個完整的根文件系統(tǒng),但仍然需要微調(diào),例如,Linux系統(tǒng)的啟動需要/dev/null文件,可以通過sudo mknod/dev/null c 1 3來創(chuàng)建這個設(shè)備文件。再如為了提高mdev生成設(shè)備文件的速度,推薦以ramfs方式掛載/dev目錄,即mount-t ramfs mdev/dev。

      圖8 Buidroot配置

      3.3 燒寫根文件系統(tǒng)到SD卡

      根文件系統(tǒng)存放在SD卡的第一個分區(qū)。Linux內(nèi)核最常使用的文件系統(tǒng)是EXT4,屬于日志型文件系統(tǒng),它使用獨(dú)立的日志文件跟蹤磁盤內(nèi)容的變化,比傳統(tǒng)文件系統(tǒng)安全。燒寫EXT4格式的文件系統(tǒng)到SD的主要步驟如下:

      ① SD卡分區(qū):sudo fdisk $FLASH_MEDIA和sudo partprobe $FLASH_MEDIA。

      ② 格式化文件系統(tǒng)分區(qū):sudo mkfs.ext4 $FLASH_MEDIA$ROOTFS_PART。

      ③ 掛載文件系統(tǒng)分區(qū):sudo mount $FLASH_MEDIA$ROOTFS_PART /mnt。

      ④ 燒寫文件系統(tǒng):sudo tar-vxf $ROOTFS_OUTPUT/rootfs.tar-C/mnt。

      ⑤ 卸載文件系統(tǒng)分區(qū):sudo umount/mnt。

      圖9展示了Linux內(nèi)核與文件系統(tǒng)的運(yùn)行結(jié)果,通過命令uname -a可以查看到當(dāng)前內(nèi)核的版本和名字。

      圖9 Linux內(nèi)核與文件系統(tǒng)的運(yùn)行結(jié)果

      4 Appweb移植

      在某些應(yīng)用場合下,Buildroot無法提供所有需要的第三方軟件包,這就需要從源代碼編譯安裝到文件系統(tǒng)中。本文以開源的嵌入式web服務(wù)器Appweb為例,分析移植第三方庫的一般規(guī)律。Appweb針對嵌入式設(shè)備進(jìn)行高度優(yōu)化,能夠提供高能效、高吞吐率的動態(tài)網(wǎng)頁應(yīng)用。Appweb的編譯安裝需要使用MakeMe工具,這是一種擴(kuò)展了Makefile的項(xiàng)目管理與編譯自動化技術(shù)。Appweb移植的具體步驟如下:

      ① 配置源碼:./configure--show--nolocal--release--platform linux-arm-release。

      ② 編譯源碼:me--overwrite。

      ③ 安裝與發(fā)布:me--deploy deploy2ARM。

      最后把deploy2ARM中的所有內(nèi)容拷貝到文件系統(tǒng)相應(yīng)的目錄中,便完成了Appweb的移植工作。在單板的用戶終端輸入命令appweb --config appweb.conf啟動

      圖10 Web服務(wù)器運(yùn)行結(jié)果

      服務(wù)器,其中appweb.conf是針對該服務(wù)器的配置文件,可以指定服務(wù)器監(jiān)聽的端口號,網(wǎng)頁內(nèi)容的根目錄等。圖10所示是通過瀏覽器訪問該服務(wù)器返回的頁面,該網(wǎng)頁僅僅測試了Web服務(wù)器的最小功能。

      結(jié) 語

      [1] 楊鑄,李奎.構(gòu)建嵌入式Linux核心軟件系統(tǒng)實(shí)戰(zhàn)[M].北京:北京航空航天大學(xué)出版社,2013.

      [2] 朱兆琪,李強(qiáng).嵌入式Linux開發(fā)實(shí)用教程[M].北京:人民郵電出版社,2014.

      [3] 范展源,劉韜.深度實(shí)踐嵌入式Linux系統(tǒng)移植[M].北京:機(jī)械工業(yè)出版社,2015.

      [4] 周立功.嵌入式Linux開發(fā)教程[M].北京:北京航空航天大學(xué)出版社,2016.

      [5] Embedthis Software.APPWEB DOCS [EB/OL].[2017-06].https://embedthis.com/appweb/doc/.

      茅勝榮、肖家文(在校研究生),研究方向?yàn)榍度胧较到y(tǒng)設(shè)計(jì)、信號處理;喬東海(教授),研究方向?yàn)樾盘柼幚?、MEMS器件設(shè)計(jì)。

      [5] WANG Nan,MENG Qingfeng,ZHENG Bin.Data compression and coding algorithm used in wireless transmission of vibration signal[J].Journal of Vibration,Measurement &Diagnosis,2013,33(2):236-241.

      [6] Kutyniok G.Compressed Sensing:Theory and Applications[J].Corr,2012,52(4):1289-1306.

      [7] 楊真真.壓縮感知重構(gòu)技術(shù)及其在圖像融合中的應(yīng)用研究[D].南京:南京郵電大學(xué),2014.

      [8] 方亮.基于壓縮感知的無線傳感器網(wǎng)絡(luò)數(shù)據(jù)壓縮算法研究[D].長沙:湖南大學(xué),2011.

      [9] 王小雪.基于無線傳感器網(wǎng)絡(luò)的無源被動式目標(biāo)定位研究[D].杭州:浙江工業(yè)大學(xué),2013.

      [10] 陳劍美.壓縮感知算法的改進(jìn)及其在無線傳感網(wǎng)絡(luò)中的應(yīng)用[D].秦皇島:燕山大學(xué),2016.

      邵云峰,主要研究方向?yàn)闊o線傳感器網(wǎng)絡(luò)。

      EmbeddedLinuxMinimalSystemCustomizedwithSD

      MaoShengrong,XiaoJiawen,QiaoDonghai

      (Department of Electronic Information,Soochow University,Suzhou 215006,China)

      In the paper,taking the classic ARM processor S3C6410 for example,The customize embedded Linux minimal system based on the SD card is introduced by porting u-boot-2013.04-rc2 and linux-3.18.57,and the root file system formatted in EXT4 is built.The embedded web server called Appweb makes the system more powerful in software.The experiment results show that the plug-and-play feature of SD card greatly facilitates the development,maintenance and upgrading.

      S3C6410;embedded Linux;U-Boot;EXT4 file system;Appweb

      TP368.2

      A

      2017-06-30)

      (責(zé)任編輯:薛士然 收稿日期:2017-06-15)

      猜你喜歡
      單板內(nèi)核內(nèi)存
      攝影作品
      攝影作品
      萬物皆可IP的時代,我們當(dāng)夯實(shí)的IP內(nèi)核是什么?
      強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
      單板U型場地滑雪關(guān)鍵技術(shù)動作及訓(xùn)練方法
      “春夏秋冬”的內(nèi)存
      基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計(jì)
      Linux內(nèi)核mmap保護(hù)機(jī)制研究
      單板層積材帶來的內(nèi)部生產(chǎn)模式
      基于內(nèi)存的地理信息訪問技術(shù)
      左云县| 萨迦县| 阜新| 保康县| 盈江县| 商水县| 凉山| 体育| 周宁县| 栾城县| 聊城市| 横峰县| 凤城市| 白朗县| 黄梅县| 得荣县| 洛隆县| 广汉市| 吉木萨尔县| 光泽县| 磐石市| 精河县| 曲水县| 黑山县| 搜索| 富锦市| 岳西县| 怀宁县| 中江县| 泽库县| 巴马| 夏河县| 富民县| 沙坪坝区| 颍上县| 马关县| 农安县| 阜康市| 虎林市| 敖汉旗| 深圳市|