混雜裝置動態次裝置號分析【轉】

來源:互聯網
上載者:User

標籤:str   遍曆   成員   --   定義   宏定義   lock   signed   targe   

本文轉載自:http://blog.csdn.net/yongan1006/article/details/6778285

今天看驅動源碼時,發現一個MISC_DYNAMIC_MINOR宏,於是分析了一下核心源碼。先粘出源碼。在misc_register函數中,有如下語句:

       if (misc->minor == MISC_DYNAMIC_MINOR) {

              int i = DYNAMIC_MINORS;

              while (--i >= 0)

                     if ( (misc_minors[i>>3] & (1 << (i&7))) == 0)

                            break;

              if (i<0) {

                     mutex_unlock(&misc_mtx);

                     return -EBUSY;

              }

              misc->minor = i;

       }

 

       if (misc->minor < DYNAMIC_MINORS)

              misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);

       dev = MKDEV(MISC_MAJOR, misc->minor);

宏定義MISC_DYNAMIC_MINOR=255,DYNAMIC_MINORS=64。

misc_minors定義static unsigned char misc_minors[DYNAMIC_MINORS / 8];是一個char型的數組。代碼的關鍵是看懂(misc_minors[i>>3] & (1 << (i&7))) == 0。為了方便分析,本人寫了一個分析i與i&7的值的程式

#include <iostream.h>

void main()

{

       int i=64;

       int j;

       int l;

       while(--i>=0)

       {

              j=i>>3;

              l=1<<(i&7);

              cout<<"j‘s valule is: "<<j<<endl;

              cout<<"l‘s valule is: "<<l<<endl;

              cout<<"i‘s valule is: "<<i<<endl;

       }

}

運行結果:

……

……

       基於以上運行結果我們可以看出:

j的值是從7遞減到0,j每減一個值,l的值迴圈一次出現128,64,32,16,8,4,2,1

i的值則是從63一直減到0。

所以我們可以得出以下幾個結論

1.       misc_minors[i>>3]這個char型數組有8個成員,每個成員是一個8位的數(因為j是從7減到0)

2.       (1 << (i&7))),當i減小1時,(1 << (i&7)))就向右移1位。即出現128,64,32,16,8,4,2,1的情況

3.       misc_minors數群組成員與i值有對應關係,即misc_minors[7]對應63,62,61……56

misc_minors[6]對應55,54,……48。以些類推。因為misc_minors的成員是8位的數,每一個成員對應8個minors,所以很容易這樣聯想:misc_minors成員的每一位標記一個次裝置號(有沒有使用過)。

4.       (misc_minors[i>>3] & (1 << (i&7))) == 0意思就是將misc_minors數組中8個成員的每個成員的每一位遍曆一遍,看是否為0

 

看懂了(misc_minors[i>>3] & (1 << (i&7))) == 0的意思後往下看,如果條件成立,就—i,如果是就將i賦給minor。這就說明,此前的聯想是正確的。位是0就代表沒有使用過這個次裝置號,位1是代表使用過這個次裝置號。所以在下面的代碼中還可以看到,如果得到了一個次裝置號後,就要馬上將代表這個次裝置號的位標記為1。但是使用MISC_DYNAMIC_MINOR這個宏有一個限制:你的次裝置號不會超過63。

分析完畢。

混雜裝置動態次裝置號分析【轉】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.