1、linux 內核基本概念-上
linux 內核 和 linux 操作系統的區別
linux 內核 : 通常指的是由官網下載下來的源碼 編譯出來的 uImage 或者 zImage 鏡像
啓動中包含的由 硬件抽象層、文件系統、進程調度、網絡管理、驅動管理、內存管理(多任務)等功能。
通常我們使用的 linux 系統 是指: 像 Ubuntu 等操作系統。 包含linux 內核, 工具集,各種第三方庫,
圖形界面,應用程序的一個發佈包(發行版)
linux 內核特性
免費開源
可移植性 支持廣泛的硬件平臺
arm ppc mips x86...
擴展性
軟硬件可裁剪
高可靠性、穩定性
網絡功能強大
多任務、多用戶系統
模塊化設計
linux 內核版本
採用 A.B.C.D
A 主版本號
B 次版本號 爲偶數表示 穩定版本 奇數爲開發中版本
C 表示linux的發行版本號
D 表示更新版本號
linux 內核包含的五大功能:
1. 進程管理
2. 內存管理
3. 文件系統
4. 網絡協議
5. 設備驅動管理
linux 不會是一個真正的實時系統 (時間片輪轉方式)
vxwork 是一個真正的實時(RTOS )系統 收費
linux 分層
應用程序
||
\/
系統調用
||
\/
linux 內核 分爲 平臺無關碼 和 平臺相關碼
||
\/
硬件平臺
linux 內核 下載地址 https://www.kernel.org/
linux 各個版本下載地址 https://www.kernel.org/pub/linux/kernel/
編譯內核 make uImage
編譯設備樹 make dtbs
上面兩個命令都需要在 源碼的頂層目錄上 使用 ☆☆☆
二、linux 內核基本概念-中
注意要把 linux源碼 拷貝到 Ubuntu中 解壓,
因爲 源碼中會有一些軟件鏈文件, 這些文件,windows文件系統 不能識別
解壓命令 tar -xvf ***.tar.xz
// arm-cortex_a8_linux-gnueabi-..
// 這個交叉編譯工具鏈,我沒有從錄製課程的老師手裏拿到
// 大家也不必使用這個工具鏈,直接使用 課程資料裏提供的
// gcc-4.6.4.tar.xz 就可以了
配置交叉編譯工具鏈:
1.export PATH=/自己的路徑/gcc-4.6.4/bin:$PATH
2. 寫到啓動腳本中 /etc/profile 或者 .bashrc
修改 源碼頂層目錄的 Makfile
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
// 我們不用 arm-cortex_a8_linux-gnueabi- 這個。。
三、linux 內核基本概念-下
使用 gcc-4.6.4 編譯內核
使用 putty 串口工具軟件
// 提醒: 如果想啓動內核,還需要配置一下網絡
// 網絡配置學習視頻
// 系統移植之網絡配置 11.3 羣內 http://e.vhall.com/102020226
設備樹: 用於描述硬件設備信息。
低版本內核的設備硬件備信息,是存放在linux源碼中的
高版本是寫到 設備樹文件中
☆ arch 不同CPU體系結構的差異代碼
-> arm 不同板子板子的源碼
-> boot uImage zImage
-> dts 設備樹
☆ driver 驅動目錄
-> net 網絡驅動 (與設備相關)
kernel 內核調度算法
net 網絡協議 (與設備無關的)
block 塊設備相關驅動
fs 文件系統
include 頭文件存放目錄
Documentation 幫助文檔
tools 工具
scripts 編譯內核時使用的腳本
ipc 進程間通信
mm 內存管理
理解平臺相關代碼和平臺無關代碼
四、linux 內核啓動分析
啓動 u-boot -> kernel -> rootfs(root filesystem)
啓動腳本 /etc/init.d/rcS 自啓動應用
Starting kernel ... 屬於 uboot的打印
重點理解 uboot 啓動流程(面試出現頻率高)
內核啓動流程
a. 自解壓 decompess (arch/arm/boot/compressed/head.S) 彙編
b. 檢測合法性 入口 stext (arch/arm/kernel/head.S)
(CPU 類型 機器類型)
c. 運行 C代碼 start_kernel (init/main.c)
d. 掛在 rootfs
e. 運行第一個應用程序 linuxrc
五、linux 內核調試方法
1. 彙編階段 點燈法
2. puts(內核解壓前)
3. printascii (console 初始化前)
4. printk (內核解壓後,信息輸出顯示到console初始化之後)
打印級別 /proc/sys/kernel/printk
8個打印級別
init/main.c - start_kernel
第一次編譯內核代碼會比較長時間
如果修改或者添加源文件,再次編譯,只會編譯變化的部分 會快一些
oop內核異常信息
pc : 程序計數器
arm-none-linux-gnueabi-addr2line pc地址 -e vmlinux -f
在源碼中顯示具體出錯的位置