X86-內核
查看內核版本:
1.uname -r
2.cat /proc/version
系統架構:1.用戶空間, 2.內核空間
將其分爲兩部分空間的原因:ARM系統中有多種使用模式,將 系統架構分爲兩個空間可以使操作系統得到充分的保護,使用戶程序和內核程序在不同的空間上運行,互不干擾。
以串口中斷爲例
廣義內核架構
SCI:實現系統調用函數的接口(open等)
PM:進程管理(進程調度等)
MM:內存管理
ARCH:體系架構相關的代碼(與CPU相關的代碼)
VFS:虛擬文件管理系統(隱藏各種文件系統的具體細節爲文件操作提供統一的接口)
NS:網絡協議棧
DD:設備驅動(佔絕大部分的內核代碼,佔內核代碼的大約70%)
虛擬文件系統(VFS):
內核源代碼
下載地址:www.kernel.org
管理方式:樹狀管理方式
內核源代碼目錄解析
arch:內核所支持的每種CPU體系,在該目錄下都有對應的子目錄
documentation:內核的文檔
driver:設備驅動文檔
include:內核所需要的頭文件,與平臺無關的頭文件在include/linux子目錄下
fs:存放各種文件系統的實現代碼,每個子目錄對應一種文件系統的實現
net:存放網絡協議的實現代碼
Linux內核的配置與編譯
1.如何配置內核
1.1爲什麼要配置內核?
答:因爲內核源代碼過於龐大,只有通過配置內核,選擇所需要的功能才能使內核 變小;
make config:基於文本模式的交互式配置,配置過程中一問一答
make menuconfig:基於文本模式的菜單型配置,圖像化界面
<*>【運行在內存中的內核】:A -> A.c->A.o->ZImage/bzImage->內存
<M>【內核模塊】:A ->A.c->A.o->文件夾【.ko文件】->需要時導入內存,不需要時從內存中刪除
<>:不選擇該功能
內核的配置文件作爲隱藏文件保存着,需使用ls -a 來查看,在配置linux內核時可以load已有的內核配置文件,並在其基礎上修改
2.如何編譯內核
2.1編譯內核<*>
a)make zImage (V = 1):在X86平臺下,只能用於小於512KB的內核(查看詳細的編譯選項)
b)make bzImage (V = 1):(查看詳細的編譯選項)
c)編譯好的文件存放在arch/<cpu>/boot目錄下
2.2編譯內核模塊<M>
a)make modules:編譯內核模塊,編譯完的模塊散落在內核中的各個部分
b)make modules_install:將散落在內核中各個部分的模塊放置到lib/modules中,方便之後的打包
2.3製作init ramdisk(將內核模塊打包)
a)mkinitrd initrd-$version(目標文件) $version(源文件/夾)
3.安裝內核
1.cp arch/x86<cpu>/boot/bzImage/ /boot/vmlinuz-$version
2.cp initrd-$version /boot/
3.修改/etc/grub.conf(添加linux內核文件,修改linux內核的映像名稱,修改內核模塊包名稱[initrd])
4.清理內核
1. make clean:清理內核源文件中的*.o
2. make distclean:清理內核源文件中*.o和配置文件.config
Tips:
1.修改了內核,其中的文件並不會改變,因爲內核中核心的部分是運行在內存中的,修改內核不過是修改內存中的一段程序,並不會改變文件系統(用戶空間)的內容。
2./boot/目錄是linux啓動時去讀取的一個文件夾
遇到的問題:
1.在第一次更新完內核後重啓,出現Error 13 Invalid or 。。。。,找不到問題出在哪裏,重新編譯完後,在按上述過程走一遍後,內核正常啓動了。