模組程式設計 2 4核心 redhat9

2021-08-30 14:54:21 字數 1936 閱讀 2809

1. include/linux/config.h

include/linux/module.h中包含著linux/config.h的標頭檔案,linux/config.h中包含著以#define形式定義的核心編譯編譯時所選擇的項。

2. __init__exit

在將程式編譯為模組時(即gcc 編譯選項了加了_dmodule),這兩個核心巨集不被識別,從而導致編譯出錯。

3.驅動程式中的ioctl()command

在redhat 9 (kernel 2.4.20-8)中,include/asm-i386/ioctl.h中有如下定義:

#define _ioc_nrbits        8

#define _ioc_typebits     8

#define _ioc_sizebits     14

#define _ioc_dirbits      2

由此可見,整個ioctl() 的command 的長度為32 bits,各個欄位的長度如上所示。

知道了這些,那些同樣在include/asm-i386/ioctl.h中定義的用來構造和解析ioctl()的command的巨集也就很好理解了。

4. include/linux/version.h

include/linux/version.h包含在include/linux/module.h中。在include/linux/version.h內容如下:

#include

#if defined(__module__smp)

#define uts_release "2.4.20-8smp"

#elif defined(__module__boot)

#define uts_release "2.4.20-8boot"

#elif defined(__module__bigmem)

#define uts_release "2.4.20-8bigmem"

#else

#define uts_release "2.4.20-8"

#endif

#define linux_version_code 132116

#define kernel_version(a,b,c) (((a) << 16) + ((b) << 8) + (c))

其中,巨集linux_version_code擴充套件為核心版本的二進位制表示,版本發行號的每乙個部分對應乙個位元組。132116的16進製表示為0x020416,點分十進位制即為:2.4.20

.巨集kernel_version 以組成版本號的三部分(三個整數)為引數,建立「kernel_version_code」。

5.模組使用計數

linux/module.h 中定義的關於模組使用技術的巨集:

mod_inc_use_count

mod_dec_use_count

mod_in_use : 計數非0時返回真。

6. kdev_t

現在linux 核心使用kdev_t 型別儲存裝置號。kdev_t 的相關資訊在中定義。對kdev_t進行操作的巨集以及函式如下:

major(kdev_t dev) : 從kdev_t 結構中得出主裝置號。

minor(kdev_t dev): 從kdev_t結構中得出次裝置號。

mkdev(int ma, int mi) : 通過主裝置號和次裝置號建立kdev_t。

redhat9核心公升級過程

本文記錄了我在winxp下的vmware6.5虛擬機器中公升級linux2.4.2核心到2.6.18的過程。飄揚的這篇文章寫的很詳細,只是個別地方還有瑕疵,本文主要就是以該文為藍本,修正了原文中的一些錯誤,並加入了編譯圖示的詳細說明。2 我自己以前寫的核心編譯過程筆記。一 安裝linux系統並登陸 ...

redhat9核心公升級過程

本文記錄了我在winxp下的vmware6.5虛擬機器中公升級linux2.4.2核心到2.6.18的過程。飄揚的這篇文章寫的很詳細,只是個別地方還有瑕疵,本文主要就是以該文為藍本,修正了原文中的一些錯誤,並加入了編譯圖示的詳細說明。2 我自己以前寫的核心編譯過程筆記。一 安裝linux系統並登陸 ...

redhat9核心公升級過程

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!本文記錄了我在winxp下的vmware6.5虛擬機器中公升級linux2.4.2核心到2.6.18的過程。飄揚的這篇文章寫的很詳細,只是個別地方還有瑕疵,本文主要就是以該文為藍本,修正了原文中的一些錯誤,並加入了編譯圖示的詳細說明。2 我自己以前...