linux内核编译与内核模块
?linux內核簡介、配置編譯與內核模塊
Linux系統架構
主要分為用戶空間和內核空間。用戶空間包括應用程序和C庫等。內核空間包括系統調用接口,linux內核以及體系結構相關代碼。關于linux要區分內核空間和用戶空間的原因。首先要明白,內核空間與用戶空間是程序運行的不同狀態。現代的處理器往往有很多工作模式,以ARM9為例就有7中工作方式:(管理模式,系統模式,用戶模式,外部中斷模式,快速中斷模式,數據終止模式和未定義指令異常模式)。X86也分有Rang0--Rang3四種模式。在不同的模式下,所使用的寄存器與訪問權限不盡相同。Linux為了保護操作系統本身,系統分成了用戶空間和內核空間,用戶空間的訪問權限要小,這樣就起到了保護內核的作用。
Linux內核架構:如下表所示
????????????????????--?系統調用接口
????????????????????--Linux內存管理子系統(重點掌握)
????????????????????--Linux?進程管理子系統
Linux內核的組成?-----Linux?網絡子系統(網絡協議棧)
????????????????????--虛擬文件系統
????????????????????????--驅動?
????????????????????????--體系結構相關代碼(匯編)
Linux內核的配置與編譯(X86平臺上)
第一步:Make?clean或者Make?mrproper或者Make?distclean
第二步:make?config?或者?make?menuconfig
第三步:make?zImage?或者?make?bzImage?
第四步:編譯內核模塊?make?modules
第五步:安裝內核模塊?make?modules_install?(將編譯好的內核模塊拷貝至/lib/modules目錄下面)
第六步:制作initramdisk
Linux內核模塊
為何需要內核模塊?如果把所有組件都編譯進內核,那會使得內核模塊非常龐大。另外如果想要添加或者刪除某個組件就必須重新編譯內核。所以提供了一種內核模塊的機制。
首先要區別內核模塊與一般程序的區別:
普通程序從main函數開始,從頭到尾執行,然后從內存中消失。而內核模塊通過初始化函數在內核中注冊,然后一直存在內核中,等待將來的某個請求。模塊始終存在于內核中,知道執行了卸載函數。
內核模塊的寫法。下面是一片hello?world?的范例
#include?<linux/module.h>
#include?<linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("DAVID");
MODULE_DESCRIPTION("Hello?world?module");
static?int?__init?hello_init(void)
{
printk(KERN_ERR?"hello?world!\n");
return?0;
}
static?void?__exit?hello_exit(void)
{
printk(KERN_EMERG?"hello?exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
有了內核模塊的源文件,還必須有makefile。但這個makefile其實是一個假的makefile。它的作用是指定一個linux內核中的真正的makefile。下面是一篇makefile的范例(注意,這是針對X86平臺的):
ifneq?($(KERNELRELEASE),)
obj-m?:=hello.o
else
KDIR:=?/lib/modules/2.6.18-53.el5/build
all:
make?-C?$(KDIR)?M=$(PWD)?modules?
clean:
rm?-f?*.ko?*.o?*.mod.o?*.mod.c?.symvers
endif
內核模塊的安裝與卸載
安裝使用:insmod?***.ko;卸載使用?:rmmod??***?(注意不需要后綴名);查看已經安裝的內核模塊使用?lsmod
linux內核啟動流程
uImage由zImage和uboot?head相關兩組成。而zImaeg又是由解壓縮代碼和壓縮的vmlinux代碼構成。總的來說內核啟動流程可以分為?解壓縮?、?初始化?、?啟動應用程序三部分組成。初始化的最后一句代碼是:run?init_process("sbin/init").所以這也解釋了為什么把程序放在這里面就能夠開機自啟動了。
linux內存管理
???首先從幾個地址的概念談起。一是物理地址,這個很容易理解,它就是CPU所使用的地址,也就是在地址總線上傳輸的地址。二是線性地址或者成為虛擬地址,它的大小是根據地址線的根數來確定的。但它不表示實際的內存地址。因為就算地址線能達到4G,實際的內存很可能沒有4G。所以它成為虛擬地址。三是邏輯地址,這個是針對段式管理的產物。也就是段式管理中的偏移地址。
???一個程序中,代碼尋址用的就是邏輯地址,一個邏輯地址經過段式管理,成了線性地址,線性地址經過頁式管理,才準換成真正的物理地址。但由于很多處理器沒有使用段式管理,所以linux有限制的采用了段式管理機制,將所有的段基地址都設置為0,那么偏移地址也就是邏輯地址和線性地址也就完全對應了,可以理解為相同的。也就是說,在linux中,邏輯地址,線性地址,虛擬地址都是一致的。然后線性地址經過頁式轉換就得到了真正的物理地址。
對于段式管理的起源,要有一定的認識。出現在intel的16位處理器上面。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的linux内核编译与内核模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: z3跟z3i的区别(微软z3推理引擎介绍
- 下一篇: Linux底层网络编程--ARP,PIN