日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内核编译与内核模块

發布時間:2023/12/15 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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内核编译与内核模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。