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文檔形式,直到今天的這個樣子。

有開始,就註定了要有結束,但是目前來看還會持續很長一段時間......



书籍推荐