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。找到針對乙個硬體平台的主初始化原...