プロフィール

kosaki

Author:kosaki
連絡先はコチラ

ブログ検索
最近の記事
最近のコメント
最近のトラックバック
リンク
カテゴリー
月別アーカイブ
RSSフィード
FC2ブログランキング

スポンサーサイト このエントリーをはてなブックマークに追加

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | 【--------(--) --:--:--】 | Trackback(-) | Comments(-)

Linuxで動的なメジャー番号割り当てはどのくらい安全か このエントリーをはてなブックマークに追加

最近やったアホな話

Linuxではドライバのメジャー番号が1-4095の範囲で使える。

Linux/include/linux/kdev_t.h

4 #define MINORBITS       20 
5 #define MINORMASK ((1U << MINORBITS) - 1)
6
7 #define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
8 #define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
9 #define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))


ただし、昔は1-255だったので、その範囲の番号を使いたいなら
Documentation/devices.txt を見ながら空いてる番号を探さなければいけない。

・・・・


・・・・・・・・・・・・




そう、思っていた時期が僕にもありました。



register_chrdev()の実装の中核、__register_chrdev_region()の一部をピックアップすると以下のようになっています


29 #define MAX_PROBE_HASH 255 /* random */
30
33 static struct char_device_struct {
34 struct char_device_struct *next;
35 unsigned int major;
36 unsigned int baseminor;
37 int minorct;
38 const char *name;
39 struct file_operations *fops;
40 struct cdev *cdev; /* will die */
41 } *chrdevs[MAX_PROBE_HASH];

(中略)

80 __register_chrdev_region(unsigned int major, unsigned int baseminor,
81 int minorct, const char *name)
82 {
(中略)
94
95 /* temporary */
96 if (major == 0) {
97 for (i = ARRAY_SIZE(chrdevs)-1; i > 0; i--) {
98 if (chrdevs[i] == NULL)
99 break;
100 }
101
102 if (i == 0) {
103 ret = -EBUSY;
104 goto out;
105 }
106 major = i;
107 ret = major;
108 }


つまりchar deviceのハッシュバケツを255から0に向かって検索、
バケツが空だったらインデックス値(必ず 1-255の範囲になる)をメジャー番号として確保します。

このとき、Documentation/devices.txtの紳士協定を考慮するような処理は一切ない。

つまり静的にメジャー番号を確保したいデバイスは、255以下の番号はたとえ、devices.txtで空いていようが空いていまいが、動的メジャー番号確保デバイスに取られている可能性があるので使ってはいけない。

逆に、動的メジャー番号確保デバイスは、メジャー番号決めうちなレガシーデバイスに、決めうちioctlを叩き込まれる事を覚悟しなければならない

ええ、これでバグを出しましたよorz


てゆーか、仕様、おかしくないか?



ふつーに考えると、動的アロケートはレガシーとバッティングしない256以降を優先して確保すべきだろう。



major
メジャーって難しい! ランキング!

関連記事


linux | 【2006-06-11(Sun) 13:44:45】 | Trackback:(0) | Comments:(1)
コメント
このコメントは管理人のみ閲覧できます
2007-09-01 土 08:20:19 | | # [ 編集]
  1. 無料アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。