TQ210——下载总结
TQ210——下載總結(jié)
學(xué)習(xí)方法:(分階段學(xué)習(xí))-----內(nèi)核學(xué)習(xí)是一個(gè)長(zhǎng)期的過(guò)程
?????? 1.學(xué)習(xí)使用內(nèi)核提供的接口函數(shù) (涉及到很多操作系統(tǒng)知識(shí),編程規(guī)范)
?????? 2.找到一個(gè)函數(shù)如do_fork來(lái)學(xué)習(xí)進(jìn)程管理模塊
?????? 3.通過(guò)kmalloc函數(shù)來(lái)學(xué)習(xí)進(jìn)程管理,通過(guò)do_irq學(xué)習(xí)中斷管理
1.U-BOOT配置與燒寫常用命令 (生成u-boot.bin)(u-boot下載地址:)
(1) u-boot配置及燒寫
?????? tar xzvf*.zip
?????? tar xjvf*.bz2
?????? 配置:make TQ210_config? 運(yùn)行:make ARCH=armCROSS_COMPILE=arm-linux-
?????? 大約????? 2分鐘后編譯完成,生成u-boot.bin,然后燒寫到開發(fā)板中
?????? 燒寫準(zhǔn)備:網(wǎng)線連接,下載線連接,電源線連接 (ping通就可以),將u-boot.bin復(fù)制到tftp服務(wù)器目錄下 (固化到開發(fā)板起始處)
?????? tftp30000000 u-boot.bin /*下載到內(nèi)存中*/
?????? nand erase0 100000?? /*擦除1M空間*/
?????? nand write30000000 0 100000 /*將30000000處內(nèi)容寫1M到硬盤開始處*/
(2) u-boot命令詳解
?????? help:察看當(dāng)前單板所支持的命令
?????? printenv:打印環(huán)境變量
?????? setenv:添加、修改、刪除環(huán)境變量
?????? saveenv:保存環(huán)境變量
?????? tftp:通過(guò)網(wǎng)絡(luò)下載文件
?????? bootmaddr:執(zhí)行程序,addr是執(zhí)行地址
?????? nand erase起始地址start 長(zhǎng)度len ---???? 擦除start處開始的,長(zhǎng)度為len的區(qū)域
?????? nand write內(nèi)存起始地址 flash起始地址 長(zhǎng)度len --- 將內(nèi)存起始地址處,長(zhǎng)度為len的數(shù)據(jù),寫入flash起始地址處
?????? nand read 內(nèi)存起始地址 flash起始地址 長(zhǎng)度len---將flash起始地址處,長(zhǎng)度為len的數(shù)據(jù),讀到內(nèi)存起始地址處
附:
?????? <1> ?配置 U-Boot
?????? TQ210:? makeTQ210_config
?????? Smart210:? make smart210_config
?????? OK210:? make forlinx_linux_config
?????? OK6410:? make forlinx_nand_ram256_config
?????? Tiny6410:? make tiny6410_config
?????? TQ2440:? make TQ2440_config
?????? Mini2440:? make mini2440_config
?????? <2> 下載與運(yùn)行
?????? TQ210:? tftp 0xc0008000 uImage
?????? Smart210:? tftp 0x20000000 uImage
?????? OK210:? tftp 0xc0008000 uImage
?????? OK6410:? tftp 0xc0008000 uImage
?????? Tiny6410: ?tftp 0xc0008000 uImage
?????? TQ2440:? tftp 0x31000000
?????? Mini2440:? tftp 0x31000000 uImage
?
2.內(nèi)核配置與編譯
(1) 為什么要配置內(nèi)核
?????? 硬件需求? 軟件需求 ----選出需要的,去掉不要的
(2) 內(nèi)核配置方法
?????? makeconfig:基于文本模式的交互式配置
?????? makemenuconfig:基于文本模式的菜單型配置 (更好一些)
?????? <*> 編譯時(shí)比選的
?????? <M> 編譯時(shí)可選的
?????? <>? 不選的
(3) 內(nèi)核配置結(jié)果:放在.config中
(4) 內(nèi)核編譯:make uImage j 2
?????? 編譯好的內(nèi)核位于arch/<cpu>/boot/目錄下uImage
(5) 清理內(nèi)核:make clean?? make distclean
mkimage工具講解:(編譯內(nèi)核時(shí)將mkimage移動(dòng)到/bin目錄下)
uboot源代碼的tools/目錄下有mkimage工具,這個(gè)工具可以用來(lái)制作不壓縮或者壓縮的多種可啟動(dòng)映象文件.
mkimage在制作映象文件的時(shí)候,是在原來(lái)的可執(zhí)行映象文件的前面加上一個(gè)0x40字節(jié)的頭,記錄參數(shù)所指定的信息,這樣uboot才能識(shí)別這個(gè)映象是針對(duì)哪個(gè)CPU體系結(jié)構(gòu)的,哪個(gè)OS的,哪種類型,加載內(nèi)存中的哪個(gè)位置, 入口點(diǎn)在內(nèi)存的那個(gè)位置以及映象名是什么
./mkimage -n 'U-boot' -A arm -O linux -T firmware -Cnone -d u-boot.bin u-boot.img
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
參數(shù)說(shuō)明:
-A 指定CPU的體系結(jié)構(gòu):
取值 表示的體系結(jié)構(gòu)
alpha Alpha
arm A RM
x86 Intel x86
ia64 IA64
mips MIPS
mips64 MIPS 64 Bit
ppc PowerPC
s390 IBM S390
sh SuperH
sparc SPARC
sparc64 SPARC 64 Bit
m68k MC68000
-O 指定操作系統(tǒng)類型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
-T 指定映象類型,可以取以下值:
standalone、kernel、ramdisk、multi、firmware、script、filesystem
-C 指定映象壓縮方式,可以取以下值:
none 不壓縮
gzip 用gzip的壓縮方式
bzip2 用bzip2的壓縮方式
-a 指定映象在內(nèi)存中的加載地址,映象下載到內(nèi)存中時(shí),要按照用mkimage制作映象時(shí),這個(gè)參數(shù)所指定的地址值來(lái)下載
-e 指定映象運(yùn)行的入口點(diǎn)地址,這個(gè)地址就是-a參數(shù)指定的值加上0x40(因?yàn)榍懊嬗袀€(gè)mkimage添加的0x40個(gè)字節(jié)的頭)
-n 指定映象名
-d 指定制作映象的源文件
?/mkimage -A arm-O linux -C gzip -a 0x20008000 -e 0x20008000 -d linux.bin.gz uImage??
-a參數(shù)后是內(nèi)核的運(yùn)行地址,-e參數(shù)后是入口地址
<1> 如果我們沒(méi)用mkimage對(duì)內(nèi)核進(jìn)行處理的話,那直接把內(nèi)核下載到0x30008000再運(yùn)行就行,內(nèi)核會(huì)自解壓運(yùn)行(不過(guò)內(nèi)核運(yùn)行需要一個(gè)tag來(lái)傳遞參數(shù),而這個(gè)tag建議是由bootloader提供的,在u-boot下默認(rèn)是由bootm命令建立的)。
<2>如果使用mkimage生成內(nèi)核鏡像文件的話,會(huì)在內(nèi)核的前頭加上了64byte的信息,供建立tag之用。bootm命令會(huì)首先判斷bootm xxxx 這個(gè)指定的地址xxxx是否與-a指定的加載地址相同。
?????? (1)如果不同的話會(huì)從這個(gè)地址開始提取出這個(gè)64byte的頭部,對(duì)其進(jìn)行分析,然后把去掉頭部的內(nèi)核復(fù)制到-a指定的load地址中去運(yùn)行之
?????? (2)如果相同的話那就讓其原封不同的放在那,但-e指定的入口地址會(huì)推后64byte,以跳過(guò)這64byte的頭部
?
3.內(nèi)核模塊
(1) 特點(diǎn):<1> 模塊本身并不被編譯進(jìn)內(nèi)核文件(zImage或者bzImage)
????????????? ?<2> 可以根據(jù)需求,在內(nèi)核運(yùn)行期間動(dòng)態(tài)的安裝或卸載
(2) 范例
// hello.c #include <linux/init.h> #include <linux/module.h> static int hello_init(void) {printf(KERN_WARNING"Hello,world!\n");return 0; } static void hello_exit(void) {printf("KERN_INFO"Goodbye,world!\n"); } module_init(hello_init);//加載內(nèi)核模塊 module_exit(hello_exit);//卸載內(nèi)核模塊Makefile:
obj -m := hello.o
KDIR := /lib/modules/2.6.../build? # 內(nèi)核代碼路徑
all:
?????? make -C$(KDIR) M=$(PWD) modules
(3) 安裝與卸載
?????? 安裝:insmod? (insmod hello.ko)
?????? 卸載:rmmod?? (rmmod hello)
?????? 查看:lsmod
(4) 模塊聲明
?????? MODULE_LICENSE("遵循的協(xié)議") --- 申明該模塊遵守的許可證協(xié)議,如:“GPL“、”GPL v2“等
?????? MODULE_AUTHOR("作者") --- 申明模塊的作者
?????? MODULE_DESCRIPTION("模塊的功能描述") --- 申明模塊的功能
?????? MODULE_VERSION("V1.0")--- 申明模塊的版本
(5) 模塊參數(shù)
?????? 應(yīng)用程序中:int main(int argc,char**argv)?????? argc表示命令行輸入的參數(shù)個(gè)數(shù),argv中保存輸入的參數(shù)
?????? 內(nèi)核模塊中:通過(guò)宏module_param指定保存模塊參數(shù)的變量,模塊參數(shù)用于在加載模塊時(shí)傳遞參數(shù)給模塊
?????? module_param(name,type,perm)
?????? name:變量的名稱
?????? type:變量類型,bool:布爾型 int:整型 charp:字符串型
?????? perm是訪問(wèn)權(quán)限,S_IRUGO:讀權(quán)限 S_IWUSR:寫權(quán)限
?????? 例如:
????????????? inta = 3;
????????????? char*st;
????????????? module_param(a,int,S_IRUGO);
????????????? module_param(st,charp,S_IRUGO);
(6) 符號(hào)導(dǎo)出
?????? 內(nèi)核符號(hào)的導(dǎo)出使用宏:EXPORT_SYMBOL(符號(hào)名)
(7) 總結(jié)
對(duì)比應(yīng)用程序,內(nèi)核模塊具有以下不同:
?????? <1>.應(yīng)用程序是從頭(main)到尾執(zhí)行任務(wù),執(zhí)行結(jié)束后從內(nèi)存中消失。
?????? <2>.內(nèi)核模塊的初始化函數(shù)結(jié)束時(shí),模塊仍然存在于核中,直到卸載函數(shù)被調(diào)用,模塊才從內(nèi)核中消失。
?
4.Linux內(nèi)核制作 (生成uImage)(www.kernel.com)
解壓:???? tar xzvf *.zip
????????????? tarxjvf *.bz2
步驟:
(1) 清理 make distclean
(2) 配置 make menuconfig ARCH=arm
(3) 編譯 make uImage ARCH=arm CROSS_COMPILE=arm-linux-
?????? 提示:mkimage not found ---mkimage幫助加文件頭
?????? 在u-boot的tools目錄中,移動(dòng)mkimage到/bin下,再重復(fù)(3)操作
(4) 在/arch/arm/boot中生成了uImage
燒寫到開發(fā)板:(固化到開發(fā)板5M處) 具體值參考/drivers/mtd/nand/s3c_nand.c文件
?????? tftp30000000 uImage
?????? nand erase500000 5000000
?????? nand write30000000 500000 500000
環(huán)境變量設(shè)置
?????? setenvbootcmd read 30000000 500000 500000\;bootm 300000
?
5.根文件系統(tǒng)的制作 (套件下載:)
(1) 建立跟文件系統(tǒng)目錄
?????? ---建議使用shell腳本
?????? <1> 創(chuàng)建目錄
????????????? mkdirbin devetc lib proc sbin sys usr mnt tmp var
????????????? mkdirusr/bin usr/lib usr/sbin lib/modules
?????? <2> 創(chuàng)建設(shè)備文件
????????????? cdrootfs/dev
????????????? mknod-m 666 console c51
????????????? mknod-m 666 null c13
?????? <3> 加入配置文件
????????????? taretc.tar.gz ()
????????????? mvetc/*...*/root/etc/ -rf
?????? <4> 編譯安裝busybox
?????? /**************************************************************
?????? 下載 BusyBox 的源碼包
?????? 下載地址:www.busybox.net/downloads,最新版本為busybox-1.20.2
?????? tar jxvfbusybox-1.20.2.tar.bz2
?????? cdbusybox-1.20.2
?????? 修改 Makefile 中的體系結(jié)構(gòu) ARCH 和交叉編譯器前綴 CROSS_COMPILE
?????? vimMakefile
?????? 把 164 行修改為:
?????? CROSS_COMPILE= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-?????? (路徑不要復(fù)制,根據(jù)自己的情況填寫)
?????? 把 190 行修改為:
?????? ARCH = arm
?????? **************************************************************/
????????????? makemenuconfig
???????????????????? BusyboxSettings àbuild Options->
???????????????????? 選中 “Build busybox as astaticbinary”, 靜態(tài)鏈接
???????????????????? CrossCompiler prefix (arm-linux-)
???????????????????? InstallationOptions->
???????????????????? 選中 “Don‘t use /usr”, 選中該項(xiàng)可以避免busybox 被安裝到宿主系統(tǒng)的
???????????????????? /usr目錄下,破壞宿主系統(tǒng)
???????????????????? BusyboxInstallation Prefix(/xxx/rootfs)
???????????????????? 該選項(xiàng)表明編譯后的busybox的安裝位置
????????????? make(編譯)
????????????? makeinstall (安裝)???
????????????? 最后生成一個(gè)_install子目錄
????????????? mv_install mini_rootfs
????????????? cdmini_rootfs
????????????? 編寫一個(gè)腳本文件(略)--用于創(chuàng)建目錄和文件的
(2) 掛載跟文件系統(tǒng)
?????? <1> 拷貝交叉編譯器里的動(dòng)態(tài)鏈接庫(kù)到 lib 目錄:cp/usr/local/arm/arm-none-linux-gnueabi/lib/ *.so* lib -rdf
?????? <2> 對(duì) lib 目錄下的動(dòng)態(tài)鏈接庫(kù)進(jìn)行裁減:arm-none-linux-gnueabi-striplib/.so
?????? <3> 獲得mkyaffs2image 工具的源碼包:http://fatplus.googlecode.com/files/yaffs2-source.tar
????????????? 編譯mkyaffs2image 工具: ar xvf yaffs2-source.tar
??????????????????????????????????????????????????????? cdyaffs2/utils
??????????????????????????????????????????????????????? make
??????????????????????????????????????????????????????? cpmkyaffs2image /usr/local/bin/
?????? <4> 制作根文件系統(tǒng)鏡像:mkyaffs2image mini_rootfsrootfs.img
?????? <5> 燒寫到開發(fā)板 (rootfs.img) --- 固化到10M出(/drivers/mtd/nand/s3c_nand.c文件)
????????????? tftp30000000 rootfs.img
????????????? nanderase a00000 1400000
????????????? nandwrite.yaffs 30000000 a00000 實(shí)際img大小
環(huán)境變量設(shè)置:
?????? nfs:setenvbootargs console=ttySAC0 root=/dev/nfs rwnfsroot=192.168.1.8:/home/libang/nfs/roof/ip=192.168.1.6:192.168.0.1::255.255.255.0::eth0:off init=/linuxrc
?????? yaffs2:setenvbootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=yaffs2 rw init=/linuxrc
?
6.下載到開發(fā)板總結(jié)
?????? u-boot.bin?? uImage??rootfs.img
固化u_boot:tftp 30000000u-boot.bin
?????? ?? nand erase 0 100000
?????? ?? nand write 30000000 0 100000
固化Kernel:tftp 30000000 uImage
?????? ?? nand erase 500000 500000
?????? ?? nand write 30000000 500000 500000
固化fs:tftp 30000000rootfs.img
?????? ?? nand erase a00000 1400000
?????? ?? nand write.yaffs 30000000 a00000 1400000
引導(dǎo)內(nèi)核:setenv read 30000000500000 500000\;bootm 30000000
引導(dǎo)文件系統(tǒng): 開發(fā)使用--(nfs) setenv bootargsconsole=ttySAC0 root=/dev/nfs rw nfsroot=192.168.1.8:/home/libang/nfs/roof/ip=192.168.1.6:192.168.0.1::255.255.255.0::eth0:off init=/linuxrc?????? (啟動(dòng)nfs:/etc/init.d/nfsrestart)
????????????? ??? 產(chǎn)品使用--- (yaffs2)setenvbootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=yaffs2 rw init=/linuxrc
?
7.內(nèi)核架構(gòu)
(1) 系統(tǒng)調(diào)用接口SCI (System Call Interface):SCI層為用戶空間提供了一套標(biāo)準(zhǔn)的系統(tǒng)調(diào)用函數(shù)來(lái)訪問(wèn)Linux內(nèi)核,搭起了用戶空間到內(nèi)核空間的橋梁.
(2) 進(jìn)程管理PM (Process Management):進(jìn)程管理的重點(diǎn)是創(chuàng)建進(jìn)程(fork、exec),停止進(jìn)程(kill、exit),并控制它們之間的通信(signal 或者 POSIX 機(jī)制).進(jìn)程管理還包括控制活動(dòng)進(jìn)程如何共享CPU,即進(jìn)程調(diào)度.
(3) 虛擬文件系統(tǒng)VFS (Virtual File System):VFS(虛擬文件系統(tǒng))隱藏各種文件系統(tǒng)的具體細(xì)節(jié),為文件操作提供統(tǒng)一的接口
(4) 內(nèi)存管理MM (Memory Management):內(nèi)存管理的主要作用是控制多個(gè)進(jìn)程安全地共享內(nèi)存區(qū)域
(5) 網(wǎng)絡(luò)協(xié)議棧 (Network Stack):內(nèi)核協(xié)議棧為L(zhǎng)inux提供了豐富的網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)
(6) Arch:CPU
(7) 設(shè)備驅(qū)動(dòng)DD (Device Drivers):Linux內(nèi)核中有大量代碼都在設(shè)備驅(qū)動(dòng)程序中,它們控制特定的硬件設(shè)備
?
8.內(nèi)核源代碼 (不允許在windows下解壓,windows下不區(qū)分大小寫)
(1) 下載內(nèi)核源代碼
?????? www.kernel.com--- linux
(2) 內(nèi)核目錄結(jié)構(gòu) (樹狀)
Linux內(nèi)核源代碼采用樹形結(jié)構(gòu)進(jìn)行組織,非常合理地把功能相關(guān)的文件都放在同一個(gè)子目錄下,使得程序更具可讀性
?????? <1>Arch:特定體系結(jié)構(gòu)相關(guān)代碼,內(nèi)核所支持的每種架構(gòu)的 CPU 的相關(guān)目錄集合,在 arch 目錄下,有支持 arm 的目錄、支持 x86的目錄和支持 mips 的目錄等,如:arch/arm、arch/x86 和arch/mips 等
?????? <2>block:塊設(shè)備通用函數(shù)
?????? <3>Document:內(nèi)核源碼說(shuō)明文檔目錄
?????? <4>drives:設(shè)備驅(qū)動(dòng)程序目錄集合, drivers 里的某一子目錄對(duì)應(yīng)著內(nèi)核中的某一種驅(qū)動(dòng)程序,如:drivers/char 為字符設(shè)備驅(qū)動(dòng)程序、drivers/block 為塊設(shè)備驅(qū)動(dòng)程序,drivers/net 為網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序、drivers/usb為usb總線設(shè)備驅(qū)動(dòng)程序、drivers/i2c為i2c總線設(shè)備驅(qū)動(dòng)程序等
???? <5>fs:Linux支持的文件系統(tǒng)的代碼(包括虛擬文件系統(tǒng) VFS),每個(gè)子目錄對(duì)應(yīng)一種文件系統(tǒng),比如 fs/jffs2/、fs/cramfs、fs/ext2/
?????? ||--devpts/* /dev/pts虛擬文件系統(tǒng)*/
?????? ||--ext2/*第二擴(kuò)展文件系統(tǒng)*/
?????? ||--fat/*MS的fat32文件系統(tǒng)*/
?????? ||--isofs/*ISO9660光盤cd-rom上的文件系統(tǒng)*/
?????? <6>include:內(nèi)核的頭文件目錄,如:基本的頭文件(存放在include/linux目錄下)、各種驅(qū)動(dòng)或功能部件的頭文件(比如 include/media、include/video/、include/net)
?????? <7>init:內(nèi)核的初始化代碼(不是內(nèi)核的引導(dǎo)代碼),其中 main.c 文件中的start_kernel 函數(shù)是內(nèi)核引導(dǎo)后運(yùn)行的第一個(gè)函數(shù)
?????? <8>kernel:內(nèi)核管理的核心代碼,與處理器相關(guān)的代碼位于 arch/../kernel目錄下
?????? <9>net目錄
????????????? 網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)代碼
????????????? ||--802?????? /*802無(wú)線通訊協(xié)議核心支持代碼*/
????????????? ||--appletalk???????? /*與蘋果系統(tǒng)連網(wǎng)的協(xié)議*/
????????????? ||--ax25???????????? /*AX25無(wú)線INTERNET協(xié)議*/
????????????? ||--bridge????????????? /*橋接設(shè)備*/
????????????? ||--ipv4????????? /*IP協(xié)議族V4版32位尋址模式*/
????????????? ||--ipv6???????? ?????/*IP協(xié)議族V6版*/?
總結(jié)
以上是生活随笔為你收集整理的TQ210——下载总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 孪生网络
- 下一篇: CTF 这个看起来有点简单