嵌入式系統構架:(硬件+軟件)
應用軟件層:
Application
GNU C Library(glibc)
文件系統:linux
系統層:
API(Systern Call Interface)
OS Core + Power Mannager+ File Manager + GUI Mannager
TCP/IP HTTP WAP DataBase Browser
DDI(Device Drver Interface)
板級支持:BSP:Board Support Package
OEM Adaptation Layer
Device Driver Inerface
Bootloader
硬件層:
CPU,Exiternal devicesweb
嵌入式linux系統組成:算法
啓動加載:bootloader:vivi u-boot
內核:kernel
根文件系統:yaffs編程
系統應用:web server
圖形界面系統:QTEubuntu
搭建基於ARM的嵌入式的linux交叉開發環境:windows
構建嵌入式Linux開發環境=構建交叉編譯環境
目標機資源少,開發機(PC)不能編譯和運行。
PC機編寫調試,下載到目標機運行,實現跨平臺開發。安全
包含:
開發機linux操做系統:redHat,fedora,ubuntu網絡
基本服務:
tftp 文件傳輸,下載內核或文件
先安裝xinuetd服務。
xinetd-2.3.14-18.fc9.i386.rpm
tftp-server-0.48-3.fc9.i386.rpm
tftp-0.48-3.fc9.i386.rpm
nfs :Network File System網絡文件系統(默認已安裝)
開發板的根文件系統掛接在PC機的共享目錄上。數據結構
基本軟件:Qemu:在PC機上模擬ARM開發板運行環境
若是沒有zlib庫,先安裝zlib庫。
zlib-1.2.7.tar.gz
mini2440-HEAD1.tar.gz 架構
交叉編譯工具鏈(設備提供商定製)
arm-linux-gcc-4.3.2.tgz
交叉編譯器 arm-linux-gcc,arm-linux-g++
交叉彙編器: arm-linux-as
交叉連接器:arm-linux-ld
調試器:gdb
庫:lib
二進制工具:binutils:arm-linux-readelf,arm-linux-ar,arm-linux-ranlib,arm-linux-objcopy
開發所需各類源代碼:
內核源代碼:linux-2.6.32.2-mini2440-20100113.tgz
qt工具源代碼:x86-qtopia-20100108.tar.gz
arm-qtopia-20100108.tar.gz
文件系統源代碼:busybox-1.13.3-mini2440.tgz
測試實例程序源代碼:examples-20100108.tar.gz
啓動引導程序源代碼:vboot-src-20100106.tar.gz
bootloader.tgz
目標文件系統源代碼:root_qtopia-20100108.tar.gz
開發所需各類工具:
目標文件系統映象製做工具mkyaffs2image:把root_qtopia目錄製做成鏡像文件(可燒入目標板中)
mkyaffs2image.tgz
安裝logo製做工具LogoMaker:
logomaker.tgz
*****************---BootLoader---*******************
開機後運行的第一個軟件代碼,初始化硬件,和讀入操做系統。基於特定的硬件平臺。
Nand Flash存儲結構:
BootLoader +Boot parameters
Kernel
Root filesystem
vivi: 韓國Mizi公司,被三星收購
RedBoot :紅帽子公司嵌入式調試程序
U-Boot:Univeral Bootloader 德國DENX小組開發,支持多種處理器。多種嵌入式操做系統。
兩種模式:
啓動加載模式:(自舉Autonomous)
stage1(彙編):地址:0x00000000
1.基本硬件設備初始化
關閉中斷,關閉看門狗,配置PLL,配置內存,初始化各工做模式堆棧,配置中斷,拷貝RW段,初始化ZI段
2.爲階段2代碼準備RAM空間
3.拷貝stage2代碼到RAM空間
4.設置好堆棧
5.跳轉到stage2的C程序入口點
stage2(C語言):
1.初始化本階段使用到的硬件
至少一個串口,網絡,USB等,用來和用戶I/O輸出信息。
2.檢測系統內存映射(memory map)。
3.將kernel和根文件系統映像從flash讀到RAM空間。
4.爲kernel設置啓動該參數
5.調用內核
CPU寄存器:R0爲0;R1爲機器類型ID;R2爲啓動參數。(機器類型參見 linux/arch/arm/tools/mach-types目錄)
CPU模式:SVC模式,禁止中斷IRQs,FIQs
MMU和Cache設置:MMU必須關閉,指令Cache可開可不開,數據Cache必須關閉。
下載模式:(DownLoading)
1.supervivi命令中【a】能將文件下載到nandFlash中,而【d】只下載到內存並執行
2.下載線下載到flash用USB,而串口線來傳輸命令,與用戶進行交互,以用來控制
系統引導方式:
1.是用flash存儲設備
2.使用磁盤設備
3.經過網絡引導,適合在開發階段
1.經過tftp下載系統內核
2.內核運行時,經過NFS掛裝根文件系統
U-Boot源代碼目錄結構:
Board:開發板相關文件
Cpu:CPU架構相關代碼
Common:實現Uboot支持命令
Disk:對磁盤的支持
Doc:文檔目錄
Drivers:設備驅動程序
Fs:文件系統的支持
Include:頭文件
configs:開發板相關配置頭文件
asm:CPU體系結構相關頭文件
Net:網絡協議棧相關代碼,tftp,rarp
Tool:生成Uboot的工具源代碼,mkigmage,crc等。
Makefile:1.執行各類board相關配置
2.編譯生成uboot.bin文件
生成Uboot.bin步驟:
1.選擇要使用的board
make smdk2410_config
2.編譯生成u-boot.bin
make CROSS_COMPILE=arm-linux-
已經移植好的MINI2440的UBOOT軟件包:
tekkamanninja-U-boot-2009.11_tekkaman-16deca6.tar.gz
1.使用:在board下已經作好了一個/tekkamanninja/nini2440/
修改Makefile文件,編譯工具爲arm-linux-
make mini2440_config
make
2.本身修改.
1.board下創建本身的開發板目錄my2440,複製相近的各類板文件,更名字my2440.c
2.在include/configs下經過複製增長本身的my2440.h頭文件
3.修改第一階段代碼cpu/arm920t/start.s
4.修改第二階段代碼lib_arm/board.c
5.Makefile修改:1.board下my2440的Makefile中的生成目標文件
2.頂層的Makefile中的綜合資源編譯方式
6.按照上面的方式生成u-boot.bin文件。
u-boot代碼分析:
第一階段:cpu/arm920t/start.s
從start_code 開始, _start_armboot跳轉到.c文件
設置CPU的模式爲SVC模式
關閉看門狗
禁掉全部中斷
設置以CPU的頻率
把本身拷貝到RAM
配置內存區控制寄存器
配置的棧空間
進入C代碼部分
第二階段:lib_arm/board.c,進入到main_loop()命令行循環,接受用戶的輸入命令。而後進項相應工做。
main_loop()函數定義在include/common.h中,實如今common目錄下的main.c中
輸入啓動linux命令,u-boot將kernel映像(zImage)從NandFlash上讀到RAM中,爲內核設置啓動參數,啓動liunx
編譯完成後,在鏈接前,須要讀取連接分配文件cpu/arm920t/uboot.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
board/tekkamanninja/mini2440/lowlevel_init.o (.text)
board/tekkamanninja/mini2440/nand_read.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
_end = .;
}
*****************---Linux內核---*******************
Linux組成結構:
用戶空間
User Applications
GNU C Library(glibc)
系統空間
Systerm Call Interface
Kernel
Architectur-Dependent Kernel Code
在x86中,用戶運行於cpu的Ring3,系統空間運行在Ring0(特權指令);
在ARM中,用戶運行於cpu的usr用戶模式(有限制),系統空間運行在sys系統模式(特權指令);
用戶程序經過系統調用和硬件中斷轉到內核空間。
內核組成:
System Call Interface(SCI)
爲用戶空間提供標準系統調用函數。
Memory Management(MM) 內存管理
控制多個進程安全共享內存
Process Management(PM) 進程管理
1.建立進程
2.中止進程
3.控制:進程調度,共享CPU
4.通訊
Virtual File System(VFS) 虛擬文件系統
Ext2,FAT,NFS
Network Stack 網絡協議棧
網絡協議
Arch
Device Drivers(DD)
源代碼分析(樹形結構):
arch
存放平臺相關的代碼
arm/boot:內核引導代碼(compressed/head.S,內核解壓縮)
arm/kernel,lib,mm:內核實現(信號,時鐘),硬件相關工具函數,內存管理
arm/mach-s3c2410:
arm/tools:在mach-types中保存了linux支持的全部開發板機器編號
arm/configs:可參考的內核配置文件
block
部分塊設備驅動程序
crypto
加密,壓縮,CRC校驗算法
documentation
內核的文檔
drivers
設備驅動程序,佔整個內核代碼一大半。
fs
ext2
fat
每一個子目錄對應一種文件系統實現
include
內核所須要的頭文件
與平臺相關的頭文件放在相應的子目錄中
include/asm-arm/s3c2410
與平臺無關的頭文件在linux子目錄下。
init
內核初始化代碼(非引導代碼),至關於main函數
main.c version.c
ipc
進程間通訊的實現代碼
kernel
Linux主核心大媽,包括進程管理和irq
與平臺相關的代碼在arch/arm/kernel下
lib
庫文件代碼
mm
與平臺無關的內存管理部分
與平臺相關的代碼在arch/arm/mml下
net
網絡協議的實現代碼
ipv4
samples
一些內核編程的範例
scripts
配置內核的腳本
security
SElinux的模塊
sound
音頻設備驅動程序
usr
cpio命令實現
virt
內核虛擬機
內核配置步驟:
配置
Kconfig:arch/arm/Kconfig
1.控制make menuconfig時出現配置選項
2.根據用戶的選擇生成.config配置文件
.config:編譯的時候,Makefile將用它來決定哪些要,哪些是模板,哪些不要。
1.make menuconfig 手動選擇來配置(生成).config
2.make mini2440_defconfig 按開發板的默認配置.config
1.*清理:make distclean
2.配置:make menuconfig
編譯:
頂層Makefile
1.決定根目錄下哪些文件和目錄編進內核
2.設置文件編譯連接選項
3.根據連接腳本arch/arm/kernel/**.lds組織文件生成映像文件
子目錄Makefile(Kbuild)
1.決定當前子目錄下哪些文件和目錄編進內核
2.設置當前目錄下全部文件編譯連接選項
3.編譯:make zImage
make uImage
make modules
vmlinux(未壓縮)->zImage(壓縮)->bzImage(解壓縮至高端內存,內核較大用) ->uImage(U-boot用)
定製本身的linux系統:
在arch/arm/tools/mach_types有對mini2440的支持1999,內核啓動時傳入MACH_TYPE肯定啓動哪一種平臺。
因爲mini2440和smdk2440電路同樣,因此能夠用smdk2440.c來複制一個本身的mini2440.c
1、搭建環境
2、定義系統硬件資源驅動部分
1.NandFlash
2.移植yaffs2文件系統
*****************---文件系統---*******************
文件管理系統:操做系統中負責管理和存儲文件信息的軟件機構。
組成:管理軟件+文件+數據結構
經常使用文件系統
日誌文件系統:數據完整,但系統資源消耗多,適用於硬盤
Ext3
Ramdisk文件系統
RomFS文件系統
CRAMFS
JFFS2 文件系統
YAFFS2(Yet Another Flash filesystem)
爲Nandflash設計的日誌文件系統
啓動過程:
1.內核最後啓動init進程。位於init/main.c中的(init_post()函數)
打開/dev/console設備文件
ramdisk_exiecut_command變量指定了要尋星的程序:
依次尋找:/sbin/init, /etc/int, /bin/init ,bin/sh中的程序, 啓動找到的第一個程序
執行/sbin/init時的環境參數爲「HOME=/」,"TERM=linux"
init啓動系統:位於busybox/init/init.c
初始化控制檯:若內核init啓動搞了console則使用指定設備,若沒有打開則用/dev/null
解析inittab
執行inittab命令,每一個條目用來定義一個子進程的啓動方式。
啓動後,運行的第一程序是根目錄下的linuxrc,指向/bin/busybox鏈接
busybox試圖解析/etc/inittab進一步獲取初始化信息
在init/init.c中的parse_inittab()函數中的new_init_action(SYSINIT,INIT_SCRIPT,""),因此接下來執行
INIT_SCRIPT定義的值,爲/etc/init.d/rcS
文件系統的構建所需文件:
busyBox:集成壓縮了許多linux工具和命令。
root_qtopia:提供了文件系統所需的庫文件。
Mkyaffs2image:yaffs文件系統製做工具(在yaffs2中也有)。
文件系統的構建步驟:
1.建立本身定製的文件系統的目錄結構
2.完成庫文件的定製
3.編譯配置busuybox
4.文件系統中配置文件的製做
5.製做文件系統映像
qt移植qtcreator在windows下編寫了qt應用程序 - 交叉編譯 - 下載到開發板上運行qt應用程序的跨平臺性特色 -- 一次編程處處編譯對於在windows下開發的qt應用程序,在移植到開發板以前必須在linux下使用交叉編譯工具進行編譯實現過程開發板上構建交叉編譯環境在windows下或者linux下開發應用程序使用交叉編譯器進行編譯下載運行