塊裝置註冊 register blkdev

2021-06-19 02:40:55 字數 1795 閱讀 4573

先看一下函式的實現:

[cpp]view plain

copy

int register_blkdev(unsigned int major, const

char *name)  

if (index == 0)   

major = index;  

ret = major;  

}  //如果主裝置號不為0 ,我們就可以申請乙個struct blk_major_name的結構體,並將它初始化,主要是將裝置號和裝置名稱儲存到這個結構體中

p = kmalloc(sizeof(struct blk_major_name), gfp_kernel);  

if (p == null)   

p->major = major;  

strlcpy(p->name, name, sizeof(p->name));  

p->next = null;  

//這個函式是做模運算用來得到乙個索引值(0-255),也許你要問了,如果我的主裝置號大於255,是不是會將major_names指標陣列中的元素覆蓋掉?

//我可以很負責的告訴你,你的擔心是多餘的。讓我們看看下面的for迴圈你就明白了。我們假定主裝置號是288好了,那麼index = 288%255,就是33。

index = major_to_index(major);  

//核心首先拿到索引值為33的元素,用*n判斷此元素是否為空,如果為空,直接跳出for迴圈,將上面開闢的結構體賦值給*n好了,這樣就將裝置的資訊註冊到了全域性        //陣列中去了

//如果此元素不為空,也就是已經有乙個裝置註冊到這了,怎麼辦?那核心就會去比較已經註冊的主裝置號與我們將要註冊的主裝置號是否一致,如果一致,核心就會提示我們該裝置號已經被占用了。如果不一致呢?記不記得剛才看過乙個next指標,這個指標是指向下乙個裝置的結構體,直到找到乙個空的結構體,並將前面申請的結構體進行賦值。

for (n = &major_names[index]; *n; n = &(*n)->next)   

if (!*n)  

*n = p;  

else

ret = -ebusy;  

if (ret 

out:  

mutex_unlock(&block_subsys_lock);  

return ret;  

}  

major_name陣列:

[cpp]view plain

copy

static

struct blk_major_name  *major_names[blkdev_major_hash_size];  

其中blkdev_major_hash_size = 255.相信你一看就明白了,這是乙個指標陣列,其中的每乙個元素都指向了乙個 struct blk_major_name的結構體,該結構體就是用來存放裝置的主裝置號和裝置名稱的,至於struct blk_major_name *next這個指標,一會再看吧。現在可以回去繼續看**了。

總結:

1、註冊塊裝置時,可以把0當做主裝置號傳入,從而讓核心自動分配乙個主裝置號。但是,不提倡這麼做!!

2、塊裝置的主裝置號理論上有2^32個,而不是必須小於255。

3、通過此函式註冊後,可以在/proc/devices下看到(cat /proc/device)。

4、major_names陣列(陣列中的每個元素都是乙個指標)可能的最終構成如圖:

裝置註冊 驅動註冊以及雜項裝置註冊之間的關係

1.裝置宣告是在平台檔案 home leizi android itop4412 kernel 3.0 arch arm mach exynos mach itop4412.c中,如下圖,並且裝置名稱是led two.核心編譯之後,s3c device leds ctl被註冊到核心中,並不名稱是le...

字元裝置註冊例項

實驗平台 s5pv210開發板 kernel2.6 功能 驅動三顆led,led1 led2,共用乙個fops,led3單獨使用乙個fops。當open led1 led2 時,led1 和 led2 同時亮,open led3 時,led3亮 release 對應熄滅。include includ...

Linux混雜裝置註冊方法

linux混雜裝置註冊,相對來說更加簡單,可以這樣做 static int init init fpga void 可以看到沒有字元裝置標準的那種什麼申請裝置號,初始化,新增等操作,只用乙個misc register 就可以了。static struct miscdevice ppc dpram m...