久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

應用Scratchbox構建基于CF卡的嵌入式linux系統

時間:2019-05-12 13:10:11下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《應用Scratchbox構建基于CF卡的嵌入式linux系統》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《應用Scratchbox構建基于CF卡的嵌入式linux系統》。

第一篇:應用Scratchbox構建基于CF卡的嵌入式linux系統

應用Scratchbox構建基于CF卡的嵌入式Linux系統

石濤 師衛

(太原理工大學信息工程學院 山西省 太原市 030024)

摘要: 本文介紹了一種應用Scratchbox構建Linux操作系統的新方法,詳細論述了應用Scratchbox和Busybox等開源軟件在CF卡上構建一個嵌入式Linux操作系統的全過程。關鍵詞:Busybox; Scratchbox ;CF ;嵌入式Linux操作系統 中圖法分類號:TP399文獻標識碼:A

Construction of embeded Linux on CF card using Scratchbox

SHI Tao, SHI Wei

(Department of Information Engineering,Taiyuan University of Technology,Shanxi Taiyuan,030024)

Abstract:This paper introduces a new method of building embedded Linux using Scratchbox.It also describes the whole process in detail of building a embedded Linux on CF card using Scratchbox and Busybox etc, open source software.Key Words:Busybox;Scratchbox;CF;embedded Linux

面的4項內容,分別來構建Linux根文件系統,這樣不僅增加了開發的時間和成本,而且增加了開發的難度,很難成功。在長期的摸索和實踐中,我們發現了一種新的開源軟件Scratchbox,利用他來構建嵌入式Linux系統可以達到事半功倍的效果。

Scratchbox是一個交叉編譯的工具組,可以簡化嵌入式Linux應用開發。Scratchbox提供了一組工具,用這組工具我們可以構建一個完整的Linux交叉編譯環境。用Scratchbox來構建嵌入式Linux系統具有以下優點:

1)運行與chroot的環境中,完全獨立于主機,編譯2)可以很容易的變換目標系統中的工具鏈。3)根據Linux系統的目標運行環境對chroot后的系過程將與主機系統無關。

引言

Linux由于其內核的可裁剪性,而受到嵌入式市場應用領域的青睞。在某些領域,Linux實際上已經處于領導地位,成為最流行的嵌入式操作系統之一。然而,我們在應用嵌入式Linux操作系統時,都面臨著如何快速方便的構建一個特定的嵌入式環境的問題。本文在這里探索了一種新的方法,利用Scratchbox、Busybox等開源軟件實現基于CF卡的嵌入式linux系統的構建。

統進行定制,這樣就可以進行交叉編譯,使軟件誤認為是在1、嵌入式Linux系統構建方法介紹

嵌入式Linux系統包含引導程序、內核和文件系統3

目標平臺上進行編譯。

4)可以自動創建Linux的根文件系統所需的目錄結構。基于Scratchbox以上幾個優點,我們完全可以在自己

部分。對于嵌入式Linux系統來說,這三個部分是必不可少的。在這3個部分中,構建Linux的根文件系統是最困難的。在這里主要介紹一些構建Linux根文件系統的方法。

Linux的根文件系統具有非常獨特的特點,就其基本組成來說,Linux的根文件系統應該包括支持Linux系統正常運行的基本內容,包含著系統使用的軟件和庫,以及所有用來為用戶提供支持架構和用戶使用的應用軟件。因此,至少應該包括以下幾項內容。

1)基本的文件系統結構,包含一些必需的目錄:2)基本程序運行所需的庫函數,如Glibc/uC-libc。3)基本的系統配置文件,比如rc,inittab等腳本文/dev,/proc,/bin,/etc,/sbin,/usr,/lib,/tmp等。的主機系統中用Scratchbox構建一個基于目標平臺的虛擬系統,chroot進這個系統之后,對工具鏈和函數庫進行定制編譯。然后將Scratchbox創建好的根文件系統拷貝到目標平臺上即可。

2、構建嵌入式Linux系統

2.1 Linux操作系統裁剪

由于CF卡的容量大小有限,我們在CF卡上構建Linux

操作系統時,需要對Linux內核進行裁剪。要得到一個精簡的Linux操作系統,大致有二個步驟:編譯裁剪內核,形成精簡的內核映像;構建根文件系統,形成可以運行的新系統。

件。

4)基本的應用程序,如sh,ls,cp,mv等。

傳統的構建Linux根文件系統方法,通常都是按照上

2.2.1 編譯Linux內核

Linux內核裁剪主要是根據系統所需要的功能,縮減掉不需要的模塊和組件,重新編譯內核。Linux內核由專門的機構維護,我們可以從

Linux

官方網站

(http:// 通信地址:太原理工大學北區3241信箱 郵編:030024

聯系電話:0351-6011570,***師衛 男

太原理工大學信息工程學院,電路與系統 碩士導師,主要研究方向嵌入式系統應用

第二篇:構建嵌入式linux系統

構建嵌入式linux系統

(MP3播放器)

功能要求:

(1)系統(bootloader,kernel,rootfs)燒寫在板子中;

(2)打開電源開關,系統自動啟動,啟動最后進入到一個GUI界面(MP3播放器)。

(3)用戶可以操作該界面,播放歌曲。

具體要求:

(1)自定義的bootloader添加內核啟動功能;或者修改u-boot的go命令使之能夠啟動zImage。

(2)根文件系統制作時,移植Qt庫。

(3)sqlite3的移植

(4)madplay移植

./configure--help

--host=arm-linux

第三篇:基于CF卡的 linux系統制作

在CF卡上安裝嵌入式linux全過程

吳剛 2007-4-4 摘要:本文主要介紹在一塊128M的CF卡上定制安裝linux操作系統,并在此基礎上建立一個簡單的應用平臺。

關鍵詞:extlinux,busybox, CF卡,嵌入式linux

隨著信息技術和網絡技術的高速發展,嵌入式技術的廣泛應用,嵌入式系統已經打破傳統PC工業的壟斷地位,成為非PC設備的主體。而作為嵌入式系統,應用環境通常比較惡劣,而應用又比較簡單,為保證系統的穩定性和便攜性通常使用DOM卡或CF卡一類的存儲設備來代替硬盤。

經過一段時間的摸索和收集資料終于在一塊CF卡上實踐安裝了一個滿足特定需要的嵌入式linux系統,這里取名為cflinux.在這里首先要感謝《babylinux制作全過程的》作者,正是這片文章,為我制作cflinux指明了道路。本文將講述在一張容量為128M的CF卡上定制安裝嵌入式linux操作系統的詳細過程,一 主機和目標機情況簡介

主機:

Linux:Red Hat 9.0 Kernel: 2.4.20 目標機:

基于X86的工控板

二 cflinux簡介

cflinux是一運行于CF卡上的經過自定義剪裁的嵌入式linux操作系統。因其運行于CF卡上,故取名為cflinux.當此操作系統和應用環境搭建好后可以通過網絡telnet和串口訪問目標板,可運行QT/E圖形界面應用程序。可以通過串口,網口和USB口和外圍設備交互。既可作為嵌入式操作系統,也可作為啟動盤作為系統維護工具。

三 linux得引導過程簡介

在系統啟動時,主板上的BIOS會讀取硬盤的主引導記錄(MBR),MBR中存放的是一段很小的程序,他的功能是從硬盤讀取操作系統核心文件并運行,因為這個程序太小了,因此通常這個小程序不具備直接引導系統內核的能力,他先區引導另一個稍微大一點的小程序去引導系統內核。在linux系統中這樣得小程序有LILO,GRUB和SYSLINUX等。我們在這個項目中這里用到的引導程序是SYSLINUX得一個分支:EXTLINUX。

Linux系統內核被引導程序裝進內存并運行后,linux內核會檢測系統中得各種硬件,并做好硬件得初始化工作,使他們在系統正式運行后能正常工作。剩下就是linux內核要做得最后一個工作:運行/sbin下得init程序。Init是英文單詞(initialization)初始化得簡稱,init程序得工作是讀取/etc/inittab文件中的指令,對系統的各種軟硬件環境做最初的初始化工作,最后運行gettty活mingetty等待用戶輸入用戶名和密碼(當然根據需要也可以跳過登錄這個步驟,直接以root身份登錄)。所有的工作就是這么簡單。明白了這個道理,你也可以寫一些腳本程序讓他在系統啟動時的特定時間完成運行,完成你指定的任務。/sbin/init程序只是系統默認的運行的第一個程序,他可以是一個二進制程序也可以是一段bash腳本,一個指向另一個程序的鏈接。他的位置也并不一定在/sbin下,只要啟動內核時加上init參數節能被運行,開始時給內核加上init=/bin/sh參數,內核就能直接運行時并給出提示符,不需要登陸。

四 extlinux安裝

EXTLINUX是SYSLINUX的一個新的派生。可以從linux系統的ext2和ext3文件系統啟動。EXTLINUX使用和SYSLINUX相似,只需做一點改動即可。首先從http://www.tmdps.cn/pub/linux/utils/boot/syslinux/ 上下載syslinux-3.20.tar.gz。

cp syslinux-3.20.tar.gz /usr/tmp tar xzvf syslinux-3.20.tar.gz 進行解壓。然后用IDE to CF轉接卡把CF卡連到主機上(注意:一般CF卡是不支持熱插拔的,故插上CF后一般需要重新啟動主機系統)。我的CF卡對應的設備文件是hdd1.在這里先使用fdisk工具把CF卡分成兩個區,一個用于存放內核和randisk,另一個用于存放應用程序及相關文件。Fdisk的使用可參見相關資料,這里不做詳細說明。我的CF卡主分區為hdd1,擴展分區為hdd2,將所有的擴展分區都分給邏輯分區hdd5。分好區后,將hdd1 和 hdd5格式化為ext2系統 mke2fs –m 0 /dev/hdd1 mke2fs –m 0 /dev/hdd5 //-m 0參數的作用是告訴系統不為root保留空間 一切準備好后,就可以安裝EXTKINUX了,安裝步驟如下: mount –t auto /dev/hdd1 /mnt cd /usr/tmp/syslinux-3.20/extlinux./extlinux –i /mnt

安裝成功后會提示extlinux 成功安裝到/mnt,然后在/mnt目錄下會出現extlinux.sys文件。

umount /mnt 至此extlinux已經安裝完畢,可以把CF卡插到工控板上,上電啟動一下看看有什么效果。如果安裝成功的話,啟動后會出現如下的提示:

EXTLINUX 3.20 2006-08-06 EBIOS Copyright(c)1994-2005 H.peter Anvin Could not finf kernel image:linux boot: 注:關于extlinux的詳細使用方法,請參閱syslinux-3.20目錄下的extlinux.doc文件

五 linux內核編譯

在內核編譯前,我們首先要明確你需要內核支持什么樣的硬件,支持多少種分區類型和文件系統,支持那些網卡,支持那些網絡協議等等。雖然現在有128兆的空間,但也不能什么都要,夠用就行啊。好了,現在開始內核的編譯工作。首先準備好內核代碼,可以到官方網站上下載,我的內核源碼是安裝linux時帶上的,在/usr/src/linux-2.4/目錄下。cd /usr/src/linux-2.4 make mrproper 清理源碼樹 make menuconfig 然后對各項取舍如下:(至于具體配置項的意義,請參考相關資料,不在本文討論范圍之內)

code maturity level options 先不選,當我們配置好常規的東西,要加入framebuffer支持時再將這一項選上。因為在2.4.20版本中,對frambuffer的支持尚屬于試驗性代碼,如果不選擇此項將不能配置frambuffer.Load module support 取消選擇此項,為了簡化系統的制作,這個項目中將不選擇可加載內核模塊的支持。

Processer type and features Processor family中選擇你需要的cpu類型,如果你想讓老至386,新到p4的CPU都能運行cflinux的話,請選擇386,否則根據實際情況來選擇。建議選386。

General setup Networking support 都選上

PCI支持 選上,除非你不用PCI設備,不過一般人都要的,因為大部分的網卡都是PCI的。

System V ipc 選上 Systrl support選上

Kernel support for ELF 選上

其他內容如果沒什么特殊需要,都不選。

Memory technology devices(MTD)不選

Parallel port support 由于本項目中需要使用并口打印機,故將此項選上

Plug and play configuration 不選

Block devices Normal floppy disk support 不選

Loopback device support RAM disk support Initial RAM disk(initrd)support Per partion statics in /proc/partions

以上幾項都選上。由于這幾項比較重要這里做詳細說明。Loopback device 即回環設備,我們平時用的命令瓜子ramdisk或光盤鏡像時都用到回環設備。如:mount –o loop ramdisk.img /mnt RAM disk support 即內存磁盤(比較貼切的說法是虛擬磁盤,即撥出一部分內存當磁盤用)。本項目中將所有系統的的文件都做成ramdisk,所以在運行時你在根文件系統上所作的操作都是在內存中完成的,但形式上和在真正的磁盤上運行一樣。只不過放在RAM disk上的所有內容會在系統關閉后全部消失。

不僅在運行cflinux時用到ramdisk,我們在制作根文件系統時也用到ramdisk。學習ramdisk的使用也是制作cflinux的重要目標之一。在linux中還支持另外一種虛擬磁盤:shm.(shared memory),這種要虛擬磁盤機制比ramdisk更加先進。Ramdisk的大小是固定的,由編譯內核時的default ram disk size決定,默認為4096K,因為本項目中要往ramdisk中放很多東西,故這里我們要將其改為8192K(8M)。也可以在內核加載錢加上ramdisk_size=參數來決定他的大小,但系統一啟動,ramdisk的大小是不能改變的,而shm的大小卻是動態改變的。默認情況下為物理內存的一半,當系統需要更多內存的時候,他就自動縮小。系統內存富余時,他又會自動增大,這樣可以充分靈活的利用內存空間,shm通常作為磁盤的高速緩存,放在系統運行中的臨時文件等。既然shm這么好,為什么這里還使用ramdisk呢,因為ramdisk可以很方便的在系統啟動時加載,而shm則沒那么容易。Initial RAM disk(initrd)support 即初始化ramdisk支持,這個選項讓內核有能力在內核加載階段就能裝入RAMDISK,并運行其中的內容。否則只能在系統運行階段用ramdisk,我們平時編譯了一個內核后,如果你的根文件系統用的是ext3,而你沒有把ext編譯進內核,而作為一個模塊編譯了,那么就需要用mkinitrd命令做一個initrd,這個ramdisk里放了ext3的模塊,這樣內核在加載根文件系統前就能正確識別ext3系統,否則內核加載的最后一步就會出現kernel panic cant not find init?..的錯誤。

Per partion statics in /proc/partions 這個選項不是必須的,但是不把這個選項編譯進內核在執行fdisk指令時就會提示找不到/proc/partions,另外還可能出現不能以簡寫的掛載命令來掛載文件系統。所以我把該選項也編譯進內核。

Multi-device support(RAID and LVM)不選 Cryptography support(CryptoAPI)不選

Networking options 在這一大項中需要把下列項目編譯進內核: Packet socket:mmapped IO TCP/IP networking 對于IP:advanced router 這項,如果你想重點把cflinux用做靜態路由軟件,那么把這項編譯進去。另外unix domain sockets 這項也不必選擇,只有運行X的情況下才需要這項。

Telephony support 不選

ATA/IDE/MFM/RLL support 選上,然后在下面的“IDE,ATA and ATAPI Block Devices”按鈕就被激活,下面幾項選上,其余都不用選

Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support Include IDE/ATA-2 DISK support Auto-Geometry Resizing support Include IDE/ATA CDROM support

SCSI support 因為這個項目中是通過CF卡啟動的,所以把這項也選上。在這個大項中只需選擇一下3項即可: SCSI disk support SCSI generic support SCSI tape support

Fusion MPT device support 不選 IEEE1394(FireWrite)support 不選

I2O device support 選上,子項全部選上 Network device support 選上,這樣就可以支持網卡了,其余都選擇N.然后點Ethernet(10 or 100 Mbit)按鈕選擇你 需要的網卡驅動,你可以把最常見的幾種Reltek8139,NE2000,3COM等網卡編譯進內核.雖然網卡的驅動通常都很小

如果你發現你需要的網卡是灰色的,不能點,那么先確定他上一級的選項已經點了,比如你想選NE2000的網卡,就必需先選擇ELSA,VLB,PCI and on board controllers.如果還不能點,那么請確定是否已經把PCI的支持選項選上了,(在Geneal setup)里.沒有PCI的支持,PCI的網卡將不能選.Amateur Radio support 不選 IrDA(infrared)support 不選 ISDN subsystem 不選

Old CD-ROM drivers(not SCSI,not IDE)不選

Import core support 因為本項目中要使用到鍵盤和鼠標,所以選上該項,其子項也全部選中。然后把Horizontal screen resoulution 改為 800,vertial scrren resoulution 改為600。

Character devices 這一項和block devices一樣重要,這里將作重點講述。

如果要在終端上顯示系統信息就必須將virtual terminal 和support for console on virtual terminal 選上。因為本項目中防治系統信息覆蓋掉QT的圖形界面,所以沒選這兩項。

接下來就是對串口的指出。因為本項目中需要通過串口和并口與設備交互,故下面幾項都要選上:

Standard(gtneric18250/16550 and compatible UARTs)serial support Support for console serial port Extended dumb serial driver options Support special multport boards Non-standard serial port support

Unix98 PTY support(telnetd 服務用到)Parallel printer support Support for console on line printer Support for user-space parallel device drivers

哈哈,下面的文件系統可是個重頭戲哦,配置完這一項,整個內核配置也基本急速了。選上下面幾個常用的文件系統選項: Kernel auto mounter support Kernel automounter version 4 support DOS FAT fs support MSDOS fs support UMSDOS:unix-like file system on top of standard MSDOS VFAT fs support EFS file system support /proc file system support 少了他很多軟件和命令都不能運行 /dev/pts file system for unix98 PTYs telnetd服務用到 ROM file system support Second extended fs support cflinux的基本文件系統

最后是console drivers 這是linux在字符模式下高分辨率顯示的內核模塊,前面三個子項都選上。

Frame-buffer support 按鈕是灰色的不能選,別急,回到第一個大項,選上他,然后在Frame-buffer support的子項中選上 Support for framebuffer devices VESA VGA granphics console 你也可以選擇其他的顯卡驅動,比如nVida的,但是VESA和VGA是通用性最好的,只要不是幾十年前的黑白卡,都兼容VESA和VGA。Support only 8 pixels wide fonts 這個一定要選,否則當你給內核傳遞vga=768參數,讓linux在字符界面下高分辨率顯示的時候,系統會因為找不到合適的字體而返回低分辨率模式。

好了,所有的內核配置到這里就全部結速了,剩下的幾個大項全部不用選。保存退出。make dep make baImage 編譯好的內核放在:/usr/src/linux-2.4.20-8/arch/i386/boot目錄下 將其拷貝到CF卡的主分區上: mount /dev/hdd1 /mnt cp /usr/src/linux-2.4.20-8/arch/i386/boot/bzImage /mnt

到此為止我們已經安裝好了extlinux和內核編譯,現在就可以試試剛編譯的內核是否能啟動了。不過首先要在bzImage所在的目錄建立extlinux.conf配置文件,告訴extlinux在哪里尋找內核和ramdisk。extlinux.conf的格式如下: default emblinux display logo.txt label emblinux kernel bzImage append root=/dev/hdc1 initrd=ramdisk.img ide=nodma vga=0x0314 保存即可。注:在工控板上cf卡對應的設備是hdc所以這里用root=/dev/hdc1 指明根文件系統所在 initrd=ramdisk.img 指明ramdisk名稱。

ide=nodma 告訴內核不使用DMA控制器,這是針對CF卡的一個選項。vga=0x0314 指明分辨率為800×600

執行 umount /mnt 卸載CF卡,然后將CF卡插到工控板上上電啟動,看看是不是能看到系統內核啟動信息了啊。

六 編譯busybox 1 busybox簡介

Busybox是一個集成一百多個最長用的linux命令和工具的軟件,他甚至還集成了http服務器、dhcp服務器和telnet服務器,而所有這些功能卻只有1M左右的大小。我們平時用的那些linux命令就好比分離的電子元件,而busybox就好比是一個集成電路,把常用的工具和命令集成壓縮在一個可執行的文件里,功能基本不變,而大小卻小很多倍,在嵌入式式linux中使用非常廣泛。現在最新的busybox版本是1.5.0可以從busybox的官方網站上下載得到:http://www.tmdps.cn> # # Note: BusyBox init doesn't support runlevels.The runlevels field is # completely ignored by BusyBox init.If you want runlevels, use # sysvinit.# # Format for each entry: :::

# # id == tty to run on, or empty for /dev/console # runlevels == ignored # action == one of sysinit, respawn, askfirst, wait, and once # process == program to run

# Startup the system null::sysinit:/bin/mount-o remount,rw / null::sysinit:/bin/mount-t proc proc /proc null::sysinit:/bin/mount-a >> /etc/mtab null::sysinit:/bin/hostname-F /etc/hostname null::sysinit:/sbin/ifconfig lo 127.0.0.1 up null::sysinit:/sbin/ifconfig-a eth0 null::sysinit:/sbin/ifconfig eth0 192.168.4.44 netmask 255.255.255.192 null::sysinit:/sbin/route add-net 127.0.0.0 netmask 255.0.0.0 lo null::sysinit:/sbin/route add-net 192.168.4.0 netmask 255.255.255.255 eth0

# now run any rc scripts ::sysinit:/etc/init.d/rcS

# Set up a couple of getty's # 使用login登陸管理

tty1::respawn:/sbin/getty 38400 tty1 #不需要登陸直接進入控制臺,進行操作 #tty1::respawn:/bin/sh

tty2::askfirst:/bin/sh

# Put a getty on the serial port #ttyS0::respawn:/sbin/getty-L ttyS0 115200 vt100

# Stuff to do for the 3-finger salute ::ctrlaltdel:/sbin/reboot ::restart:/sbin/init

# Stuff to do before rebooting null::shutdown:/bin/umount-a –r

passwd: root:x:0:0:root:/root:/bin/sh cf:x:1001:0:Linux User,,:/home/soullon:/bin/sh shadow: root::10933:0:99999:7::: cf::13604:0:99999:7::: 注意:這里兩個用戶都沒設密碼,如果要加密碼胡話在用戶名后的第一個“:”和第二個“:”之間加上密碼胡hash值。如:

root:$1$NuFDgiiI$664QR8N4HSdgkUDKpxEB00:10933:0:99999:7:::

shadow-:

root::10933:0:99999:7::: cf::13604:0:99999:7:::

resolv.conf -> /tmp/resolv.conf

fstab: /dev/hdc1 / ext2 defaults 1 1 /dev/hdc1 / ext2 defaults 1 1 none /proc proc defaults 0 0 usbdevfs /proc/bus/usb usbdevfs rw 0 0 none /dev/pts devpts rw,gid=5,mode=620 0 0 none /tmp tmpfs defaults 0 0 /dev/hdc5 /myapp ext2 defaults 0 0

init.d(目錄): rcS: #start inetd and telnetd /sbin/telnetd-p 23

#run myapp export QTDIR=/yysg export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/myapp/lib:/usr/lib cd /myapp./myapp –qws issue: Welcome to CFLinux

profile : # ~/.bashrc: executed by bash(1)for non-login interactive shells.export PATH= /bin: /sbin: /usr/bin: /usr/sbin: /usr/bin/X11: /usr/local/bin

# If running interactively, then: if [ “$PS1” ];then

if [ “$BASH” ];then

export PS1=“[u@h W]$ ”

alias ll='/bin/ls--color=tty-laFh'

n/ls--color=tty-F' export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.png=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:';else if [ “`id-u`”-eq 0 ];then

export PS1='# ' else

export PS1='$ ' fi fi

export USER=`id-un` export LOGNAME=$USER export HOSTNAME=`/bin/hostname` export HISTSIZE=1000 export HISTFILESIZE=1000 export PAGER='/bin/more ' export EDITOR='/bin/vi' export INPUTRC=/etc/inputrc export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile

### Some aliases alias ps2='ps facux ' alias ps1='ps faxo “%U %t %p %a” ' alias af='ps af' alias cls='clear' alias df='df-h' alias indent='indent-bad-bap-bbo-nbc-br-brs-c33-cd33-ncdb-ce-ci4-cli0-cp33-cs-d0-di1-nfc1-nfca-hnl-i4-ip0-l75-lp-npcs-npsl-nsc-nsob-nss-ts4 ' #alias bc='bc-l' alias minicom='minicom-c on' alias calc='calc-Cd ' alias bc='calc-Cd ' fi;

inputrc: # /etc/inputrc-global inputrc for libreadline # See readline(3readline)and `info readline' for more information.# Be 8 bit clean.set input-meta on set output-meta on set bell-style visible

# To allow the use of 8bit-characters like the german umlauts, comment out # the line below.However this makes the meta key not work as a meta key, # which is annoying to those which don't need to type in 8-bit characters.# set convert-meta off

“e0d”: backward-word “e0c”: forward-word “e[h”: beginning-of-line “e[f”: end-of-line “e[1~”: beginning-of-line “e[4~”: end-of-line #“e[5~”: beginning-of-history #“e[6~”: end-of-history “e[3~”: delete-char “e[2~”: quoted-insert

# Common standard keypad and cursor #(codes courtsey Werner Fink, )#“e[1~”: history-search-backward “e[2~”: yank “e[3~”: delete-char #“e[4~”: set-mark “e[5~”: history-search-backward “e[6~”: history-search-forward # Normal keypad and cursor of xterm “e[F”: end-of-line “e[H”: beginning-of-line # Application keypad and cursor of xterm “eOA”: previous-history “eOC”: forward-char “eOB”: next-history “eOD”: backward-char “eOF”: end-of-line “eOH”: beginning-of-line

securetty: tty1 tty2 tty3 tty4 tty5 tty6 tty7 tty8 ttyS0 ttyS1 ttyS2 ttyS3

network(目錄): interfaces: # Configure Loopback auto lo iface lo inet loopback

八 復制需要的庫到/lib目錄下

1 看看需要什么庫

進入busybox編譯目錄,執行ldd指令看看需要哪些動態聯結庫 #cd /usr/tmp/busybox-1.5.0 #ldd busybox 會出現如下信息:

libcrypt.so.1-> /lib/libcrypt.so.1(0x40029000)libc.so.6-> /lib/tls/libc.so.6(0x42000000)/lib/ld-linux.so.2-> /lib/ld-linux.so.2(0x4000000)

2 拷貝庫文件

然后把這些庫文件相關聯的庫文件都拷貝到相應的目錄:

#cd /usr/tmp/rootfs/lib #cp –arf /lib/libcrpt*./ #cp –arf /lib/ld-linux*./ #mkdir tls #cp –arf /lib/tls/libc.so*./tls/

如果你的應用程序還需要其他的動態庫,且不是很大的話都可以放過來。

九 制作ramdisk映象文件

cflinux根文件系統需要的所有東西都已經在/usr/tmp/rootfs目錄下準備好了。我們將利用ramdisk把這些內容做成ramdisk映象文件。

以下是ramdisk的制作過程。#cd /usr/tmp #mkdir ramdisk #dd if=/dev/zero of=./ramdisk.img bs=1M count=6 讀入了 6+0個塊

輸出了 6+0個塊

#mke2fs –m 0 ramdisk.img make2fs 1.32(09-Nov-2002)ramdisk.img is not a block special device Proceed anyway?(y,n)//輸入y,按回車鍵

Filesystem label = OS type:Linux Block size=1024(log=0)1536 inodes ,6144blocks ????????????????????

180 days,whichever comes first.Use tune2fs –c or –I to overrite

zero是一個特殊的設備,表示全部為零的字符塊。上面這條指令的意思是把系統的第一個ramdisk用全部為0的數據填充。Bs=1M 表示塊的大小為1M,count=6 表示有6塊。即我們監理了一個大小為6M的ramdisk.接下來就應該往ramdisk中填充文件了:

#mount –o loop ramdisk.img ramdisk #cp –arf rootfs/* ramdisk/ #umount ramdisk

做完以上幾步,你就應該明白ramdisk設備的含義,他和hda1,hdb1,一樣的塊設備用mount掛到文件系統下后就可以訪問,往里面放東西,但是所有的東西在內存上,關機將丟失所有東西。

十 系統整合

前面已經做好了內核,安裝好了extlinux,現在只需要把ramdisk放到bzImage 所 在的目錄就可以了。

#mount /dev/hdd1 /mnt #cp ramdisk /mnt #umount /mnt 好了現在就可以把cf卡插到工控板上,試一把了。如果一切正常的話就可以進入登陸界面了,呵呵。

十一 移植應用程序

在本文開始的時候已經說過將操作系統文件放在cd卡的注分區上hdd1上,把應用程序放在邏輯分區hdd5上。因此我們將編譯好的應用程序及其相關文件拷貝到hdd5上。由于應用程序用到的共享庫不是固定的所以就沒有將他們放到ramdisk中,直接和應用程序放在一起,只不過在系統啟動后要將這個庫目錄加到系統庫目錄路徑上即可。在這個項目中,我在hdd5上件了一個lib目錄,然后把應用程序用到的庫全部放在這個目錄下面,然后在profile文件中增加一項兩行就行: export LD_LIBRARY_PATH=#LD_LIBRARY_PATH:/myapp/lib export QTIDR=/myapp

十二 參考文獻

《BabyLinux制作過程詳解》作者:GuCuiwen email:win2linux@163.com

第四篇:嵌入式系統的主要應用

嵌入式系統的主要應用

嵌入式系統是一種包括硬件和軟件的完整的計算機系統,它的定義是:“嵌入式系統是以應用為中心,以計算機技術為基礎,并且軟硬件可剪裁,適用于應用系統對功能、可靠性、成本、體積和功耗有嚴格要求的專用計算機系統。”嵌入式系統所用的計算機是嵌入到被控對象中的專用微處理器,但是功能比通用計算機專門化,具有通用計算機所不能具備的針對某個方面特別設計的、合適的運算速度、高可靠性和較低比較成本的專用計算機系統。

嵌入式系統的應用前景是非常廣泛的,人們將會無時無處不接觸到嵌入式產品,從家里的洗衣機、電冰箱,到作為交通工具的自行車、小汽車,到辦公室里的遠程會議系統等等。在家中、辦公室、公共場所,人們可能會使用數十片甚至更多這樣的嵌入式無線電芯片,將一些電子信息設備甚至電氣設備構成無線網絡;在車上、旅途中,人們利用這樣的嵌入式無線電芯片可以實現遠程辦公、遠程遙控,真正實現把網絡隨身攜帶。其應用領域可以包括:

1.交通管理:在車輛導航、流量控制、信息監測與汽車服務方面,嵌入式系統技術已經獲得了廣泛的應用,內嵌GPS模塊,GSM模塊的移動定位終端已經在各種運輸行業獲得了成功的使用。目前GPS設備已經從尖端產品進入了普通百姓的家庭,只需要幾千元,就可以隨時隨地找到你的位置。2.家庭智能管理系統:水、電、煤氣表的遠程自動抄表,安全防火、防盜系統,其中嵌有的專用控制芯片將代替傳統的人工檢查,并實現更高,更準確和更安全的性能。

3.POS網絡及電子商務:公共交通無接觸智能卡發行系統,公共電話卡發行系統,自動售貨機,各種智能ATM終端將全面走入人們的生活。

4.環境工程與自然:水文資料實時監測,防洪體系及水土質量監測、堤壩安全,地震監測網,實時氣象信息網,水源和空氣污染監測。在很多環境惡劣,地況復雜的地區,嵌入式系統將實現無人監測。

5.機器人:嵌入式芯片的發展將使機器人在微型化,高智能方面優勢更加明顯,同時會大幅度降低機器人的價格,使其在工業領域和服務領域獲得更廣泛的應用。

6.工業控制:相對于其他的領域,機電產品可以說是嵌入式系統應用最典型最廣泛的領域之一。從最初的單片機到現在的工控機、SOC在各種機電產品中均有著巨大的市場。工業設備是機電產品中最大的一類,在目前的工業控制設備中,工控機的使用非常廣泛,這些工控機一般采用的是工業級的處理器和各種設備,其中以X86的MPU最多。工控的要求往往較高,需要各種各樣的設備接口,除了進行實時控制,還須將設備狀態,傳感器的信息等在顯示屏上實時顯示。這些要求8位的單片機是無法滿足的,以前多數使用16位的處理器,隨著處理器快速的發展,目前32位、64位的處理器逐漸替代了16位處理器,進一步提升了系統性能。采用PC104總線的系統,體積小,穩定可靠,受到了很多用戶的青睞。不過這些工控機采用的往往是DOS或者Windows系統,雖然具有嵌入式的特點,卻不能稱作純粹的嵌入式系統。另外在工業控制器和設備控制器方面,則是各種嵌入式處理器的天下。這些控制器往往采用16位以上的處理器,各種MCU,Arm、Mips、68K系列的處理器在控制器中占據核心地位。這些處理器上提供了豐富的接口總線資源,可以通過它們實現數據采集,數據處理,通訊以及顯示(顯示一般是連接LED或者LCD)。最近飛利浦和ARM共同推出32位RISC嵌入式控制器,適用于工業控制,采用最先進的0.18微米CMOS嵌入式閃存處理技術,操作電壓可以低至1.2伏,它還能降低25%到30%的制造成本,在工業領域中對最終用戶而言是一套極具成本效益的解決方案。美國TERN工業控制器基于Am188/186ES、i386EX、NEC V25、Am586(Elan SC520),采用了SUPERTASK實時多任務內核,可應用于便攜設備、無線控制設備、數據采集設備、工業控制與工業自動化設備以及其它需要控制處理的設備。

7.家電行業是嵌入式應用的另一大行業。現在只有按鈕、開關的電器顯然已經不能滿足人們的日常需求,具有用戶界面,能遠程控制,智能管理的電器是未來的發展趨勢。據IDG發布的統計數據表明,未來信息家電將會成長五至十倍。中國的傳統家電廠商向信息家電過渡時,首先面臨的挑戰是核心操作系統軟件開發工作。硬件方面,進行智能信息控制并不是很高的要求,目前絕大多數嵌入式處理器都可以滿足硬件要求,真正的難點是如何使軟件操作系統容量小、穩定性高且易于開發。Linux核心可以起到很好的橋梁作用,作為一個跨平臺的操作系統,它可以支持二三十種CPU,而目前已有眾多家電業的芯片都開始做Linux的平臺移植工作。1999年就登錄中國的微軟“維納斯”計劃給了國人一個數字家庭的概念,引導各大家電廠商紛紛投入到這場革命中來,雖然最終未能獲得成功,卻使信息家電深入人心。如今各大廠商仍然在努力推出適用于新一代家電應用的芯片,英特爾公司已專為信息家電業研發了名為StrongARM的ARM CPU系列,這一系列CPU本身不象X86CPU需要整合不同的芯片組,它在一顆芯片中可以包括你所需要的各項功能,即硬件系統實現了SOC的概念。美商網虎公司已將全球最小的嵌入式操作系統——QUARK成功移植到StrongARM系列芯片上,這是第一次把Linux、圖形界面和一些程序進行完整移植(QUARK的內核只有143K),它將為信息家電提供功能強大的核心操作系統。相信在不久的將來,數字智能家庭必將來到我們身邊。

這些應用中,可以著重于在控制方面的應用。就遠程家電控制而言,除了開發出支持TCP/IP的嵌入式系統之外,家電產品控制協議也需要制訂和統一,這需要家電生產廠家來做。同樣的道理,所有基于網絡的遠程控制器件都需要與嵌入式系統之間實現接口,然后再由嵌入式系統來控制并通過網絡實現控制。所以,開發和探討嵌入式系統有著十分重要的意義。

第五篇:基于嵌入式系統的圖形界面應用設計范文

目錄 嵌入式系統概述...................................................................................................................4

1.1 嵌入式系統簡介.......................................................................................................4 1.2 嵌入式系統的組成...................................................................................................5 1.3 本課題的背景和意義...............................................................................................5 2 硬件平臺及ARM體系結構................................................................................................7

2.1 處理器選擇...............................................................................................................7 2.2 ARM體系結構............................................................................................................7 3 軟件平臺...............................................................................................................................9

3.1嵌入式操作系統選擇................................................................................................9 3.2 交叉編譯環境的建立.............................................................................................10 3.2.1 上位機的軟硬件配置.........................................................................................10 3.2.2 硬件連接與調試.............................................................................................11 3.2.3 配置TFTP及NFS服務...................................................................................13 3.2.4 安裝交叉編譯工具.........................................................................................15 4 移植 Bootloader.................................................................................................................16 4.1 Bootloader 概述.................................................................................................16 U-boot 簡介...................................................................................................................17 4.2.1 U-boot 的獲取.................................................................................................17 4.2.2 U-boot 目錄結構.............................................................................................17 U-boot 的啟動過程及工作原理...................................................................................18 4.3.1 啟動模式介紹...................................................................................................18 4.3.2 啟動階段1分析...............................................................................................19 4.3.3 啟動階段2分析...............................................................................................20 U-boot的移植過程........................................................................................................20 4.4.1 準備工作...........................................................................................................20 4.4.2 添加支持 NAND Flash 啟動功能...................................................................21 4.4.3 添加 NAND Flash 讀寫功能.......................................................................22 4.4.4 修改 U-boot環境變量保存方式....................................................................22 4.4.5 加入 NAND Flash 閃存型號支持...............................................................23 4.5 U-boot 的燒寫及測試.........................................................................................23 4.6 設置U-boot環境變量..................................................................................................24 5 Linux 內核的移植.............................................................................................................25 Linux 內核的結構.........................................................................................................25 Linux 啟動過程簡析.....................................................................................................26 Linux內核的移植過程..................................................................................................26 5.3.1 選擇參考板.......................................................................................................26 5.3.2 修改 NAND Flash 分區信息...........................................................................26 5.3.3 關閉 ECC 校驗.................................................................................................27 5.4 CS8900a網卡的移植過程....................................................................................28 5.4.1 修改硬件地址映射...........................................................................................28 5.4.2 添加 CS8900A 內核編譯項.............................................................................28 5.5 Linux 內核的剪裁配置.......................................................................................29 5.5.1 使用配置菜單...........................................................................................................29 5.5.2 基本配置選項...................................................................................................30 5.5.3 驅動程序配置選項...................................................................................................31 5.5.4 保存配置文件...................................................................................................31 5.5.5 編譯 Linux 內核.............................................................................................31 5.6 內核的下載及啟動...............................................................................................32 5.6.1 將引導信息加入內核映像...............................................................................32 5.6.2 內核映像的下載及運行...................................................................................32 6 建立根文件系統.................................................................................................................33 6.1 根文件系統概述...................................................................................................33 6.1.1 根文件系統簡介...........................................................................................33 6.1.2 NFS 文件系統與Cramfs文件系統...................................................................33 6.2 建立Linux根文件系統目錄...............................................................................33 7 心得體會.............................................................................................................................34 基于嵌入式系統的圖形界面應用設計 嵌入式系統概述

1.1 嵌入式系統簡介

嵌入式系統是一種以應用為目的,軟硬件可裁減,適應應用系統對功能、成本、體積、功耗嚴格要求的專用計算機系統。隨著計算機的發展和應用的普及,嵌入式系統取得了迅猛的發展,嵌入式產品已經滲透到社會經濟、軍事、交通、通信等相關行業,而且深入到家電、娛樂等各個領域,掀起了一場數字化革命。嵌入式圖形用戶界面系統是嵌入式系統的一個重要組成部分,它將極大的促進嵌入式技術的發展和應用。

嵌入式系統是當前最熱門、最有發展前途的IT應用技術之一。一方面,嵌入式系統廣泛的應用于智能家電、手持終端、工業控制等專用設備上,通常這些設備的硬件資源(如處理器、存儲器等)非常有限,并且對成本很敏感,有時對實時響應要求很高;另一方面,隨著計算機技術的發展,越來越多的嵌入式系統設備需要良好的人機交互界面,這需要一個高性能、高可靠、占用系統資源少的用戶圖形界面的支持。為了適應嵌入式設備對人機交互界面的要求,本論文對基于嵌入式Linux圖形用戶界面的設計實現進行了研究。

一方面,嵌入式硬件性能不斷提升,使得嵌入式設備上運行精美的圖形用戶界面成為可能;另一方面,嵌入式手持式消費電子產品的普及,例如PDA(個人數字助理)、智能手機、PMP(便攜式多媒體播放器),一個完善的嵌入式圖形用戶界面成為不可缺少的組成部分,嵌入式GUI(圖形用戶界面:Graphical User Interface)為嵌入式系統提供了一種應用于特殊場合的人機交互接口。

縱觀國際相關產業在圖形用戶界面方面的發展現狀,許多國際知名公司早已認識到GUI在嵌入式產品方面產生的強大增值功能,以及帶動的巨大市場價值,因此在公司內部成立了專門從事GUI研究與設計的部門。

圖形用戶界面(GUI)是一種結合計算機科學、美學、心理學、行為學,以及商業領域需求分析的人機系統工程。這種面向用戶的系統工程設計目的是優化產品性能,使操作更人性化,減輕使用者的認知負擔,使其更適合用戶的操作需要,直接提升產品的市場競爭力。

圖形用戶界面的廣泛流行是當今計算機技術的重大成就之一,它極大的方便了非專業用戶的使用,可以通過窗口、菜單方便的進行操作。一個圖形用戶界面通常由三個基本層次組成,也就是顯示模型、窗口模型和用戶模型。用戶模型包含了顯示和交互的主要特征,因此用戶圖形界面有時也僅指用戶模型。

然而,對于嵌入式系統來說,由于其固有的體積、功耗以及價格的限制,使得傳統的圖形用戶界面并不能直接應用于嵌入式系統[41,在嵌入式系統上實現GUI是一個具有挑戰性的課題。總的來說,嵌入式GUI要求簡單、直觀、可靠、占用資源小且反應速度快,以適應系統硬件資源有限的條件嘲。另外,由于嵌入式系統硬件本身的特殊性,嵌入式GUI應具備高度可移植性與可裁減性,以適應不同的硬件條件和使用需求。具體的嵌入式GUI一般具備如下特點: 1.體積小

2.運行時耗用系統資源小

3.上層接口與硬件無關,高度可移植 4.高可靠性

5.在某些應用場合應具備實時性

目前,嵌入式GUI的開發正處于起步階段,有許多技術難題尚待解決,因此對嵌入式圖形系統的研究成為嵌入式系統研究及發展中的一個重要內容。

可以預見,隨著電子、計算機等行業的高速發展,嵌入式系統將以它專用化,效率高的特性深入實際應用的各個領域,因而開發與改進嵌入式圖形用戶界面有著長遠的意義。

1.2 嵌入式系統的組成

嵌入式系統一般可以分為四個部分:嵌入式處理器、嵌入式外圍設備、嵌入式操作系統和嵌入式應用軟件,如圖1-1所示。

圖1-1 嵌入式系統的組成

1.3 本課題的背景和意義

嵌入式導航計算機是飛機,車輛,導彈和船舶等運載體上的重要設備,主要任務是按照原定的計劃和任務,以要求的精度,在一定時間內將載體引 導至目的地。嵌入式導航計算機主要分為兩部分:硬件電路,嵌入式操作系 統。本課題的目的就是針對其硬件環境,搭建起一個高效、穩定的嵌入式操 作系統的平臺。它具有通用操作系統的基本特點,能夠有效管理復雜的系統 資源;能夠快速的處理大量的信息;能夠提供庫函數、驅動程序、工具集以 及部分應用程序。在這個系統平臺上可以運行導航程序,接受傳感器的數據 經處理后得到任務所需要的信息,從而實施導航任務。

嵌入式Linux有著嵌入式導航計算機操作系統需要的很多特色:支持多 任務處理、中斷處理及任務間通信,性能穩定,剪裁性好,開發與使用都很 方便。因此,本設計選用嵌入式Linux作為嵌入式導航計算機的操作系統,這對于實現導航計算機的高效率、低功耗具有現實意義。

圖1-2 嵌入式導航計算機硬件平臺結構圖

1.4 本課題的主要工作和研究內容

本課題的最重目標是為嵌入式導航計算機移植Linux操作系統。通過參 閱大量文獻,學習嵌入式Linux系統和 ARM 體系微處理芯片S3C2410的相 關知識,研究啟動下載程序 Bootloader 和 Linux內核的基本工作原理,并且 搭建交叉編譯平臺,重點是移植Bootloader和內核,以及制作根文件系統。具體工作內容包括:

(1)學習Linux操作系統的知識。

(2)了解 ARM的體系結構和S3C2410芯片硬件結構。(3)完成交叉編譯環境的建立。(4)修改并移植U-boot 1.2.0。

(5)修改和裁剪Linux 2.6.24.4內核,移植網卡驅動程序。(6)制作根文件系統。(7)編寫應用程序進行測試。

(8)將內核和根文件系統部署到開發板。2 硬件平臺及ARM體系結構

2.1 處理器選擇

本設計的處理器選擇高性能、低功耗的ARM9微處理器Samsung S3c2410。S3c2410 是著名半導體公司 Samsung 推出的一款 32 位 RISC 處理器。S3c2410的內核基于 ARM920T,帶有MMU功能,主頻高達203MHz,可以支持 Linux、WinCE 等主流嵌入式操作系統。同時它還采用了一種叫做Advanced Microcontroller Bus Architecture(AMBA)的新型總線結構。

此外S3c2410還集成了以下片上功能:

(1)16KB指令 Cache和16KB的數據Cache;(2)LCD控制器(支持STN和TFT);

(3)4通道DMA;

(4)3通道UART;

(5)2通道USB;

(6)4路PWM和 1個內部時鐘控制器;

(7)117個通用IO,24路外部中斷;

(8)16位看門狗定時器;(9)RTC(實時時鐘);

(10)1通道IIC/IIS控制器;

(11)NAND Flash控制器;

(12)PLL數字鎖相環。

S3c2410 將系統的存儲空間分為 8 組(bank),每組大小是 128MB,共1GB。Bank0 到 Bank6 都采用固定 Bank 起始尋址,用于 ROM 或 SRAM。Bank7具有可編程的 Bank的起始地址和大小,用于ROM、RAM或SDRAM。S3c2410還支持從NAND Flash啟動,NAND Flash具有容量大、比NOR Flash價格低等特點。系統采用NAND Flash與SDRAM相結合的方式,可以獲得非常高的性價比。

2.2 ARM體系結構

ARM微處理器基本架構:

ARM9微處理器采用RISC體系結構:優先選取使用頻最高的簡單指令,避免復雜指令

RISC體系結構應具有如下特點:

1.采用固定長度的指令格式,指令歸整、簡單、基本尋址方式有2~3種。2.使用單周期指令,便于流水線操作執行。3.大量使用寄存器,數據處理指令只對寄存器進行操作,只有加載/ 存儲指令可以訪問存儲器,以提高指令的執行效率。

4.除此以外,ARM體系結構還采用了一些特別的技術,在保證高性能的前提下盡量縮小芯片的面積,并降低功耗:

5.所有的指令都可根據前面的執行結果決定是否被執行,從而提高指令的執行效率。

6.可用加載/存儲指令批量傳輸數據,以提高數據的傳輸效率。7.可在一條數據處理指令中同時完成邏輯處理和移位處理。8.在循環處理中使用地址的自動增減來提高運行效率。ARM微處理器的寄存器結構:

1.ARM處理器共有37個寄存器,被分為若干個組(BANK),這些寄存器包括:

2.31個通用寄存器,包括程序計數器(PC指針),均為32位的寄存器。3.6個狀態寄存器,用以標識CPU的工作狀態及程序的運行狀態,均為32位,目前只使用了其中的一部分。

4.同時,ARM處理器又有7種不同的處理器模式,在每一種處理器模式下均有一組相應的寄存器與 之對應。即在任意一種處理器模式下,可訪問的寄存器包括15個通用寄存器(R0~R14)、一至二個狀態寄存器和程序計數器。在所有的寄存器中,有些是在 7種處理器模式下共用的同一個物理寄存器,而有些寄存器則是在不同的處理器模式下有不同的物理寄存器。

ARM微處理器的指令結構:

ARM微處理器的在較新的體系結構中支持兩種指令集:ARM指令集和Thumb指令集。其 中,ARM指令為32位的長度,Thumb指令為16位長度。Thumb指令集為ARM指令集的功能子集,但與等價的ARM代碼相比較,可節省30% ~40%以上的存儲空間,同時具備32位代碼的所有優點。

ARM9系列微處理器具有以下特點: 1.5級整數流水線,指令執行效率更高。2.提供1.1MIPS/MHz的哈佛結構。

3.支持32位ARM指令集和16位Thumb指令集。4.支持32位的高速AMBA總線接口。

5.全性能的MMU,支持Windows CE、Linux、Palm OS等多種主流嵌入式操作系統。

6.MPU支持實時操作系統。

7.支持數據Cache和指令Cache,具有更高的指令和數據處理能力。大小都為16K。8.ARM9系列微處理器主要應用于無線設備、儀器儀表、安全系統、機頂盒、高端打印機、數字照相機和數字攝像機等。

9.ARM9系列微處理器包含ARM920T、ARM922T和ARM940T三種類型,以適用于不同的應用場合。軟件平臺

3.1嵌入式操作系統選擇

本設計的嵌入式操作系統選擇嵌入式Linux操作系統。

嵌入式操作系統是一種支持嵌入式系統應用的操作系統軟件,它是嵌入式系統(包括硬、軟件系統)極為重要的組成部分,通常包括與硬件相關的底層驅動軟件、系統內核、設備驅動接口、通信協議、圖形界面、標準化瀏覽器等Browser。

一般情況下,嵌入式操作系統可以分為兩類,一類是面向控制、通信等領域的實時操作系統,如 WindRiver 公司的 VxWorks、ISI 的 pSOS、QNX系統軟件公司的QNX、ATI的 Nucleus等;另一類是面向消費電子產品的非實時操作系統,這類產品包括個人數字助理(PDA)、移動電話、機頂盒等。嵌入式 Linux 操作系統

Linux 的嵌入式改造主要圍繞體積和實時性展開,目前已經有很多公司在進行這方面的工作,其中包括 RT-Linux,uClinux,Embedix,Xlinux,MidoriLinux和紅旗嵌入式 Linux等等。

與目前市場上的眾多商業的實時系統相比,嵌入式Linux除具有內核穩定,功能強大,支持多種硬件平臺,兼容性好的優勢外,還擁有以下的特點:(1)完全開放源代碼

嵌入式 Linux完全開放其源代碼,這使得修改,裁剪 Linux成為可能,開發者可以根據實際需要優化操作系統代碼,降低整個系統的開銷與能耗。(2)成本低

GPL協議保證了源自Linux的嵌入式Linux也是開放源代碼的自由軟件。而大多數嵌入式Linux使用的開發工具也是遵守GPL協議的,同樣也可以免費獲得。

(3)豐富的實用軟件支持

Linux 提供了大量的實用程序和各種應用軟件。這些軟件的正確性和有效性都經過了實際檢驗,可以根據需要合理利用他們迅速構建嵌入式應用的軟件環境。這樣可以極大地減小嵌入式軟件開發的時間和費用,提高系統可靠性。而商用的實時操作系統也試圖提供各種常用軟件工具包,但其數量是無法和Linux操作系統匹敵的。由此可見,選擇嵌入式Linux操作系統,就有了豐富的資源保障,在節省成本的同時,提高了開發效率。

3.2 交叉編譯環境的建立

采用交叉開發環境(Cross Development Environment)是嵌入式應用軟

件開發時的一個顯著特點,通常在通用計算機上編寫程序,然后通過交叉編 譯生成目標平臺上可運行的二進制代碼格式,最后再下載到目標平臺上的特 定位置運行,交叉開發環境是指編譯、鏈接和調試嵌入式應用軟件的環境,它與運行嵌入式應用軟件的環境有所不同,通常采用主機/目標及模式。交叉開發模型如圖2-1所示:

圖3-1 交叉開發模型

3.2.1 上位機的軟硬件配置

硬件:

本課題用到一臺通用PC機和一臺筆記本電腦,其硬件配置如下:

PC機:

CPU:P IV 2.0G RAM:256MB 串口:RS-232 并口:25針母頭 筆記本電腦: CPU:PM 705 RAM:768MB 網卡:10/100MBps自適應網卡 軟件:

PC機的操作系統為Windows XP,裝有DNW串口調試工具以及SJF2410 三星Flash燒寫工具。前者用于串口調試,后者用于燒寫Bootloader。

筆記本電腦的操作系統為 Ubuntu7.10,裝有 GCC 等編譯工具以及arm-linux-gcc交叉編譯工具,并開啟TFTP和 NFS服務。用于 Linux內核編 譯和軟件開發,并作為TFTP服務器和NFS主機。其中,Ubuntu7.10 是 Linux 的桌面發行版之一,是當今最為流行的桌面Linux 系統。使用 Linux 操作系統及其自帶的工具,是目前最權威的嵌入式Linux系統開發方式,但是許多操作都是基于命令行的,所以需要扎實的Linux基礎知識。

在 Ubuntu 中建立 arm用戶,專門用于 ARM 開發。在 home 目錄中建立下列幾個子目錄:

Boot:用于存放bootloader相關程序。Kernel:用于存放 Linux內核源碼。FS:用于存放根文件系統相關的程序。Program:用于存放用戶程序。

3.2.2 硬件連接與調試

硬件連接方式:

圖3-2 硬件連接圖

(1)開發板串口UART0通過交叉串口線與PC主機的 COM1口相連。

(2)開發板的JTAG口通過20PIN排線與SUPER JTAG調試頭相連,再通過25PIN并口線連接到主機的LPT1口。

(3)開發板的網卡接口通過以太網線連接到路由器的LAN1口。

(4)筆記本的網卡接口通過以太網線連接到路由器的LAN2口。

(5)路由器的 WAN口連接到INTERNET。串口調試:

在本課題嵌入式系統中的目標開發板,采用串口調試的方法,即把串口當作目標開發板的顯示終端,無論是打印輸出,還是管理配置輸入,都使用串口,這就需要主機系統裝有串口調試工具。PC機中安裝有DNW串口調試工具,在使用DNW之前,應當對PC機的串口進行設置。方法如下:

(1)XP系統中,右鍵單擊“我的電腦”,選擇“屬性”。

(2)選擇“硬件”——“設備管理器。

(3)選擇“端口”——“串口(COM1)”,打開的對話框按圖2-3設置。

圖3-3 串口屬性設置

運行 DNW 工具,選擇菜單“Configuration”——“Options”,按圖 2-4所示進行設置。

圖 3-4

DNW 設置

每次使用DNW之前,應當設置DNW連接到串口。點擊菜單中的 “Serial Port”——“Connect”,當DNW的標題欄出現[COM1,115200bps]的提示后,表明已經連接好,此時才可以使用DNW工具。

3.2.3 配置TFTP及NFS服務

TFTP 服務簡介:

TFTP(Trivial File Transfer Protocol)協議即簡單文件傳輸協議,是TCP/IP協議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸的協議,提供不復雜、開銷不大的文件傳輸服務。TFTP承載在UDP上,提供不可靠的數據流傳輸服務,不提供存取授權與認證機制,使用超時重傳方式來保證數據的到達。

TFTP 服務在 Linux 系統中有客戶端和服務器兩個軟件包。配置 TFTP服務,必須都安裝好。

TFTP 服務安裝與配置:

(1)Ubuntu中安裝tftp工具只需在終端中鍵入命令: $ sudo apt-get install tftp tftpd 其中,前者是客戶端,后者是服務器。

(2)Ubuntu是debian類的系統,默認是沒有安裝 inetd的,安裝命令如下: $ sudo apt-get install netkit-inetd(3)在home目錄里建立tftpboot 文件夾,命令如下: $ cd ~ $ sudo mkdir tftpboot $ sudo chmod 777 tftpboot 其中,參數 777 的意義是:根管理員、組和其他用戶對 tftpboot 文件夾 的權限均為“可讀、可寫、可以執行”(4)修改/etc/inetd.conf,添加如下語句:

tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /home/arm/tftpboot 目的是指定 tftp 服務的根目錄為/home/arm/tftpboot,修改/etc/inetd.conf 文件后應當重啟 inted進程,命令如下: $ sudo /etc/init.d/inetd reload(5)重啟 inted 進程后,配置即可生效,在 tftpboot 中建立文件 test 后,用

下列命令可以進行測試: $ cd ~ $ tftp 127.0.0.1 Tftp> get test 若可下載test 文件,則證明TFTP服務配置正確。NFS 服務簡介:

NFS 就是 Network File System 的縮寫,最早之前是由 Sun 這家公司所開發的。最大的功能就是可以透過網絡,讓不同的機器、不同的操作系統、可以彼此分享個別的檔案(share files)。所以,可以簡單的將它看做是一個文件服務器(file server)。通過 NFS 服務器可以讓開發板將網絡遠端的 NFS 主機分享的目錄,掛載到開發板當中,在開發板看起來,那個遠端主機的目錄就好像是自己的根目錄一樣,可以方便的進行開發調試。NFS 服務安裝與配置:

(1)Ubuntu上默認是沒有安裝NFS服務器的,首先要安裝NFS服務程序: $ sudo apt-get install nfs-kernel-server 在安裝nfs-kernel-server時,apt 會自動安裝nfs-common和portmap。這樣,宿主機就相當于NFS Server。(2)配置/etc/exports:

NFS 掛載目錄及權限由/etc/exports 文件定義。本課題要將 home 目錄中 的/home/zp/share 目錄讓 192.168.0.*的 IP 共享, 則在該文件末尾添加下列語句:

/home/arm/FS/myrootfs 192.168.0.2/10(rw,sync,no_root_squash)配置參數說明: rw:具有可擦寫的權限。

sync:文件同步寫入到內存和硬盤當中。

no_root_squash:若登陸共享目錄的使用者是 root 的話,則他的權限將被限 制為匿名使用者,通常他的UID和GID都會變為nobody。(3)本地測試NFS:

輸入以下命令可以將NFS根目錄掛載到本地的/mnt 目錄中: $ sudo mount 192.168.0.2:/home/arm/FS/myroot /mnt 此時/mnt 中的內容應當與NFS根目錄中的內容一致。

3.2.4 安裝交叉編譯工具

交叉編譯簡介:

所謂交叉編譯,簡單的說,就是在一個平臺上生成另一個平臺上的可執行代碼,比如在 PC平臺上(X86 CPU)編譯出能運行在以 ARM 為內核的CPU平臺上的程序,一般選擇GNU開發工具 gcc。GNU的開發工具都是免費的,遵循 GPL協議,任何人可以從網上獲取。GNU 提供的編譯工具包括匯編器as、c編譯器gcc、c++編譯器g++、連接器ld和二進制轉換工具objcopy。出于兼容性和穩定性考慮,本課題選擇目前比較穩定的版本 Cross-3.3.2 和Cross-3.4.1。

交叉編譯器的安裝及配置:

(1)獲取arm-linux交叉編譯工具:

登陸arm-linux項目組的FTP服務器:

ftp.arm.linux.org.uk/pub/armlinux/toolchain/

下載cross-3.3.2.tar.bz2和cross-3.4.1.tar.bz2。

(2)通過下列命令可以安裝arm-linux交叉編譯工具:

$ cp cross-3.4.1.tar.bz2 /

$ cd /

$ tar jxvf cross-3.4.1.tar.bz2

這樣,交叉編譯工具就被安裝到了/usr/local/arm/3.4.1中。用同樣的方法 可以安裝cross-3.3.2版的交叉編譯工具。

(3)設置環境變量:

修改home目錄下的profile文件,加入如下代碼,指明交叉編譯工具的 目錄。

# User specific environment and startup programs

export TARGET=arm-linux

export PRJROOT=/home/arm

export

PATH=$PATH:$HOME/bin:$PREFIX/bin:/usr/local/arm/3.4.1/bin:/sbin:/usr/ sbin:/usr/local/sbin

測試交叉編譯器:

可以通過一個簡單的程序測試安裝好的交叉編譯工具,看其能否正常工作。編寫一個 hello.c源文件,通過以下命令進行編譯,編譯后生成名為Hello的可執行文件,通過 file 命令可以查看文件的類型。當顯示以下信息是表明交叉編譯工具正常安裝了,通過編譯生成了ARM體系可執行的文件。注意,通過該交叉編譯器編譯的可執行文件只能在 ARM 體系下執行,不能在基于X86的普通PC上執行。

$ arm-linux-gcc –o Hello hello.c

$ file Hello

Hello:ELF 32-bit LSB executable ,ARM, version 1(ARM), for GNU/Linux 2.4.3, dynamically linked(uses shared libs), not stripped 4 移植 Bootloader 4.1 Bootloader 概述

簡單地說,Bootloader就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。

通常,Bootloader是嚴重地依賴于硬件而實現的,特別是在嵌入式世界。因此,在嵌入式世界里建立一個通用的Bootloader幾乎是不可能的,不同處理器構架都有不同的 Bootloader。Bootloader 不但依賴于 CPU 的體系結構,而且依賴于嵌入式板級設備的配置。對于不同的嵌入式板而言,即使它們使用同一種處理器,要想讓運行在一塊板子上的Bootloader運行在另一塊板子上,一般也要修改其源代碼。

目前常用的Bootloader程序有以下幾種: U-boot、VIVI、Blob和RedBoot。其中,U-boot 功能豐富,且對于ARM體系支持良好,事實上,它已成為ARM平臺上標準Bootloader。因此,本課題選用U-boot 作為移植對象。U-boot 簡介

U-boot 是德國 DENX 小組的開發用于多種嵌入式 CPU 的 Bootloader 程序,U-boot 不僅僅支持嵌入式Linux系統的引導,還支NetBSD,VxWorks,QNX,ARTOS,LynxOS 等嵌入式操作系統。U-boot 除了支持 ARM 系列的處理器外,還能支持 MIPS、x86、PowerPC、NIOS、XScale 等諸多常用系列的處理器。

4.2.1 U-boot 的獲取

U-boot 的源碼可以從sourceforge網站下載,網址為:

http://sourceforge.net/project/u-boot。

下載的文件為u-boot-1.2.0.tar.bz2,用以下命令將其解壓。

$ tar jcvf u-boot-1.2.0.tar.bz2 /home/arm/boot/ 4.2.2 U-boot 目錄結構

解壓后,在 U-boot 頂層目錄下有 18 個子目錄,分別存放和管理不同的源碼。這些目錄中所要存放的文件有其規則,可以分為3類,如表3-1所示:

第一類目錄與處理器體系結構或開發板硬件直接相關。第二類目錄是一些通用的函數或者驅動程序。第三類目錄是U-boot 的應用程序、工具或者文檔。

表4-1 U-boot頂層目錄下部分目錄的存放規則 U-boot 的啟動過程及工作原理

4.3.1 啟動模式介紹

Bootloader 都包含兩種不同的操作模式:“啟動加載”模式和“下載”模式,這種區別僅對于開發人員才有意義。但從最終用戶的角度看,Boot Loader 的作用就是用來加載操作系統,而并不存在所謂的啟動加載模式與下載工作模式的區別。

啟動加載(Bootloading)模式:這種模式也稱為“自主”(Autonomous)模式。也即 Bootloader 從目標機上的某個固態存儲設備上將操作系統加載 到 RAM中運行,整個過程并沒有用戶的介入。這種模式是 Boot Loader 的

正常工作模式,因此在嵌入式產品發布的時侯,Bootloader 顯然必須工作在這種模式下。

下載(Downloading)模式:在這種模式下,目標機上的 Boot Loader 將通過串口連接或網絡連接等通信手段從主機(Host)下載文件,比如:下載內核映像和根文件系統映像等。從主機下載的文件通常首先被 Bootloader保存到目標機的 RAM 中,然后再被 Bootloader 寫到目標機上的 FLASH 類固態存儲設備中。Bootloader 的這種模式通常在第一次安裝內核與根文件系統時被使用; 此外,以后的系統更新也會使Bootloader的這種工作模式。工作于這種模式下的 Bootloader 通常都會向它的終端用戶提供一個簡單的命令行接口。

U-boot 這樣功能強大的Bootloader 同時支持這兩種工作模式,而且允許用戶在這兩種工作模式之間進行切換。

大多數Bootloader都分為階段1(stage1)和階段2(stage2)兩大部分,U-boot也不例外。依賴于CPU體系結構的代碼(如CPU初始化代碼等)通常都放在階段1中且通常用匯編語言實現,而階段 2 則通常用C語言來實現,這樣可以實現復雜的功能,而且有更好的可讀性和移植性。

圖 4-1 U-boot啟動代碼流程圖

4.3.2 啟動階段1分析

如果 S3C2410 被配置成從 NAND 閃存啟動,上電后,S3C2410 的 NAND 閃存控制器會自動把 NAND 閃存中的前 4K 數據搬移到內部 RAM中,并把 0x00000000 設置為內部 RAM 的起始地址,CPU 從內部 RAM 的0x00000000 位置開始啟動。因此要把最核心的啟動程序放在 NAND 閃存的前4K中。由于NAND閃存控制器從NAND閃存中搬移到內部RAM的代碼是有限的,所以,在啟動代碼的前 4K里,必須完成 S3C2410 的核心配置,并把啟動代碼的剩余部分搬到 RAM 中運行。這前4K完成的主要工作就是 U-boot 啟動的第一個階段(stage1)。

U-boot 的stage1代碼通常放在start.s文件中,它用匯編語言寫成。此階段要完成的主要工作如下:

(1)設置異常向量,當發生異常時,執行 cpu/arm920t/interrupts.c 中定義的中斷處理函數。

(2)設置CPU的模式為SVC(管理模式,操作系統使用的保護模式)(3)關閉看門狗。(4)禁掉所有中斷。

(5)設置 cpu 頻率,默認頻率比為 FCLK:HCLK:PCLK = 1:2:4,默認FCLK的值為120 Mhz,該值為S3C2410手冊的推薦值。(6)調用cpu初始化函數cpu_init_crit。其中一個功能是設置CP15寄存 器,失效指令(I)Cache和數據(D)Cache后,禁止MMU與 Cache。(7)重定向,將 NAND Flash代碼復制到 RAM,其中有以下兩個個步 驟:

(a)通過copy_myself子程序,把數據從Nand Flash中拷貝到RAM。

(b)配置棧空間,配置代碼段的開始地址、動態內存區長度、全局數據 大小以及分配IRQ 和FRQ的棧空間。

(8)BSS(Block Started by Symbol)段清零。(9)進入C代碼:

ldr pc, _start_armboot _start_armboot:.word start_armboot 其中 start_armboot 是 U-boot 運行的第一個 C 程序,在 lib_arm/board.c 文件中定義。隨后進入第二階段。

4.3.3 啟動階段2分析

lib_arm/board.c 中的 start armboot 是 C 語言開始的函數,也是整個啟動代碼中C語言的主函數,同時還是整個 U-boot(armboot)的主函數,該函數主要完成如下操作:(1)定義初始化函數表。

(2)NAND Flash初始化,利用 nand_init()函數實現。(3)環境變量初始化,利用env_relocate()函數實現。(4)外圍設備初始化,利用 devices_init()函數實現。(5)使能中斷,利用enable_interrupts()函數實現。(6)初始化網絡設備。

(7)進入U-boot 的命令循環,接受用戶輸入的命令,執行相應的工作。

U-boot的移植過程

移植U-boot 的主要工作就是添加開發板硬件相關的文件、配置選項,然后進行編譯。

4.4.1 準備工作

(1)建立開發板編譯項,在頂層Makefile中加入如下兩行: LJD2410_config : unconfig @$(MKCONFIG)$(@:_config=)arm arm920t LJD2410 NULL s3c24x0 各項意義如下:

arm:CPU 的架構(ARCH)arm920t:CPU 的類型(CPU),其對應于 cpu/arm920t 子目錄。LJD2410:開發板的型號(BOARD),對應于 board/crane2410 目錄。NULL:開發者/或經銷商(vender)。s3c24x0:片上系統(SOC)。

(2)在 board 子目錄中建立 LJD2410開發板目錄: $ cp rf board/smdk2410 board/LJD2410 $ cd board/LJD2410 $ mv smdk2410.c LJD2410.c(3)在 include/configs/中建立配置頭文件:

$ cp include/configs/smdk2410.h include/configs/LJD2410.h(4)測試編譯能否成功: $ make distclean $ make LJD2410_config $ make CROSS_COMPILE=arm-linux-如果編譯成功,證明已經建立好了LJD2410的編譯項,但是還要進行進一步的修改,因為現在的代碼是完全拷貝 smdk2410 開發板的,還不能工作在LJD2410板上。接下來要按照 LJD2410板的硬件配置來進一步移植。(5)調整SDRAM的刷新率,修改 lowlevel_init.S: #define REFCNT 1268 在smdk2410.c中調整 HCLK為 100MHz: /*Fout = 200MHz */ #define M_MDIV 0x5C #define M_PDIV 0x4 #define M_SDIV 0x0 4.4.2 添加支持 NAND Flash 啟動功能

由于U-boot 不支持從NAND Flash啟動,所以將程序復制到RAM里面去需要新加代碼實現,一般通過 copy_myself 函數實現。這可以參考 VIVI的copy_muself代碼將其添加到Start.S中,詳見附錄 A-1。

在Start.S中調用了nand_reak_ll函數,該函數用于NAND Flash讀操作,在U-boot 中沒有定義,需要新加代碼實現,該函數的實現可以參考VIVI源代碼。將VIVI/s3c2410/nand_read.c 復制到LJD2410目錄內即可。

由于使用了新的 Flash 讀函數,在編譯時需要重新鏈接,修改 LJD2410目錄中的Makefile文件,將原先的OBJS := myboard.o flash.o 改為:OBJS := myboard.o nand_read.o。

S3c2410處理器帶有NAND Flash控制器,但是U-boot 沒有定義其寄存器地址,修改 include/s3c2410.h文件,加入如下代碼: #define oNFCONF 0x00 #define oNFCMD 0x04 #define oNFADDR 0x08 #define oNFDATA 0x0C #define oNFSTAT 0x10 #define oNFECC 0x14 4.4.3 添加 NAND Flash 讀寫功能

U-boot 運行至第二階段進入 start_armboot()函數。其中 nand_init()函數是對 NAND Flash 的最初初始化函數。其調用與CFG_NAND_LEGACY 宏有關,如果沒定義

CFG_NAND_LEGACY 這個宏,就按照 start_armboot()調用 drivers/nand/nand.c 中的 nand_init 函數(該函數在 1.2.0 已經被實現)默認規定,但還有個 board_nand_init()函數沒實現,需自己添加。如果定義CFG_NAND_LEGACY,就不使用默認的nand_init,而調用自己寫的nand_init函數了,本課題選擇第二種方式。

在/drivers/nand_legacy/nand_legacy.c 中添加 NAND Flash 初始化函數nand_init,詳見附錄 A-2。

可以看到 nand_init()調用 NF_Init()函數,使能 NAND Flash 控制器和 NAND Flash;調用 NF_Reset()函數置位,NF_WaitRB()查詢 NAND Flash 的狀態,最后再調用 nand_probe((ulong)nand)函數探測 NAND Flash。

在 include/configs/smdk2410.h 文件的后半部原先有 Flash 的參數,刪除它,并加入NAND Flash的參數,并且開啟一些命令宏。

4.4.4 修改 U-boot環境變量保存方式

由于本課題使用NAND Flash作為外存儲器,所以U-boot 的參數存儲函數應當進行適當的修改。

在/common/env_common.c里添加default_env函數,此函數的作用是對環境變量保存方式的簡單初始化。這個文件中還定義了U-boot 保存環境變量的底層函數。其中/* Environment not changable */行下面的部分應當用 default_env 函數代替。這樣,就可以在 U-boot 命令行中實現對環境變量的設置與保存。文件 /common/env_nand.c 中 包 含 了 Flash 擦 寫 函 數,結合 CFG_NAND_LEGACY這個宏,添加代碼實現 NAND Flash的擦寫功能。初 始化環境仍用 default_env函數替換。

4.4.5 加入 NAND Flash 閃存型號支持

在/include/linux/mtd/

nand_ids.h

nand_flash_dev nand_flash_ids結構體的賦值進行修改,加入下列代碼:

{“Samsung K9F1208U0B”, NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0}, 這樣,U-boot 就可以正確識別此款NAND Flash芯片。

4.5 U-boot 的燒寫及測試

若開發板中沒有任何程序,則不能啟動,需要先將 U-boot 燒寫到 Flash中。常用的燒寫方法有如下幾種:(1)將Flash取下,用編程器燒寫。(2)通過串口線燒寫。(3)通過JTAG調試接口燒寫。

本課題采用第三種方法。通過JTAG接口燒寫的優點是操作簡單,但是燒寫速度較慢,總體來說是一種非常經濟實用的方法。具體操作如下:(1)連接好開發板和PC主機,主機安裝并口設備驅動程序。

(2)將 u-boot.bin 拷貝至 sjf2410 目錄下,用以下命令運行 sjf2410:

sjf2410 /f:u-boot.bin(3)sjf2410程序啟動后,會有三個選項,依次為:

(a)選擇Flash芯片型號,(b)選擇程序類型,(c)選擇燒寫起始地址。

本課題全部選擇“0”即可。

(4)燒寫完畢后選擇“2”退出sjf2410。

燒寫完成后,斷開JTAG線,PC機運行DNW串口調試軟件。重啟開發板后,DNW中會輸出以下信息,表明U-boot可以正常啟動:

其中,“LJD2410 >”即系統提示符,在此可以輸入 U-boot 的命令并執行。U-boot 提供了幾十個常用的命令,通過這些命令,可以對開發板進行調試,可以引導Linux內核,還可以擦寫 Flash 完成系統部署等功能。

輸入“help”命令,可以看到U-boot 當前的所有命令列表,如表3-2所示,每一條命令后面是簡單的說明。

表4-2 U-boot中幾個常用命令及其說明

4.6 設置U-boot環境變量

U-boot的環境變量存儲在NAND Flash中U-boot程序映像后面的128Kb字節中,這部分被稱為“變量區”。

本課題中,設置U-boot 環境變量共有兩種方法:(1)在板級頭文件LJD2410.h中定義有相關的環境變量宏。

這類的宏名稱中以“CONFIG_”開頭,區別于以“CFG_”開頭的內部變量宏。以開發板的IP地址為例,LJD2410.h中有如下代碼:

#define CONFIG_IPADDR 192.168.0.10 這種方法定義簡便,但是每次更改環境變量必須重新編譯、燒寫U-boot程序,操作復雜,不方便調試。(2)使用命令設置環境變量。

這種方法得益于先前所做的移植工作,優點是操作簡便,可以在線設置,重啟開發板即可生效。還是以設置開發板 IP 地址為例,U-boot 提示符下輸入以下命令:

LJD2410 > setenv ipaddr 192.168.0.10 LJD2410 > saveenv 系統顯示:

Saving Environment to NAND...Erasing Nand...Writing to Nand...done 表明新設置的環境變量已保存至Flash中的變量區。5 Linux 內核的移植

Linux 內核的結構

在對Linux內核移植之前,首先要明確內核源碼的基本組織情況,只有了解了各目錄級代碼的功能才能準確找到需要修改和改進的地方。

Linux 內核主要由 5 個子系統組成:進程調度、內存管理、虛擬文件系 統、網絡接口、進程間通信。

Linux內核源碼中幾個主要的目錄說明如下:

(1)/arch包含了所有硬件結構特定的內核代碼。

Linux 系統能支持如此多平臺的部分原因是因為內核把原程序代碼清晰的劃分為體系結構無關部分和體系結構相關部分。對于任何平臺,都必須包含以下幾個目錄:

(a)boot:包括啟動內核所使用的部分或全部平臺特有代碼。

(b)kernel:存放支持體系結構特有的(如信號處理和SMP)特征的實現。

(c)

lib:存放高速體系結構特有的(如strlen和 memcpy)通用函數的實現。

(d)mm:存放體系結構特有的內存管理程序的實現。

(e)math-emu:模擬 FPU 的代碼。對于 ARM 處理器來說,此目錄用mach-xxx代替。

(2)/drivers包含了內核中所有的設備驅動程序。

(3)/fs包含了所有的文件系統的代碼。

(4)/include包含了建立內核代碼時所需的大部分庫文件。

該目錄也包含了不同平臺需要的庫文件。比如,asm-arm是 arm平臺需要的庫文件。

(5)/init 包含了內核的初始化代碼,內核從此處工作。這是研究核心如何工作的好起點。

(6)/ipc包含了進程間通信代碼。

(7)/kernel包含了主內核代碼。

(8)/mm包含了所有內存管理代碼。

(9)/net 包含了和網絡相關的代碼。

(10)/documents包含了內核源碼各個部分的說明文件。

通常,在每個目錄下,都有一個 Kconfig 文件和一個Makefile文件,這兩個文件都是編譯時使用的輔助文件,仔細閱讀這兩個文件對弄清各個文件之間的聯系和依托關系很有幫助;而且在有的目錄下還有 Readme 文件,它是對該目錄下的文件的一些說明,同樣有利于我們對內核源碼的理解。

顯然,移植工作的重點就是移植arch目錄下的文件。Linux 啟動過程簡析

Linux 內核啟動就是引導內核映像啟動的過程。典型的內核映像是zImage,包含自引導程序和壓縮的vmlinux兩部分。

啟動過程從內核映像入口開始執行,解壓 vmlinux并轉到虛擬地址空間;再調用統一的內核啟動函數 start_kernel(),完成一系列基本初始化;隨后啟動一個叫做 init 的內核線程,完成掛載文件系統、初始化設備驅動和啟動用戶空間 init 進程等工作。

Linux內核的移植過程

5.3.1 選擇參考板

內核的移植工作主要是修改跟硬件平臺相關的代碼,一般不涉及 Linux內核通用程序。移植的難度也取決于兩種硬件平臺的差異。Linux 對于特定硬件平臺的軟件叫做BSP(Board Support Package).Linux 內核已經支持了各種體系的多種開發板,我們很容易從中找到與本課題類似的目標板,參考該目標板并做一定的修改,即可完成移植工作。選擇參考板的原則如下:

(1)參考板與開發板具有相同的處理器,至少類似的處理器;

(2)參考板與開發板具有相同的外圍接口電路,至少基本接口相同;

(3)Linux內核已經支持參考板,至少有非官方的補丁或者BSP;

(4)參考板Linux設備驅動工作正常,至少已經驅動基本接口。

根據以上原則,本課題選擇SMDK2410作為參考板。修改頂層Makefile文件,指定體系結構和編譯器地址:

ARCH := arm

CROSS_COMPILE := /usr/local/arm/3.4.1/bin/arm-linux-

5.3.2 修改 NAND Flash 分區信息

本課題中,NAND Flash應按照功能分為 4個分區,如圖4-1所示:

圖5-1 NAND Flash分區示意圖 Linux 內核對于 Flash分區由 arch/arm/plat-s3c24xx/common-smdk.c 文件中的 mtd_partition smdk_default_nand_part 結構體定義,默認已經分為了8個區。按照圖4-1的分區信息,修改該結構體為:

static struct mtd_partition smdk_default_nand_part[] = {

[0] = {

.name = “U-boot”,.size = 0x00100000,.offset = 0x0,},[1] = {

.name = “Kernel”,.offset = 0x00100000,.size = 0x00300000,},[2] = {

.name = “RootFS”,.offset = 0x00400000,.size = 0x02800000,},[3] = {

.name = “User”,.offset = 0x02d00000,.size = 0x00f00000,},同時還應根據CPU手冊修改NAND Flash的讀寫時序:

static struct s3c2410_platform_nand smdk_nand_info = {

.tacls

= 0,.twrph0

= 30,.twrph1

= 0,};5.3.3 關閉 ECC 校驗

本設計中,內核都是通過 U-boot 寫到

Nand Flash 的,U-boot 通過的軟件ECC算法產生ECC校驗碼,這與內核校驗的ECC碼不一樣,而內核中的 ECC 碼是由

S3C2410 中

Nand Flash 控制器產生的。所以,我們在這里選擇禁止內核

ECC 校驗.,具體操作如下: 文件drivers/mtd/nand/s3c2410.c中,找到s3c2410_nand_init_chip()函數,將最后一行的

chip-->eccmode

= NAND_ECC_SOFT 改為:

chip-->eccmode

= NAND_ECC_NONE

5.4 CS8900a網卡的移植過程

本課題中使用的LJD2410開發板帶有 CS8900A網卡芯片,并提供RJ-45網絡接口。Linux內核中并沒有為 ARM體系配置CS8900A的網卡驅動,需要自己添加。CS8900A的驅動文件有兩個:CS8900A.h 和CS8900A.c,這兩個文件可以由網絡獲得,將其拷貝至 drivers/net/arm 文件夾下,但這樣并不能使驅動程序正常工作,還應對內核源文件做些修改。

5.4.1 修改硬件地址映射

(1)在/arch/arm/mach-s2410文件夾里建立文件smdk2410.h,添加如下代碼:

#define pSMDK2410_ETH_IO

__phys_to_pfn(0x19000000)

#define vSMDK2410_ETH_IO

0xE0000000

#define SMDK2410_EHT_IRQ

IRQ_EINT9

這三個宏分別定義了網卡的物理地址、虛擬地址和占用的中斷號。

(2)修改/arch/arm/mach-s2410/mach-smdk2410.c,添加如下代碼:

#include

(3)在 map_desc smdk2410_iodesc[]結構題中添加CS8900A對于的 io 空間映射:

static struct map_desc smdk2410_iodesc[] __initdata = {

{ vSMDK2410_ETH_IO , pSMDK2410_ETH_IO, SZ_, MT_DEVICE }, };

5.4.2 添加 CS8900A 內核編譯項

Kconfig 文件是 Linux2.6 內核引入的配置文件,是內核配置選項的源文件。只有在這個文件里加入相應代碼,才能在編譯選項中出現菜單項。

在/drivers/net/arm/Kconfig中增加CS8900A的編譯項代碼:

config

ARM_CS8900

tristate “CS8900 support”

depends on NET_ETHERNET && ARM && ARCH_SMDK2410

help …

最后應在/drivers/net/arm/Makefile 中添加:

obj-$(CONFIG_ARM_CS8900)

+= cs8900.o

以上工作完成后,新移植的CS8900A驅動就可以編譯進內核里了。

5.5 Linux 內核的剪裁配置

配置內核選項是整個移植過程中很重要的一步,本設計使用SMDK2410作為參考開發板,所以可以參考內核中 SMDK2410 開發板的配置文件,通過以下命令將其復制到內核根文件夾下:

$ cp arch/arm/config/smdk2410_defconfig.config 在此基礎上,根據本課題的實際需求進行配置增減。

5.5.1 使用配置菜單

配置內核可以選擇不同的配置界面,圖形界面或者光標界面。由于光標菜單運行時不依賴于X11圖形軟件環境,可以運行在字符終端上,所以光標菜單界面比較通用。圖4-2所示就是執行 make menuconfig出現的配置菜單。

在各級子菜單中,選擇相應的配置時,有 3種選擇,它們代表的含義分別如下:

Y—將該功能編譯進內核。

N—不將該功能編譯進內核。

M—將該功能編譯成可以在需要時動態插入到內核中的模塊。

圖5-2 內核配置主菜單 內核配置原則是:將與內核其他部分關系較遠且不經常且不經常使用的部分功能代碼編譯成可加載模塊,有利于減少內核長度,減小內核消耗的內存,簡化該功能相應的環境改變時對內核的影響;不需要的功能就不選;與內核關系緊密而且經常使用的部分功能代碼直接編譯到內核中。

5.5.2 基本配置選項

Linux內核的各個版本配置餐單各不相同,下面以本課題使用的2.6.24.4版為例,結合本課題的實際需求,簡介下內核的基本配置選項。

(1)General setup:包含通用的一些配置選項,保持默認即可。

(2)Enable loadable module supple:包含支持動態模塊的配置選項,保持默認。

(3)System Type:包含系統平臺列表及其相關的配置,去掉SMDK2410以外所有開發板的支持、開啟s3c2410 DMA支持。

(4)Bus support:包含各種總線配置選項,全部去掉。

(5)Kernel Features:包含內核特性相關選項,保持默認。

(6)Boot options:包含內核啟動相關選項,其中內核啟動參數設置為:

“noinitrd console=ttySAC0,115200 root=/dev/nfs init=linuxrc nfsroot=192.168.0.2:/home/arm/FS/myrootfs mem=64M

ip=192.168.0.10:192.168.0.2:192.168.0.1:255.255.255.0:LJD2410:eth0:off”,支持NFS文件系統。

(7)Floating point emulation:包含浮點數運算仿真功能,需要開啟“NWFPE”選項。

(8)Userapace binary formats:包含支持的應用程序格式,僅保留“ELF”格式支持,去掉其它。

(9)Power management options:包含電源管理功能,保持默認。

(10)Networking:包含網絡功能:需要開啟基本功能選項。

(11)Device Drivers:包含設備驅動選項,下一小節將詳細介紹。

(12)File systems:包含各種文件系統的支持選項,去掉“EX2”等選項,僅保留 ROM 文件系統支持,在“Miscellaneous filesystems”子菜單中近保留“cramfs”文件系統支持,并且開啟NFS文件系統支持,去掉其它選項。

(13)Kernel hacking:包含各種內核調試選項,保持默認。

(14)Security options:包含安全性有關選項,保持默認。

(15)Cryptographic API:包含加密算法,保持默認。

(16)Library routines:包含幾種壓縮和校驗函數,保持默認。5.5.3 驅動程序配置選項

幾乎所有Linux的設備驅動都在“Device Drivers”菜單下,它對設備驅動程序加以歸類,放在子菜單下。本課題對于設備驅動的裁剪較多,具體如下:

(1)MTD support:MTD設備驅動,應添選NAND Flash驅動支持。

(2)Network debice support:網絡設備支持,在子菜單“Ethernet(10 or 100Mbits)”中可以看到CS8900A網卡的配置項,這正是4.4節工作的結果。

(3)Real Time Clock:時鐘驅動選項,應選上“Samsung S3C series SoC RTC”,這樣系統時鐘才能正常運行。

(4)由于嵌入式導航計算機只使用串口作為輸入輸出接口,所以應該剪裁掉那些無用的驅動,包括:并口、ATA及SATA驅動、RAID驅動、ISDN支持、輸入設備驅動、多媒體設備支持、USB 支持以及MMC/SD卡支持。(5)其它驅動支持保持默認即可。

5.5.4 保存配置文件

內核配置主菜單中選擇“Save an Alternate Configuration File”即可將目前的配置狀態保存成文件。程序默認保存為“.config”,此文件位于內核根目錄內,可以直接修改。

5.5.5 編譯 Linux 內核

正式編譯Linux內核之前,應當清理一下內核樹,命令如下:

$ make mrproper

此命令會清除掉.config 文件,所以應當在配置內核之前做。

Linux 2.6 版本的編譯已經簡化,使用一個 make 命令就可以完成諸如建 立文件依賴、生成zImage、編譯模塊、安裝模塊等一系列功能。內核編譯完 成后,將在/arch/arm/boot 目錄中生成 image 和 zIamge 兩個內核映像文件,其中 image 為正常大小的映像文件,而 zImage 為壓縮后的映像文件。此時 編譯好的可加載模塊也被安裝到預定位置,默認為/lib/modules。5.6 內核的下載及啟動

5.6.1 將引導信息加入內核映像

U-boot 引導內核時需要檢查一個 64byte 的頭信息,其中包含了入口地址、映像類型等基本信息。這個引導頭可以用 U-boot 附帶的 mkimage 工具生成,命令如下:

$ mkimage-n 'linux-2.6.24'-A arm-O linux-T kernel-C none-a 0x30008000-e 0x30008040-d zImage zImage.img 各個參數的含義:

-n:設置映像名

-A:設置體系信息

-O:設置操作系統信息

-T:設置映像類型

-c:壓縮類型

-a:讀入地址

-e:入口地址

-d:源映像文件

該命令生成的zImage.img文件就可以下載到開發板運行了。

5.6.2 內核映像的下載及運行

將上一小節中生成的zImage.img文件拷貝到主機tftpboot 文件夾內。啟動開發板,進入U-boot 提示符。使用tftp命令將內核映像下載到開發板內存中:

LJD2410> tftp 0x30008000 zImage.img

TFTP from server 192.168.0.2;our IP is 192.168.0.10

Filename ‘zImage.img’

Load address : 0x30008000

Loading:

####

Done

其中 0x30008000 為指定的下載到內存的地址,zImge.img 就是帶有引導頭的內核映像。當內核下載完成后,可以通過bootm命令啟動內核:

LJD2410> bootm 0x30008000 6 建立根文件系統

6.1 根文件系統概述

6.1.1 根文件系統簡介

對于嵌入式操作系統而言,僅包含內核是不夠的,還必須有文件系統的支持。跟文件系統(root filesystem)是 Linux系統的核心部分,包含系統使用的軟件和庫,以及無偶有用來為用戶提供支持架構和用戶使用的應用軟件,并作為存儲數據讀寫結果的區域。在Linux系統啟動時,首先完成內核安裝及環境初始化,最后會尋找一個文件系統作為根文件系統被加載。Linux系統中使用“/”來唯一表示根文件系統的安裝路徑。嵌入式系統中通常可以選擇的根文件系統有:Romfs, CRAMFS, RAMFS,JFFS2, EXT2等,甚至還可以使用NFS(網絡文件系統)作為根文件系統。

6.1.2 NFS 文件系統與Cramfs文件系統

NFS(Network File System)是由SUN公司發展,并于1984年推出的一種文件系統。它可以讓開發者通過網絡連接,使開發板可以直接掛載主機的某一個指定文件夾作為根文件系統。在嵌入式開發過程中,通常使用這種文件系統搭建交叉編譯環境。

cramfs(Compressed ROM File System)是Linux創始人Linus Torvalds開發的一個適用于嵌入式系統的文件系統。cramfs是一個只讀文件系統,采用了zlib壓縮,壓縮比一般可以達到1:2,但仍可以做到高效的隨機讀取。Linux系統中,通常把不需要經常修改的目錄壓縮存放,并在系統引導的時候再將壓縮文件解開。因為 cramfs 不會影響系統讀取文件的速度,而且是一個高度壓縮的文件系統,因此本課題最終選用cramfs作為根文件系統部署到開發板。

6.2 建立Linux根文件系統目錄

嵌入式Linux根文件系統必須包含一些必須的目錄,比如設備目錄/dev、命令目錄/bin、庫目錄/lib等等。

本課題構建根文件系統的工作目錄是 myrootfs,通過下列命令可以在myrootfs中創建所需的子目錄:

$ mkdir bin dev etc lib proc sbin sys usr $ mkdir usr/bin usr/lib usr/sbin lib/modules $ mkdir mnt tmp var $ chmod 1777 tmp $ mkdir var/lib var/lock var/log var/run var/tmp $ chmod 1777 var/tmp $ mkdir home root boot 這樣,一個基本的根文件系統就建立起來了,但是各個目錄都是空的,缺少各種程序和命令工具,需要進一步完善。心得體會

本課題的目標是為基于ARM9處理器的導航計算機移植Linux操作系統。研究過程中,使用了 LJD2410 型開發板,此開發板的處理器是基于 ARM920T的 Samsung S3c2410,能夠滿足嵌入式導航計算機的硬件需求。本課題所做的工作簡要總結如下:

首先,本文對嵌入式系統、嵌入式Linux操作系統和ARM體系處理器做了簡單介紹,并且分析了嵌入式導航計算機的操作系統需求。

其次,介紹了交叉開發環境的建立。本課題兩臺主機連接開發板的方法,主機分別安裝不同的操作系統,在開發過程中完成不同的工作。通過 TFTP和NFS等網絡服務,實現高效連接,有利于提高開發效率。這部分是整個課題的基礎,之后的所有工作都是在這個基礎上完成的。

第三,本文重點介紹了 Linux 系統的移植過程。Linux 系統移植包括三個方面:啟動加載程序(Bootloader)的移植,Linux 內核的移植和根文件系統的建立。本課題選用功能強大的 U-boot 作為啟動加載程序,通過對其源代碼進行修改,使其可以正常運行于開發板,并且實現下載、燒寫等功能。內核則采用了2008年 4月發布的2.6.24.4版本,移植了網卡驅動,并針對課題需求,進行了修改和裁剪,使得內核加載更快,運行更穩定。根文件系統選用了Cramfs文件系統,這種文件系統采用壓縮格式,存儲空間需求小,但是不影響讀取速度,非常適合與嵌入式Linux系統。這三個方面的工作有前后繼承關系,但是又有一定獨立性,移植過程中應多調試,多實驗。

最后,簡單介紹了系統部署的方法。將Linux 內核和根文件系統部署到開發板后,開發板就可以脫離交叉開發環境而獨立運行,最終達到設計需求。

本課題充分利用前人積累的經驗,結合最新的軟件版本進行移植工作。在移植過程中遇到了許多困難和問題,主要靠查閱文獻和自己的試探性試驗來研究問題,通過多次的實踐,最終得到明確的解決方法。雖然移植后的Linux系統可以正常運行在開發板上,能滿足設計需求。但由于時間倉促,許多問題沒有深入研究,難免會出現一定的疏漏和瑕疵,需要我在今后的學習中不斷努力,加以改進。

下載應用Scratchbox構建基于CF卡的嵌入式linux系統word格式文檔
下載應用Scratchbox構建基于CF卡的嵌入式linux系統.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    嵌入式系統應用與學習心得體會

    μC/OS嵌入式實時操作系統的應用和學習心得 μC/OS-II 是一種基于優先級的搶占式多任務實時操作系統,包含了實時內核、任務管理、時間管理、任務間通信同步(信號量,郵箱,消息......

    《嵌入式系統原理及應用》結課論文格式模版

    《嵌入式系統原理及應用》 結課論文 題目:此處寫論文題目 學姓專班成 號 名 業 級 績 此處填寫學號 此處填寫姓名 機械電子工程 格式如:1班 北京理工大學珠海學院機械與車輛學......

    嵌入式系統及應用結課論文要求

    結課論文要求 1、內容要求:結合課程內容,結合本專業及其研究方向,自選專題闡述嵌入式系統應用技術,主要包括所選專題概述、基于STM32處理器的硬件系統(框圖)和基于嵌入式操作系統(......

    嵌入式系統設計與應用[共5篇]

    第一章: 嵌入式系統定義:以應用為中心,以計算機技術為基礎,軟硬件可裁剪,適應應用系統對功能,可靠性,成本,體積,功耗嚴格要求的專用計算機系統。(一切非PC計算機系統) 嵌入式系統特點:“......

    羅升HITECH 人機CF卡和U盤應用教程

    羅升HITECH 人機CF卡和U盤應用教程 (2008-3-31) 一:歷史數據保存 自1996年天津羅升開始負責HITECH PWS系列人機產品在大陸的推廣和銷售。2005年瑞典Beijer成功并購HITECH(海泰......

    嵌入式系統設計中UML的應用論文(大全)

    摘要:隨著計算機技術的發展,嵌入式系統被廣泛應用到社會生產中。嵌入式計算機系統與普通的個人計算機系統存在很大區別,它具有節約成本、可靠性高等優勢,主要被用于工廠生產設備......

    淺談基于嵌入式系統在教學中的應用論文

    論文關鍵詞:嵌入式系統 Proteus ARM 應用論文摘要:本文指出在嵌入式系統課程的各教學環節引入Proteus、ARM(重點介紹Proteus軟件)軟件,通過動態仿真模型的設計,能用到畢業設計以及......

    嵌入式系統在車輛導航監控系統中的應用

    2017屆結課論文 《嵌入式系統原理及應用》 學生姓名 學 號 所屬學院 專 業 計算機科學與技術 班 級 塔里木大學教務處制 塔里木大學課程論文 目錄 摘要 .........................

主站蜘蛛池模板: 十八禁无遮挡99精品国产| 欧美日韩不卡高清在线看| 日本污ww视频网站| 國产一二三内射在线看片| 饥渴丰满少妇大力进入| 92成人午夜福利一区二区| 国产成人精品综合在线观看| 未满十八18禁止免费无码网站| 亚洲最大无码中文字幕网站| 天天澡天天添天天摸97影院| 无码中文字幕人妻在线一区| 热re99久久精品国产99热| 亚洲 欧洲 日韩 综合在线| 亚洲精品国产自在现线最新| 亚洲国产综合精品2020| 99国产精品久久99久久久| 猫咪av成人永久网站在线观看| 美女被?到高潮喷出白浆漫画入口| 四虎国产精品永久在线动漫| 久久99热狠狠色精品一区| 亚洲国产精品不卡av在线| 精品www日韩熟女人妻| 人妻天天爽夜夜爽一区二区| 邻居少妇张开腿让我爽了在线观看| 人妻无码一区二区三区免费| 免费无码黄网站在线看| 男女啪啪抽搐呻吟高潮动态图| 国产麻豆精品乱码一区| 亚洲中文字幕无码永久免弗| 免费无码又黄又爽又刺激| 国模无码视频一区| 七七88色| 人人澡人人妻人人爽人人蜜桃| 国产97在线 | 中文| 国产精品无码久久av| 熟女乱色一区二区三区| 日本午夜免费福利视频| 少妇做爰免费视频网站| 激情内射亚洲一区二区三区| 婷婷色综合视频在线观看| 亚洲的天堂av无码|