menu 簡述嵌入式linux系統移植的主要內容有哪些?linux
1> 搭建交叉開發環境面試
2> 移植bootloader編程
3> 移植linux內核服務器
4> 製做根文件系統網絡
1、搭建交叉開發環境架構
一、交叉編譯工具鏈的製做(GCC交叉編譯器的生成)函數
(1) 下載Binutils、GCC、Glibc源碼工具
(2) 配置並編譯Binutils取得所需的彙編和連接程序(鏈接程序ld,彙編程序as,主要爲GNU系統提供彙編和鏈接工具)測試
(3) 配置並編譯GCC源碼生成GCC編譯器。(主要爲GNU系統提供C編譯器)spa
(4) 配置Glibc並編譯生成Glibc的c函數庫(一些基本的C函數和其餘函數定義)
(5) 再次配置和編譯GCC源碼,生成其餘語言的編譯器,如C++編譯器(通常是C編譯器首先生成,而後以這個爲基礎,結合生成的Glibc的C函數庫,再編譯生成其餘編譯器)
【注】工具鏈依賴內核版本
二、二進制工具Binutils
ld:
as:
objcopy:objcopy 是用來進行目標格式轉換的
objdump:objdump 是用來反彙編的
strings:
strip:strip 是丟棄目標文件的所有或者特定符號,減小文件體積的
addr2line: addr2line 是用來把程序地址轉換爲文件名和行號的
ar:ar 是用來將目標文件生成靜態庫的
三、配置主機方必須的軟件
(1)tftp服務器
Tftp用來下載遠程文件的最簡單網絡協議,基於UDP協議實現
(2)nfs服務器
主要將本地的一個目錄經過網絡輸出,其餘計算機能夠遠程掛接這個目錄並進行訪問。
Nfs有本身的協議和端口,但在文件傳輸或其餘相關信息傳遞的時候,NFS使用遠程過程調用協議(RPC),RPC負責管理端口號的對應與服務相關的工做。NFS自己沒有傳輸文件的協議。
2、 U BOOT
2010.08版本以前的Uboot架構比較簡單,以後的版本架構變複雜。
(1)bootloader是系統加電或復位時首先運行的一段代碼,
(2)做用:對系統的軟硬件作相應的初始化,爲操做系統的加載運行作好準備。
(3)ARM平臺經常使用的bootloader:u-boot、 redboot、 blob 、 vivi
2.描述u-boot啓動流程
u-boot啓動分爲兩個階段:
第一個階段用匯編實現。設置中斷向量表->設置SVC模式、中斷和時鐘 ->
關閉看門狗、mmu和cache->初始化內存控制器->自搬移->設置堆棧、清空bss段
第二個階段用C實現。調用一系列初始化函數->初始化Flash設備和環境變量->
初始化網絡設備->進入循環
(1). bootloader向內核傳參的方式有param_struct、 tag;
(2) u-boot的命令中,設置環境變量的命令是 setenv
(3) u-boot中存放內核啓動參數的環境變量是 bootargs
(4)linux要求bootloader在運行內核前,讓系統進入 SVC 模式
(5)linux要求bootloader將平臺號保存在 r1
5.uboot
uboot倒計時,由自啓動腳本決定
bootargs:選擇啓動方式
交叉調試:gdb_server(交叉編譯工具鏈裏有)
CP到nfs掛載的路徑下,
3、linux內核移植
一、內核概念
二、功能(linux內核的五大任務)
進程管理、內存管理、文件系統支持、設備管理(驅動)、網絡協議
三、組織結構
四、配置內核(內核裁剪:make menuconfig)
(1)頂層Makefile
(2)kconfig(裁剪 菜單選項的來源,添加刪除選項)
(3)arch/arm…/mach/…板級信息
(4)arch…/smdkc100.c 板級驅動配置信息
五、編譯內核(make zImage)
六、添加驅動
(1)網卡
(2)LED
(3)Nand分區
(4)SD卡
(5)LCD
七、可能考的面試題
配置內核時,保留了什麼,裁剪了什麼?
項目中前期開發模式是nfs掛載的方式,全部配置了nfs服務,配置了DM9000的驅動,便於tftp下載;項目中主控端用到了zigbee模塊,GPRS模塊,因此分別配置了USB轉串口驅動。項目中沒有用到SPI驅動,因此把這部分裁剪了。
【注】make zImage:編譯生成內核的可移植鏡像
make modules:以M形式控制的部分才能編譯
8.linux內核啓動流程
(1)Bootloader:
a.硬件上電後跳到一個固定位置執行相應的代碼
b.初始化相應的設備
c.加載內核的代碼到內存
d.跳到內核代碼起始位置執行
(2)Kernel
a.內核自解壓
b.初始化靜態編譯進內核的驅動模塊(須要訪問rootfs)
c.掛載rootfs(須要訪問、運行用戶空間的程序)
d.直接執行第一個用戶空間程序
(3)第一個用戶空間程序
配置用戶環境,執行服務進程
9.linux調試內核方法介紹
當console初始化之後,通常最爲簡單的內核調試方式爲: printk
printk支持幾種打印級別?
8種(0~7)
十一、內核相關問題:
(1)編譯內核鏡像命令 make zImage
編譯模塊的命令 make modules
(2)第一次配置內核時,應使用的缺省內核配置文件是什麼?
arch/arm/configs/s5pc100_defconfig
(3)存放平臺代碼的文件是什麼(完整路徑)?
arch/arm/mach-s5pc100/mach-smdkc100.c
(4)內核解壓後的入口在哪一個文件?
arch/arm/kernel/start.S
4、rootfs的製做
1.概念
存放運行、維護系統所必須的各類工具軟件、庫文件、腳本、配置文件和其餘特殊文件的地方,也能夠安裝各類軟件包。
2.rootfs製做流程
(1)採用bubybox建立基本命令
(2)建立基本的目錄/lib /etc /var /tmp /dev /sys /proc等
(3)添加glibc基本動態庫
(4)建立基本的設備節點
(5)添加啓動配置和腳本程序(通常etc下有此四個文件)/etc/inittab /etc/fstab /etc/init.d/rcS
另外有一個文件profile也能夠加,用來存放環境變量。
【inittab:定義了各類action。
如:在用busybox製做根文件系統時,若是要求在程序執行前按enter鍵進行確認,添加action:askfirst 】
【rcS:init進程調用的第一個腳本
通常都會有 mount -a(掛載全部fstab下的內容)】
(6)測試根文件系統
(7)製做根文件系統鏡像,如ramdisk cramfs jffs2......
四、根文件系統特性
(1)內核掛載的第一個文件系統,
(2)根文件系統上存放有內核運行的第一個初始化程序init、命令、設備節點、配置文件以及共享庫等等
(3)系統中只能有一個根文件系統
(4)嵌入式linux系統一般用bubybox工具集構建文件系統,以減少系統體積
5.init進程
(1)全部進程的祖宗進程
(2)全部孤兒進程的父進程
六、不一樣的文件系統的區別
(1)yaffs二、jffs2 文件系統能夠運行在nand flash上,並具備可讀寫特性
(2)cramfs 文件系統能夠運行在nand flash上,並具只讀特性
(3)tmpfs 不佔用任何磁盤空間的文件系統
ubifs針對大容量磁盤的文件系統。
yaffs,yaffs2的區別:yaffs按小頁訪問,yaffs2按大頁訪問。
yaffs文件系統有一個致命的bug,在開機時會掃描整個磁盤,速度慢,耗時。因此適用於小容量的磁盤(兆級如下的)。