驅動 學習Linux核心如何用巨集來操作裝置號

2021-10-01 01:28:50 字數 1725 閱讀 3016

1.裝置號,主裝置號,次裝置號

主裝置號:應用程式根據裝置檔案的主裝置號,到這個核心的乙個大陣列中找到在核心中找到唯一驅動程式。

次裝置號:應用程式根據主裝置號找到驅動程式,驅動根據次裝置號找到對應的唯一的硬體外設。

裝置號:同時包含了主裝置號和次裝置號,它的資料型別為:dev_t(unsigned int)

typedef __kernel_dev_t  dev_t;

typedef __u32 __ kernel_dev_t;

typedef unsigned int __u32;

而裝置號的高12位儲存著主裝置的值;

低20位儲存著次裝置號的值。

所以,操作裝置號必然用到位運算,接下來看看核心是怎麼做的:

2.操作裝置號

裝置號=mkdev(已知的主裝置號,已知的次裝置號)

主裝置號=major(已知的裝置號)

次裝置號=minor(已知的裝置號)

#define minorbits	20

#define minormask ((1u << minorbits) - 1)

#define major(dev) ((unsigned int) ((dev) >> minorbits))

#define minor(dev) ((unsigned int) ((dev) & minormask))

#define mkdev(ma,mi) (((ma) << minorbits) | (mi))

2.1 major主裝置號=major(已知的裝置號),因為裝置號的高12位儲存主裝置號,所以在已知裝置號的前提下,只需將裝置號右移20位(#define minorbits 20),即可得到主裝置號:

次裝置號=minor(已知的裝置號),因為裝置號的低20位儲存次裝置號,所以在已知裝置號的前提下,只需將裝置號的高12位置0即可,可以將裝置號按位與乙個高12位為0,低20位為1的u32型別的數,它就是 minormask:

接下來將裝置號按位與 minormask即可:

次裝置號=minor(已知的裝置號),這個更好理解,裝置號的高12位儲存主裝置號,低20位儲存次裝置號,現在已知主裝置號和次裝置號,只需將主裝置號左移20位,再按位與次裝置號即可:

總結:核心使用巨集來操作裝置號,方法可移植性強,可讀性強,在日後開發應該多多學習。

核心驅動巨集 init, exit,

在編寫驅動中,我們經常看到這些巨集定義,我們定位進去看看,在 define init section init.text cold notrace define initdata section init.data define initconst section init.rodata defin...

Linux核心驅動模組學習

ko檔案在是elf excutable and link format 格式,是一種可重定位的目標檔案。在編譯驅動模組時,我們在makefile中用obj m o來指定生成核心驅動模組檔案,即.ko檔案。首先insmod會通過檔案系統將ko讀到使用者空間的一塊記憶體中,然後執行系統呼叫sys ini...

如何分析linux核心的驅動

在linux核心中,自帶的驅動都以platform模型的形式設計的。一般情況下,所有的platform device在一起定義,並且在一起註冊。driver是設計成了不同的原始檔。因為device放在一起定義,比較好找,我們可以現在找到device,再找driver。找到針對乙個硬體平台的主初始化原...