出版時間:2012-5 出版社:人民郵電出版社 作者:[美] Christopher Hallinan 頁數(shù):454 字?jǐn)?shù):697000 譯者:周鵬
Tag標(biāo)簽:無
內(nèi)容概要
《嵌入式Linux基礎(chǔ)教程(第2版)》是嵌入式Linux的經(jīng)典教程,介紹了引導(dǎo)加載程序、系統(tǒng)初始化、文件系統(tǒng)、閃存和內(nèi)核、應(yīng)用程序調(diào)試技巧等,還講述了構(gòu)建Linux系統(tǒng)的工作原理,用于驅(qū)動不同架構(gòu)的配置,Linux內(nèi)核源碼樹的特性,如何根據(jù)需求配制內(nèi)核運行時的行為,如何擴(kuò)展系統(tǒng)功能,用于構(gòu)建完整嵌入式Linux發(fā)行版的常用構(gòu)建系統(tǒng),USB子系統(tǒng)和系統(tǒng)配置工具udev等內(nèi)容。更重要的是,《嵌入式Linux基礎(chǔ)教程(第2版)》闡述了如何修改系統(tǒng)使之滿足讀者自身的需求,確保讀者能夠從中學(xué)習(xí)一些嵌入式工程中非常有用的提示和技巧?!肚度胧絃inux基礎(chǔ)教程(第2版)》適合Linux程序員閱讀,也可作為高等院校相關(guān)專業(yè)師生的參考讀物。
作者簡介
作者:(美)Hallinan
書籍目錄
第1章 入門
1.1 為什么選擇Linux
1.2 嵌入式Linux現(xiàn)狀
1.3 開源和GPL
1.4 標(biāo)準(zhǔn)及相關(guān)組織
1.4.1 Linux標(biāo)準(zhǔn)基礎(chǔ)
1.4.2 Linux基金會
1.4.3 電信級Linux
1.4.4 移動Linux計劃:Moblin
1.4.5 服務(wù)可用性論壇
1.5 小結(jié)
第2章 綜述
2.1 嵌入與非嵌入
2.2 剖析嵌入式系統(tǒng)
2.2.1 典型的嵌入式Linux開發(fā)環(huán)境
2.2.2 啟動目標(biāo)板
2.2.3 引導(dǎo)內(nèi)核
2.2.4 內(nèi)核初始化:概述
2.2.5 第一個用戶空間進(jìn)程:init
2.3 存儲
2.3.1 閃存
2.3.2 NAND型閃存
2.3.3 閃存的用途
2.3.4 閃存文件系統(tǒng)
2.3.5 內(nèi)存空間
2.3.6 執(zhí)行上下文
2.3.7 進(jìn)程虛擬內(nèi)存
2.3.8 交叉開發(fā)環(huán)境
2.4 嵌入式Linux發(fā)行版
2.4.1 商業(yè)Linux發(fā)行版
2.4.2 打造自己的Linux發(fā)行版
2.5 小結(jié)
第3章 處理器基礎(chǔ)
3.1 獨立處理器
3.1.1 IBM 970FX
3.1.2 英特爾奔騰M
3.1.3 英特爾凌動TM
3.1.4 飛思卡爾MPC7448
3.1.5 配套芯片組
3.2 集成處理器:片上系統(tǒng)
3.2.1 Power架構(gòu)
3.2.2 飛思卡爾Power架構(gòu)
3.2.3 飛思卡爾PowerQUICC I
3.2.4 飛思卡爾PowerQUICC II
3.2.5 PowerQUICC II Pro
3.2.6 飛思卡爾PowerQUICC III
3.2.7 飛思卡爾QorIQTM
3.2.8 AMCC Power架構(gòu)
3.2.9 MIPS
3.2.10 Broadcom MIPS
3.2.11 其他MIPS
3.2.12 ARM
3.2.13 德州儀器ARM
3.2.14 飛思卡爾ARM
3.2.15 其他ARM處理器
3.3 其他架構(gòu)
3.4 硬件平臺
3.4.1 CompactPCI
3.4.2 ATCA
3.5 小結(jié)
第4章 Linux內(nèi)核:不同的視角
4.1 背景知識
4.1.1 內(nèi)核版本
4.1.2 內(nèi)核源碼庫
4.1.3 使用git下載內(nèi)核代碼
4.2 Linux內(nèi)核的構(gòu)造
4.2.1 頂層源碼目錄
4.2.2 編譯內(nèi)核
4.2.3 內(nèi)核主體:vmlinux
4.2.4 內(nèi)核鏡像的組成部分
4.2.5 子目錄的布局
4.3 內(nèi)核構(gòu)建系統(tǒng)
4.3.1 .config文件
4.3.2 配置編輯器
4.3.3 Makefile目標(biāo)
4.4 內(nèi)核配置
4.4.1 定制配置選項
4.4.2 內(nèi)核Makefile
4.5 內(nèi)核文檔
4.6 獲得定制的Linux內(nèi)核
4.7 小結(jié)
第5章 內(nèi)核初始化
5.1 合成內(nèi)核鏡像:Piggy及其他
5.1.1 Image對象
5.1.2 與具體架構(gòu)相關(guān)的對象
5.1.3 啟動加載程序
5.1.4 引導(dǎo)消息
5.2 初始化時的控制流
5.2.1 內(nèi)核入口:head.o
5.2.2 內(nèi)核啟動:main.c
5.2.3 架構(gòu)設(shè)置
5.3 內(nèi)核命令行的處理
5.4 子系統(tǒng)初始化
5.5 init線程
5.5.1 通過initcalls進(jìn)行初始化
5.5.2 initcall_debug
5.5.3 最后的引導(dǎo)步驟
5.6 小結(jié)
第6章 用戶空間初始化
6.1 根文件系統(tǒng)
6.1.1 FHS:文件系統(tǒng)層次結(jié)構(gòu)標(biāo)準(zhǔn)
6.1.2 文件系統(tǒng)布局
6.1.3 最小化的文件系統(tǒng)
6.1.4 嵌入式根文件系統(tǒng)帶來的挑戰(zhàn)
6.1.5 試錯法
6.1.6 自動化文件系統(tǒng)構(gòu)建工具
6.2 內(nèi)核的最后一些引導(dǎo)步驟
6.2.1 第一個用戶空間程序
6.2.2 解決依賴關(guān)系
6.2.3 定制的初始進(jìn)程
6.3 init進(jìn)程
6.3.1 inittab
6.3.2 Web服務(wù)器啟動腳本示例
6.4 初始RAM磁盤
6.4.1 使用initrd進(jìn)行引導(dǎo)
6.4.2 引導(dǎo)加載程序?qū)nitrd的支持
6.4.3 initrd的奧秘所在:linuxrc
6.4.4 initrd探究
6.4.5 構(gòu)造initrd鏡像
6.5 使用initramfs
6.6 關(guān)機(jī)
6.7 小結(jié)
第7章 引導(dǎo)加載程序
7.1 引導(dǎo)加載程序的作用
7.2 引導(dǎo)加載程序帶來的挑戰(zhàn)
7.2.1 DRAM控制器
7.2.2 閃存與RAM
7.2.3 鏡像的復(fù)雜性
7.2.4 執(zhí)行環(huán)境
7.3 通用引導(dǎo)加載程序:Das U-Boot
7.3.1 獲取U-Boot
7.3.2 配置U-Boot
7.3.3 U-Boot的監(jiān)控命令
7.3.4 網(wǎng)絡(luò)操作
7.3.5 存儲子系統(tǒng)
7.3.6 從磁盤引導(dǎo)
7.4 移植U-Boot
7.4.1 EP405的U-Boot移植
7.4.2 U-Boot Makefile中的配置目標(biāo)
7.4.3 EP405的第一次構(gòu)建
7.4.4 EP405 處理器初始化
7.4.5 與具體板卡相關(guān)的初始化
7.4.6 移植總結(jié)
7.4.7 U-Boot鏡像格式
7.5 設(shè)備樹對象(扁平設(shè)備樹)
7.5.1 設(shè)備樹源碼
7.5.2 設(shè)備樹編譯器
7.5.3 使用DTB的其他內(nèi)核鏡像
7.6 其他引導(dǎo)加載程序
7.6.1 Lilo
7.6.2 GRUB
7.6.3 其他更多的引導(dǎo)加載程序
7.7 小結(jié)
第8章 設(shè)備驅(qū)動程序基礎(chǔ)
8.1 設(shè)備驅(qū)動程序的概念
8.1.1 可加載模塊
8.1.2 設(shè)備驅(qū)動程序架構(gòu)
8.1.3 最小設(shè)備驅(qū)動程序示例
8.1.4 模塊構(gòu)建的基礎(chǔ)設(shè)施
8.1.5 安裝設(shè)備驅(qū)動程序
8.1.6 加載模塊
8.1.7 模塊參數(shù)
8.2 模塊工具
8.2.1 insmod
8.2.2 lsmod
8.2.3 modprobe
8.2.4 depmod
8.2.5 rmmod
8.2.6 modinfo
8.3 驅(qū)動程序方法
8.3.1 驅(qū)動程序中的文件系統(tǒng)操作
8.3.2 設(shè)備號的分配
8.3.3 設(shè)備節(jié)點和mknod
8.4 綜合應(yīng)用
8.5 在內(nèi)核源碼樹外構(gòu)建驅(qū)動
8.6 設(shè)備驅(qū)動程序和GPL
8.7 小結(jié)
第9章 文件系統(tǒng)
9.1 Linux文件系統(tǒng)概念
9.2 ext2
9.2.1 掛載文件系統(tǒng)
9.2.2 檢查文件系統(tǒng)的完整性
9.3 ext3
9.4 ext4
9.5 ReiserFS
9.6 JFFS2
9.7 cramfs
9.8 網(wǎng)絡(luò)文件系統(tǒng)
9.9 偽文件系統(tǒng)
9.9.1 /proc文件系統(tǒng)
9.9.2 sysfs
9.10 其他文件系統(tǒng)
9.11 創(chuàng)建簡單的文件系統(tǒng)
9.12 小結(jié)
第10章 MTD子系統(tǒng)
10.1 MTD概述
10.1.1 開啟MTD服務(wù)
10.1.2 MTD基礎(chǔ)
10.1.3 在目標(biāo)板上配置MTD
10.2 MTD分區(qū)
10.2.1 使用Redboot分區(qū)表進(jìn)行分區(qū)
10.2.2 使用內(nèi)核命令行傳遞分區(qū)信息
10.2.3 映射驅(qū)動
10.2.4 閃存芯片驅(qū)動
10.2.5 與具體板卡相關(guān)的初始化
10.3 MTD工具
10.4 UBI文件系統(tǒng)
10.4.1 配置UBIFS
10.4.2 構(gòu)建UBIFS鏡像
10.4.3 使用UBIFS作為根文件系統(tǒng)
10.5 小結(jié)
第11章 BusyBox
11.1 BusyBox簡介
11.2 BusyBox的配置
11.3 BusyBox的操作
11.3.1 BusyBox的init
11.3.2 rcS初始化腳本示例
11.3.3 BusyBox在目標(biāo)板上的安裝
11.3.4 BusyBox小應(yīng)用
11.4 小結(jié)
第12章 嵌入式開發(fā)環(huán)境
12.1 交叉開發(fā)環(huán)境
12.2 對主機(jī)系統(tǒng)的要求
12.3 為目標(biāo)板提供服務(wù)
12.3.1 TFTP服務(wù)器
12.3.2 BOOTP/DHCP 服務(wù)器
12.3.3 NFS服務(wù)器
12.3.4 目標(biāo)板使用NFS掛載根文件系統(tǒng)
12.3.5 U-Boot中使用NFS掛載根文件系統(tǒng)的例子
12.4 小結(jié)
第13章 開發(fā)工具
13.1 GNU調(diào)試器(GDB)
13.1.1 調(diào)試核心轉(zhuǎn)儲
13.1.2 執(zhí)行GDB
13.1.3 GDB中的調(diào)試會話
13.2 數(shù)據(jù)顯示調(diào)試器
13.3 cbrowser/cscope
13.4 追蹤和性能評測工具
13.4.1 strace
13.4.2 strace命令行選項
13.4.3 ltrace
13.4.4 ps
13.4.5 top
13.4.6 mtrace
13.4.7 dmalloc
13.4.8 內(nèi)核oops
13.5 二進(jìn)制工具
13.5.1 readelf
13.5.2 使用readelf查看調(diào)試信息
13.5.3 objdump
13.5.4 objcopy
13.6 其他二進(jìn)制實用程序
13.6.1 strip
13.6.2 addr2line
13.6.3 strings
13.6.4 ldd
13.6.5 nm
13.6.6 prelink
13.7 小結(jié)
第14章 內(nèi)核調(diào)試技術(shù)
14.1 內(nèi)核調(diào)試帶來的挑戰(zhàn)
14.2 使用KGDB進(jìn)行內(nèi)核調(diào)試
14.2.1 KGDB的內(nèi)核配置
14.2.2 在開啟KGDB時引導(dǎo)目標(biāo)板
14.2.3 一些有用的內(nèi)核斷點
14.2.4 KGDB與控制臺共享一個串行端口
14.2.5 調(diào)試非常早期的內(nèi)核代碼
14.2.6 主線內(nèi)核對KGDB的支持
14.3 內(nèi)核調(diào)試技術(shù)
14.3.1 gdb遠(yuǎn)程串行協(xié)議
14.3.2 調(diào)試優(yōu)化的內(nèi)核代碼
14.3.3 GDB的用戶自定義命令
14.3.4 有用的內(nèi)核GDB宏
14.3.5 調(diào)試可加載模塊
14.3.6 printk調(diào)試
14.3.7 Magic SysReq key
14.4 硬件輔助調(diào)試
14.4.1 使用JTAG探測器對閃存進(jìn)行編程
14.4.2 使用JTAG探測器進(jìn)行調(diào)試
14.5 不能啟動的情況
14.5.1 早期的串行端口調(diào)試輸出
14.5.2 轉(zhuǎn)儲printk的日志緩沖區(qū)
14.5.3 使用KGDB調(diào)試內(nèi)核異常
14.6 小結(jié)
第15章 調(diào)試嵌入式Linux應(yīng)用程序
15.1 目標(biāo)調(diào)試
15.2 遠(yuǎn)程(交叉)調(diào)試
15.3 調(diào)試共享程序庫
15.4 調(diào)試多個任務(wù)
15.4.1 調(diào)試多個進(jìn)程
15.4.2 調(diào)試多線程應(yīng)用程序
15.4.3 調(diào)試引導(dǎo)加載程序/閃存代碼
15.5 其他遠(yuǎn)程調(diào)試選項
15.5.1 使用串行端口進(jìn)行調(diào)試
15.5.2 附著到運行的進(jìn)程上
15.6 小結(jié)
第16章 開源構(gòu)建系統(tǒng)
16.1 為什么使用構(gòu)建系統(tǒng)
16.2 Scratchbox
16.2.1 安裝Scratchbox
16.2.2 創(chuàng)建一個交叉編譯目標(biāo)
16.3 Buildroot
16.3.1 安裝Buildroot
16.3.2 配置Buildroot
16.3.3 構(gòu)建Buildroot
16.4 OpenEmbedded
16.4.1 OpenEmbedded的組成
16.4.2 BitBake元數(shù)據(jù)
16.4.3 配方基礎(chǔ)
16.4.4 任務(wù)
16.4.5 類
16.4.6 配置元數(shù)據(jù)
16.4.7 構(gòu)建鏡像
16.5 小結(jié)
第17章 實時Linux
17.1 什么是實時
17.1.1 軟實時
17.1.2 硬實時
17.1.3 Linux調(diào)度
17.1.4 延時
17.2 內(nèi)核搶占
17.2.1 搶占的障礙
17.2.2 搶占模式
17.2.3 SMP內(nèi)核
17.2.4 搶占延時的根源
17.3 實時內(nèi)核補丁
17.3.1 實時補丁的特性
17.3.2 O(1)調(diào)度器
17.3.3 創(chuàng)建實時進(jìn)程
17.4 實時內(nèi)核的性能分析
17.4.1 使用Ftrace追蹤內(nèi)核行為
17.4.2 檢測搶占被關(guān)閉的延時
17.4.3 檢測喚醒延時
17.4.4 檢測中斷被關(guān)閉的延時
17.4.5 檢測Soft Lockup
17.5 小結(jié)
第18章 通用串行總線
18.1 USB概述
18.1.1 USB的物理拓?fù)浣Y(jié)構(gòu)
18.1.2 USB的邏輯拓?fù)浣Y(jié)構(gòu)
18.1.3 USB版本
18.1.4 USB連接器
18.1.5 USB線纜
18.1.6 USB模式
18.2 配置USB
18.3 sysfs和USB設(shè)備命名
18.4 實用的USB工具
18.4.1 USB文件系統(tǒng)
18.4.2 使用usbview
18.4.3 USB 實用程序(lsusb)
18.5 通用USB子系統(tǒng)
18.5.1 USB大容量存儲類
18.5.2 USB HID類
18.5.3 USB CDC類驅(qū)動
18.5.4 USB網(wǎng)絡(luò)支持
18.6 USB調(diào)試
18.6.1 usbmon
18.6.2 實用USB雜記
18.7 小結(jié)
第19章 udev
19.1 什么是udev
19.2 設(shè)備發(fā)現(xiàn)
19.3 udev的默認(rèn)行為
19.4 理解udev規(guī)則
19.4.1 Modalias
19.4.2 典型的udev規(guī)則配置
19.4.3 udev的初始系統(tǒng)設(shè)置
19.5 加載平臺設(shè)備驅(qū)動程序
19.6 定制udev的行為
19.7 持久的設(shè)備命名
19.8 udev和busybox配合使用
19.8.1 busybox mdev
19.8.2 配置mdev
19.9 小結(jié)
附錄A 可配置的U-Boot命令
附錄B BusyBox命令
附錄C SDRAM接口注意事項
附錄D 開源資源
附錄E 簡單的BDI-2000配置文件
章節(jié)摘錄
版權(quán)頁: 插圖: 在交叉開發(fā)環(huán)境中開發(fā)軟件要求編譯器運行于開發(fā)主機(jī)上,但生成的二進(jìn)制可執(zhí)行文件的格式與開發(fā)主機(jī)不兼容,不能在上面運行。這類工具存在的主要原因是,在資源(一般指內(nèi)存大小和CPU性能)受限的嵌入式系統(tǒng)上本地開發(fā)和編譯代碼常常是不現(xiàn)實或不可能的。 這種開發(fā)方式隱藏著很多陷阱,嵌入式開發(fā)的新手稍不留神就會中招。當(dāng)編譯一個程序時,編譯器一般都知道怎樣找到所需要的頭文件和正確編譯代碼必需的程序庫。為了說明這些概念,我們再看一下“Hello world”。代碼清單2—4qh的示例代碼是使用下面的命令行進(jìn)行編譯的: gee—Wall—o hello hello.c 在代碼清單2.4中,我們看到這個程序代碼包含了一個頭文件stdi0.h。這個文件和我們在gcc命令行中指定的文件hello.C不在同一個目錄中。那么,編譯器是如何找到它的呢?另外,函數(shù)print f()也不是在文件hell0.C中定義的。因此,編譯hello.C后,它會包含一個對此符號的未解析的引用(unresolved reference)。鏈接器在鏈接時是怎樣解析這個引用的呢? 編譯器使用一些默認(rèn)的搜索路徑來定位頭文件。在代碼中引用某個頭文件時,編譯器在默認(rèn)的幾個搜索路徑中查找這個文件。類似地,鏈接器也是以這種方式來解析對外部符號print f()的引用。鏈接器知道默認(rèn)在C庫(libc.+)中搜索未解析的引用,并且知道在系統(tǒng)中的哪些位置可以找到這些程序庫。再說明一下,這種默認(rèn)行為是內(nèi)置于工具鏈中的。 現(xiàn)在假設(shè)你為某個采用Power架構(gòu)的嵌入式系統(tǒng)編寫應(yīng)用程序。顯然,你需要一個交叉編譯器,用于生成兼容Power架構(gòu)處理器的二進(jìn)制可執(zhí)行文件。如果你使用交叉編譯器,并采用類似的編譯命令來編譯前面的hello.C程序,在解析對外部符號print f()的引用時,鏈接器很可能會意外地將二進(jìn)制可執(zhí)行文件鏈接到一個x86版本的c庫。當(dāng)然,由于生成的可執(zhí)行程序混合了Power架構(gòu)和x86二進(jìn)制指令,如果運行這個錯誤的混合體,其結(jié)果是可以預(yù)見的,那就是系統(tǒng)崩潰! 擺脫這個困境的方法是指引交叉編譯器在非標(biāo)準(zhǔn)路徑中進(jìn)行查找,以使用針對目標(biāo)架構(gòu)的頭文件和程序庫。我們將在第12章中詳細(xì)討論這個主題。這個例子旨在說明兩種開發(fā)環(huán)境的區(qū)別,即本地開發(fā)環(huán)境和嵌入式系統(tǒng)所需的交叉編譯開發(fā)環(huán)境。這只是交叉開發(fā)環(huán)境復(fù)雜性的一個方面。交叉調(diào)試中也會出現(xiàn)相同的問題和解決方案,從第14章開始,你會了解到這些內(nèi)容。正確地搭建交叉開發(fā)環(huán)境對于成功至關(guān)重要,你將在第12章中看到,這不僅僅涉及編譯器,還包括其他很多內(nèi)容。 2.4嵌入式Linux發(fā)行版 到底什么是Linux發(fā)行版?Linux內(nèi)核完成系統(tǒng)引導(dǎo)后,它會找到并掛載一個根文件系統(tǒng)。一旦合適的根文件系統(tǒng)被成功掛載,啟動腳本會啟動很多系統(tǒng)需要的程序和實用工具。
編輯推薦
嵌入式Linux權(quán)威著作Amazon全五星評價全面剖析構(gòu)建嵌入式Linux開發(fā),揭示大量技術(shù)內(nèi)幕
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載
嵌入式Linux基礎(chǔ)教程(第2版) PDF格式下載