Linux內核學習和研究及嵌入式(ARM)學習和研究的開放文檔
Free Child(lli_njupt@163.com Freechild創業團隊,致力於嵌入式網絡設備(Gateway,Router,AP,NAS,FireWall)和智能家庭終端設備(EoC,DLNA,家電控制)),信息採集控制終端(環境監測,數據採集)等開發,提供全套軟件解決方案及維護.
目錄
- 1 寫在前面
- 1.1. 它是什麼?
- 1.2. 它不是什麼?
- 1.3. 它的始末?
- 2 ARM彙編語言
- 2.1. ARM命名規則
- 2.2. 程序狀態寄存器
- 2.3. ARM指令格式
- 2.4. 測試用例
- 2.5. 原碼和補碼
- 2.6. 條件碼標誌位
- 2.7. 跳轉指令
- 2.8. 協處理器指令
- 2.9. ARM彙編偽指令
- 2.10. Sandbox
- 3 ARM尋址方式
- 3.1. 立即數尋址
- 3.2. 寄存器尋址
- 3.3. 寄存器間接尋址
- 3.4. 基址尋址
- 3.5. 寄存器移位尋址
- 3.6. 堆棧尋址
- 3.7. 多寄存器尋址
- 3.8. 塊拷貝尋址
- 3.9. 相對尋址
- 4 批量加載和存儲指令實踐
- 4.1. 測試源碼
- 4.2. stmfd和ldmfd
- 4.3. stmfa和ldmfa
- 4.4. stmed和ldmed
- 4.5. stmea和ldmea
- 4.6. ldmib和stmib
- 4.7. ldmia和stmia
- 4.8. ldmdb和stmdb
- 4.9. ldmda和stmda
- 5 ATPCS和內嵌彙編
- 5.1. ARM寄存器
- 5.2. 寄存器使用規則
- 5.3. 數據棧的使用
- 5.4. 返回值與寄存器
- 5.5. 內嵌彙編
- 5.6. Sandbox
- 6 Uboot啟動分析
- 6.1. 硬件引導
- 6.2. bootm
- 6.3. do_bootm_linux
- 6.4. tag處理函數
- 6.5. Sandbox
- 7 zImage的生成和加載
- 7.1. 相關的Makefile
- 7.2. vmlinux的格式
- 7.3. 靜默編譯和V=1
- 7.4. 生成zImage的命令行
- 7.5. Makefile.build和vmlinux壓縮
- 7.6. .cmd文件
- 7.7. V=2
- 7.8. piggy.gz
- 7.9. vmlinux的生成命令
- 7.10. vmlinux-xxx
- 7.11. vmlinux.lds和vmlinux.lds.S
- 7.12. head.S
- 7.13. 重定位內核
- 8 內核加載
- 8.1. head.S
- 8.2. 檢查處理器類型
- 8.3. 檢查機器類型
- 8.4. 創建內核段頁表
- 8.5. 使能MMU
- 8.6. 0號進程
- 9 內核初始化
- 9.1. CPU掩碼
- 9.2. 內核版本信息
- 9.3. 內存屏障
- 9.4. 內核搶佔
- 9.5. printk
- 9.6. setup_arch
- 9.7. 直接地址轉換
- 9.8. 內核頁表
- 9.9. bootmem_init
- 9.10. devicemaps_init
- 9.11. 0頁
- 9.12. Sandbox
- 10 Bootmem機制
- 10.1. 簡介
- 10.2. bootmem_data
- 10.3. UMA和NUMA
- 10.4. Debug機制
- 10.5. 初始化函數
- 10.6. reserve和free
- 10.7. alloc_bootmem_core
- 10.8. Bootmem alloc宏
- 10.9. 標記函數
- 10.10. Bootmem機制的應用
- 10.11. Sandbox
- 11 內核初始化2
- 11.1. resource資源分配
- 11.2. cpu_init
- 11.3. early_trap_init
- 11.4. sched_init
- 11.5. setup_command_line
- 11.6. build_all_zonelists
- 11.7. page_alloc_init
- 11.8. 第二階段的參數解析
- 11.9. rcu_init
- 11.10. init_IRQ
- 11.11. pidhash_init
- 11.12. init_timers
- 11.13. hrtimers_init
- 11.14. Sandbox
- 11.15. Sandbox
- 12 頁表機制
- 12.1. 引言
- 12.2. 一級頁表
- 12.3. ARM 內存訪問
- 12.4. ARM MMU頁表
- 12.5. 頁面訪問控制
- 12.6. create_mapping
- 12.7. alloc_init_section
- 12.8. alloc_init_pte
- 12.9. set_pte_ext
- 12.10. Sandbox
- 13 內存管理
- 13.1. 引言
- 13.2. page管理項
- 13.3. bootmem_free_node
- 13.4. free_area_init_node
- 13.5. free_area_init_core
- 13.6. memmap_init_zone
- 13.7. build_all_zonelists
- 13.8. __build_all_zonelists
- 13.9. build_zonelists
- 13.10. build_zonelists_node
- 13.11. build_all_zonelists
- 14 夥伴系統
- 14.1. 初始化zone
- 14.2. 收集空閒內存
- 14.3. vmalloc
- 14.4. Sandbox
- 15 IO設備管理
- 15.1. 總線
- 15.2. 資源resource
- 15.3. 系統實現
- 15.4. Sandbox
- 16 中斷處理
- 16.1. 概述
- 16.2. CPU處理
- 16.3. 中斷向量
- 16.4. __irq_svc
- 16.5. 中斷示例
- 16.6. 中斷控制器
- 16.7. 中斷控制寄存器
- 16.8. Linux內核中斷抽象
- 16.9. Linux內核中斷註冊
- 16.10. 軟中斷
- 16.11. Tasklet
- 16.12. Sandbox
- 17 內核參數解析
- 17.1. 前言
- 17.2. parse_args
- 17.3. 第二階段
- 17.4. Sandbox
- 18 時鐘管理
- 18.1. 基本概念
- 18.2. S3C6410 PLL
- 18.3. S3C6410 CLK
- 18.4. 選擇時鐘源
- 18.5. 選通時鐘源
- 18.6. PWM 定時器
- 18.7. 時鐘源初始化
- 18.8. 內核計時體系
- 18.9. 時鐘中斷註冊
- 18.10. 時鐘中斷處理
- 18.11. RTC時鐘
- 18.12. 內核定時器
- 19 內核通知鏈
- 19.1. 概述
- 19.2. 數據結構
- 19.3. 運作機制
- 19.4. Sandbox
- 20 內核同步
- 20.1. 內核搶佔
- 20.2. 內存屏障
- 20.3. 臨界區控制
- 20.4. 同步技術
- 20.5. Sandbox
- 21 Linux設備模型
- 21.1. 設備文件
- 21.2. 字符設備註冊
- 21.3. 關聯文件系統
- 21.4. 字符設備操作
- 21.5. 阻塞I/O
- 21.6. 異步通知
- 21.7. Sandbox
- 22 網絡設備驅動
- 22.1. MAC和PHY
- 22.2. MDIO和MII
- 22.3. MII數據接口
- 22.4. RMII數據接口
- 22.5. MII管理接口MDIO
- 22.6. 常用單口以太網控制器
- 22.7. DM9000A簡介
- 22.8. 註冊DM9000A設備
- 22.9. 註冊網卡驅動
- 23 Linux模式設計
- 23.1. 數據大小
- 23.2. 數據比較
- 23.3. 數據圓整
- 23.4. 數據對齊
- 23.5. 位圖操作
- 23.6. 結構體成員互訪
- 23.7. 結構體大小運算
- 23.8. 編譯器檢查
- 23.9. Sandbox
- 24 附錄
- 24.1. 參考書目
- 24.2. 參考網絡資源
- 24.3. Sandbox
1. 寫在前面
1.1. 它是什麼?
一個Linux及相關開源軟件的愛好者,在學習,分析和研究Linux內核過程中,對相關知識的總結和記錄。一些參考書籍是必須的,參考Linux內核探索之路——關於書所提到的,本文中的部分內容參考了這裡提到的書籍 (ULK和LKA尤甚)。
一個基於ARM(當前階段)的嵌入式驗證平臺。無論如何,用實際去驗證猜想,才能保證學習,分析和研究結果的正確性。一個詳細的平臺信息如下所示:
MainBoard:OK6410
CPU: S3C6410(ARMv6)
RAM: 256M
FLASH:1G K9GAG08U0D
Kernel:Linux2.6.28
BootLoader:Uboot1.1.6
但是並不意味著本文中關於Linux內核部分與平臺獨立的代碼和硬件平臺相關。
本文檔遵循GNU Free Documentation License發佈。
本文檔適用Docbook自動生成,並在以後的很長一段時間內不斷更新。當前對Bootloader的引導,ARM平臺的彙編,Linux內核的引導和部分模塊:時鐘,中斷,內存管理系統等進行了學習和總結,並輔助大量的示例圖片,該文檔是筆者學習和研究的記錄,筆者歡迎任何對該文檔的批評和建議:可以直接在該文章下評論,並且任何希望對該文檔做出貢獻的人,可以向筆者發出文檔的更新請求,格式為符合Docbook規範的xml文檔,也可以索取當前文檔的原始的Docbook開發文檔。
目前每一章節下都有Sandbox一節,該章節僅僅是Docbook開發中的語法參考章節,無實際意義,所以閱讀該文檔時請直接忽略該節,另外對於Linux中部分分析中,由於筆者關心的領域不同,所以某些點分析的很詳細(大多數都是不好理解的地方),有些只是貼上了實現代碼,所以目前該文檔還處於不同的更新之中。另外該文檔的章節並沒有嚴格遵循由淺入深的原則,所以部分章節並沒有必然的聯繫,但是一個整體的過程是對Linux內核有基礎瞭解,ARM平臺的ATPCS原則,然後是在此基礎上的學習和分析。
1.2. 它不是什麼?
無論如何,筆者都要說明,它是一個筆記式的學習記錄,不是一本教科書,筆者不能保證這裡的內容都是正確無誤的。筆者也不保證這裡的分析針對特定的其他平臺依然適用(儘管大多數時候應該是)。
1.3. 它的始末?
應該是2007年,但是隻是以零散的方式存在。如前所述,它的演化方式並不是以章節形式,而是以筆者的時間和興趣為轉移。大約是2011年時,整理了大部分的文檔,一併轉換為Docbook文檔形式,直到今天的這個樣子。
有開始,就註定了要有結束,但是目前來看還會持續很長一段時間......