1 名前:login:Penguin [02/01/31 01:14 ID:t3s191ys] ディバイスドライバの改造、製作にまつわる情報交換、質問、 噂話、ぐち、政治、経済に関するスレです。できる限り生産的にいきましょーや。
368 名前:login:Penguin [04/08/05 12:51 ID:dMydmJ+4] 書いてあることだけじゃいまいち要領を得ないが アクセス待ち、アクセス完了まで時間がかかる、排他処理が必要である ようなデバイスで ・ノンブロックでアクセス処理したい ・複数のプロセスから同時にアクセスされる状況に対応したい ・複数のデバイスを一元的に管理したい (リソース管理など) こんな条件だと勝手に仮定すると たしかに大きいデバイスドライバを書いて、そこですべて管理するのも ひとつの解決法ではある。 でもユーザランドでスレッド/子プロセスを使って、ノンブロック処理を 実装することも出来るし、唯一の解でもない。 まぁ、情報が出せないというよりは、状況を理解してないので うまく説明できないって感じなので、もうちょっと頭を使って 問題を整理してから、もう一回質問するがよかろう
369 名前:login:Penguin [04/10/29 11:01:48 ID:rDkd0V/P] lsusbだとデバイス名が把握できてるということは、 個々のドライバ部分に問題があって動かないという風に考えてもいいでしょうか? linux-2.6において usbcore uhci_hcd cdc_acm という三つのドライバにより動かしたいハードウェアがあるんですが、 cdc_acmをロードしてもうんともすんとも言いません
370 名前:login:Penguin mailto:sage [04/10/31 20:53:26 ID:fFX2rhTr] .netとかjavaみたいなバイトコードなドライバーでハードウェア を制御する環境を作るって可能ですか?
371 名前:login:Penguin mailto:sage [04/10/31 21:36:34 ID:uzVMAm7i] >>369 まあそうでしょうな。 lsusbはハード的につながっていれば見えるし。 >>370 そりゃ作れん事は無いが… 速度が厳しくないかい?
372 名前:login:Penguin mailto:思っただけで、実現する技術が無いので sage [04/11/01 02:36:54 ID:dfNRJQ4+] >>371 JITなりリコンパイラーなり方法はあるだろうし、全てのドライバーが 速度を必要とするわけじゃないと考えたわけで。部分的にでも・・・と 何にしてもバイナリの非互換性がどうにかならんかなぁと。 カーネル毎にコンパイルはダリ
373 名前:login:Penguin mailto:sage [04/11/01 06:48:36 ID:IqBdvM7D] >>370 Kernelから呼び出すような仕組みにしても、 Javaで言うnativeなのが無いと駄目じゃない? レジスタとかメモリ領域さわれないし。 結局そこ(nativeなモジュール)で非互換性が出る気がする。
374 名前:login:Penguin mailto:sage [04/11/01 15:55:17 ID:lkrLxjNC] >>373 そのへんはバイトコードインタプリタで抽象化すればいいのではないかと。 PCIあたりならかなりの所まで出来そうな気がするなあ。 そういやOpenFirmwareなんてのがあったのう…あれはForthだっけ?
375 名前:login:Penguin mailto:sage [04/11/01 22:34:23 ID:dfNRJQ4+] 成るほど・・・ >>373 やっぱりそういうところで不備が出てきますか。。。言語拡張で・・・となると Javaじゃなくなるし、コンパイラーも自前に用意しなきゃならなくなるし。。。 >>374 漏れもそんな感じの考えでいたんだけど、やっぱそれが難しいんでしょうね。 とはいえ、可能性があることはわかりました。ありがとうございます。 >>OpenFirmware 調べてみましたが上の考えのBIOS版みたいなもんでしょうか? とりあえず、神が現れることを祈りつつ作れる作れない、作る作らないは別として 自分でも調べてみようと思います。厨の妄想に付き合っていただきありがとうございました。
376 名前:login:Penguin mailto:sage [04/11/02 12:28:29 ID:lgEgFui9] カーネルのバージョンによってカーネルが持つ構造体が微妙に違うことがよくある。 (メンパが増えてるとか) 現状のinsmodによるデバイスドライバのダイナミックリンクは その手の構造体の違いを解決してくれないので、原則的に カーネルバージョンに依存したドライバしかリンクできない。 強制的に違うバージョンのドライバをinsmodすることも可能だが 正常に動く保証はない。たまたま動くことはあるけれども。
377 名前:login:Penguin mailto:sage [04/11/02 18:53:41 ID:chaRCRYs] まあソース見て「あーこれなら動くな」と思ったら 迷わず-f
378 名前:login:Penguin mailto:sage [04/11/03 13:41:27 ID:1PHyje+L] ドライバのソースがあるならリビルドする方がいいような気がするのう。 いっぱいコンパイラに怒られたりすると直す気が失せるが…
379 名前:login:Penguin mailto:sage いやしかし勉強になる。。。 [04/11/06 23:30:41 ID:9J0OxvoL] >>376 なるほど。JAVA云々無しにしてもやっぱカーネルとは別離すべきなのかも。 いや、マイクロ・モノリシックの話じゃなくて仕様的なものを。moduleの管理も こんなんでいいの?って気もするし。Xもドライバー持ってるってのがよくわから んし(嫌味とかじゃなくて本当にわからんのです。) って偉そうな事言っててもしょうがないな・・・たまにはソースぐらい読もう・・・
380 名前:login:Penguin mailto:sage [04/11/07 08:11:19 ID:/P0s9FI4] >>636 > 昨日Linuxにふれたものですから であり、(非常に一般的なやりかたにもかかわらず)やりかたがわからないとい う人が tamagoをいれたい理由はなにかしら? 特に強い理由がないなら、「いれるな」が正しいガイドだと思うのですよ。 >>635 つかいかたは man xmodmap でみるといい。 キーコードは xev で調べられます。使いかたは man xev でみるといい。
381 名前:login:Penguin mailto:sage [04/11/08 12:46:18 ID:ir5Tmuq8] Xサーバはroot権限のユーザランドプロセスで /dev/ioとか /dev/memに 直接アクセスしてビデオチップを制御する。 Xのドライバといわゆるデバイスドライバとは動作メカニズムがまったく違う。
382 名前:login:Penguin mailto:sage [04/11/09 23:51:44 ID:+nDFjkMc] ユーザ空間からmmapでマッピングしてデバイスいじくるときって、 アプリがマッピング先のメモリに書き込む動作と同時に デバイスにデータって書きこまれるんでしょうか? バッファリングみたいのって気にしなくてもいいの?
383 名前:login:Penguin mailto:sage [04/11/10 01:00:51 ID:8UeNJl+2] >>382 デバイスをmmapしてアクセスするときは、単にMMUがそこを指しているだけで、 ディスク上のファイルをmmapしたときのようなバッファリングはありませんよ。 類似のがある場合はあって、それはキャッシュなのです。 /dev/fb* は通常キャッシュが抑止されています。 /dev/mem は O_SYNCでopenしてやるとキャッシュを抑止します。
384 名前:login:Penguin mailto:sage [04/11/10 07:34:29 ID:WP1ExQ+t] PCIデバイスの場合 各共有メモリ空間ごとにprefetchableビットが定義されている ほとんどのPCIカードはprefetchableがdisableになっておりキャッシュ無効になってる
385 名前:login:Penguin mailto:sage [04/11/10 14:40:19 ID:OHaab6bm] >>383 >>384 CPUキャッシュですか。 環境にもよるのでしょうけど、基本的にはあまり気にしなくてもいいのですね。 実は、drivers/char/mem.c みたんですけど、mmap システムコールを呼んだときと、 そこにアクセスした時のコードの流れがよくわからないのでちょっと???でした。 あとは、コンパイラのオプティマイズも気にしておいたほうがいいのでしょうね。
386 名前:login:Penguin mailto:sage [04/11/10 18:01:50 ID:MrVsce1+] >>385 CPUキャッシュはユーザー空間から叩く手段がないので、 カーネルとハードウエア側の制御にお任せするしかないです。 最適化の方はvolatile付けておけば大丈夫でしょう。 なにもしないと最近のコンパイラは賢すぎてとんでもないことをやってくれますからな。
387 名前:login:Penguin mailto:sage [04/11/10 23:54:53 ID:8UeNJl+2] >>385 キャッシュは気にしてください。キャッシュがあると . 書き込みがキャッシュが溢れるまでなされない。 . 読みだしも同様。 . 同一ラインにのる近隣のレジスタがいっしょにアクセスされちゃう という、デバイスの制御にとっては致命的なことがいろいろ。
388 名前:382 385 mailto:sage [04/11/11 00:27:04 ID:95L6p31P] すみません。 キャッシュを気にししなくてもよいと書いたのは、 キャッシュが働かないので、気にしなくても良いという意味で 書いていました。 387さんのおっしゃるとおり、デバイスアクセスでキャッシュが 働いてしまうと、ひどい目にあいますね。 ところで、mmapのキャッシュ無効化ってmem.cの noncached_address を修正すれば有効無効をユーザで 任意に操作可能になるんですかね? ハードやBIOSでキャッシュ関係の細工が何かあったりしたらだめなのかもしれませんが。
389 名前:login:Penguin mailto:sage [04/11/12 00:12:24 ID:nxDtrzpb] >>388 抑止の方は O_SYNC でできますよ。その行の後半の条件がそうでしょ?
390 名前:login:Penguin [04/11/14 11:26:16 ID:ZhMJfRu+] USBサブシステムを読んでいるんですが、 デバイス、バス、ドライバの三つの関係のイメージを 教えてください。なんだかソース読んでいてもよく分かりません。 またxxx_probeという関数に渡ってくるstruct usb_interfaceとは どこで確保されいてる構造体なんでしょうか?
391 名前:login:Penguin [04/11/21 11:06:40 ID:RzBM8DsM] technokitのUSB-IOをFedora Core 3に接続したら、/dev/hiddev0が勝手にできたので、 これに対しCでプログラムを作って、 fd = open("/dev/hiddev0", O_WRONLY); して、 write(fd, command, 8); した。commandは0x01FF00000000。けど全然反応が無い。 USB-IOのエンドポイント0には、0x01FFを送ったら、ポート0が反転するはずなんだけどなあ。 hid使わずに、ちゃんと専用ドライバ使わないとだめなの?
392 名前:login:Penguin mailto:sage [04/11/21 17:22:45 ID:fkgrUhvM] デバイスドライバはカーネルメモリを消費するらしいのですが、 現在のカーネルメモリーの残量を知るにはどうしたらよいですか?
393 名前:391 [04/11/21 17:37:11 ID:RzBM8DsM] >390 /usr/include/usb.h
394 名前:login:Penguin mailto:age [04/12/12 18:20:03 ID:fch5Qtg6] Linuxデバイスドライバの勉強を始めました。 がまずは、オライリーの本で解説してる、 サンプルコードから入ろうと思ったんですが、 asm/system.hをincludeしているコードは、 /usr/src/linux/include/asm/system.h: 関数 `__set_64bit_var' 内: /usr/src/linux/include/asm/system.h:190: 警告: dereferencing type-punned pointer will break strict-aliasing rules と警告を出されてしまいます。 同じ現象に遭遇した香具師いませんか? コンパイラはgcc3.3、kernel2.4.26。 ちなみに、警告された部分は、 #define ll_low(x) *(((unsigned int*)&(x))+0) #define ll_high(x) *(((unsigned int*)&(x))+1) static inline void __set_64bit_var (unsigned long long *ptr, unsigned long long value) { __set_64bit(ptr,ll_low(value), ll_high(value)); //190行目 }
395 名前:394 mailto:sage [04/12/12 18:22:17 ID:fch5Qtg6] あ、マシンは i686です。
396 名前:login:Penguin mailto:sage [04/12/14 01:02:15 ID:bnBNd/cw] たしか-fno-strict-aliasingだったかな。それつけれ。 より詳細が知りたいときはググれ。
397 名前:394 mailto:sage [04/12/14 02:47:39 ID:iNH7gUWs] 産休です>>396 小細工ですが、 (unsigned int*)&(x)を、(unsigned int*)(void*)&(x)に書き換えると、 警告を封じることができますた。 勉強がんばります。
398 名前:login:Penguin [04/12/14 11:29:27 ID:HO3MDnt+] モジュールでmallocを使うと implicit declaration of function `malloc' なる警告が出ました。 正直、うまくいくとも思っていなかったのですが、ためしにやってみた感じです。 何かヘッダをincludeすればいいのでしょうか。
399 名前:login:Penguin mailto:sage [04/12/14 11:44:22 ID:vlh4D4yl] >>398 kmalloc() or vmalloc()
400 名前:login:Penguin mailto:sage [04/12/14 11:54:53 ID:HO3MDnt+] >>399 感謝.あとは調べます.
401 名前:login:Penguin [04/12/14 15:55:34 ID:ScDxM3L+] 【序 論】 オウム事件とは、「オウム、創価、統一が共同でやっていた覚醒剤密造などの不法行為がばれそうになり、全ての罪をオウムに押付けた。」事件であると理解しています。 統一教会は、その起源から考えて、KCIA及びCIAの影響下にあると考えるべきです。 日本側のCIA専属のお爺さんたち、つまり、笹川さん、児玉さん、中曽根さんたちが、統一とつるんでいたのも、CIAの犬同士という絆があったわけです。 一方で、創価は創価で、笹川一派を通じて、統一と繋がりがありますし、それ以前に創価内部に深く入り込んでいる暴力団、 後藤組のもつ北朝鮮コネクションから、オウムの麻薬ビジネスに関わっていたわけです。 もちろん、日本社会に創価マフィアのネットワークをはりめぐらした学会を、CIAが放っておくわけがなく、マネーロンダリングなどに、しっかり利用されています。 宗教法人の財務の閉鎖性をCIAが利用しないと考える方が異常です。 そして、CIAお得意の麻薬ビジネスの日本支部が、オウムだったわけで、その収益が北朝鮮に還元されていたのも当然のことであり、 北の現体制を維持するための、CIAの有難い配慮だったわけです。 なにしろ北の体制が崩壊すると、一番困るのは、CIAのスポンサーである軍産複合体と国際金融資本であり、極東の緊張は、彼らの飯の種なわけですから。 麻薬王にして、CIAの帝王である大ブッシュさんが、統一の文と仲良しなのも、アッタリマエなわけですね。 今度の米大統領選でも、随分と統一のカネが小ブッシュ陣営に流れたようですね。 尚、本件の主たる議論は、2チャンネル、警察板の「告発します 第3部」スレッドにて、進めています。 mentai.2ch.net/test/read.cgi?bbs=police&key=985780338&ls=100
402 名前:login:Penguin mailto:sage [04/12/14 17:02:39 ID:WBCZfumK] 国際金融資本と無関係な人はいません。ここが大事なところです。 国際金融資本とダーティーな勢力になんらかの関係があるというのなら、 全ての人間がダーティーな勢力と関係があるということです。
403 名前:login:Penguin [04/12/16 00:42:54 ID:HSUTNn3s] <linux/errno.h>をincludeしているのに、errnoが宣言されていないとエラーが出ます。 なぜですか?
404 名前:login:Penguin [04/12/16 00:52:12 ID:fnG8qWZe] #include <asm/errno.h>
405 名前:login:Penguin mailto:sage [04/12/16 03:08:53 ID:L4JhEJTY] デバイスドライバーをイジルとハードが壊れます
406 名前:login:Penguin mailto:sage [05/01/13 20:25:56 ID:5Qhjx5GH] jiffies の質問です。jiffies がオーバーフローする時の挙動を確かめ たく、下記のようなモジュールを作成してロードしたのですが、モジュー ルのロードに非常に時間がかかります。 #define __KERNEL__ #define MODULE #include <linux/module.h> #include <linux/sched.h> #include <linux/delay.h> MODULE_LICENSE("GPL"); int init_module(void) { jiffies = 4294961296UL; return 0; } void cleanup_module(void) { return; } 即座に jiffies 値を変更するためには、何か工夫が必要なのでしょう か?
407 名前:login:Penguin mailto:sage [05/01/13 21:59:07 ID:b26g+4JK] >>406 jiffesの値が飛ぶせいじゃないの? 初期値をいじる方がいいと思うが。
408 名前:login:Penguin mailto:sage [05/01/13 22:21:10 ID:5Qhjx5GH] やっぱりそれしか方法ないでしょうかね。カーネルコンパイルが億劫で まだ試していませんでした。 例えば、jiffies += 8640000; だとそれほど時間はかからないのですが、 jiffies += 8640000; にすると、より多くの時間がかかるようです。仮 想マシン環境で実験しているのですが、その間、仮想マシンのプロセス の CPU 使用率は高いままでした。
409 名前:login:Penguin mailto:sage [05/01/14 02:03:54 ID:PSu0RjKD] ん? 何書いてたんだ、俺 >408 は、正しくは以下です。 例えば、jiffies += 8640000; だとそれほど時間はかからないのですが、 jiffies += 864000000; にすると、より多くの時間がかかるようです。
410 名前:login:Penguin [05/02/06 11:19:02 ID:+OMlHKxZ] mmapによるデバイスアクセスについてご教授ください。 16bitアクセス限定のデバイスに対して、 mmapによるアクセスを試行しているのですが、 どうも挙動が怪しくて困っています。 アプリ側からmmap(/dev/memをO_SYNCでopen)してshortアクセスをしても、 そのままshort幅でデバイスにアクセスが行くとは限らないのでしょうか? なにか考慮が不足してるのでしょうか。
411 名前:login:Penguin mailto:sage [05/02/06 14:33:57 ID:JfjjYGk4] >>410 アーキテクチャわかんないので、過去の経験より。 ・D cache ・コンパイラが勝手に最適化 そういう制限がある場合は、おとなしく専用ドライバ書くのが 近道のような気がしますな。
412 名前:login:Penguin [05/02/10 21:10:10 ID:oT40ukFS] gcc 3.3.5(gentoo) で作成したモジュールを gcc 3.4.2(FC3) のPCへ 組み込もうとするとエラーで組み込めません。 どちらも kernel-2.6.10 です。 insmod: error inserting 'hoge.ko' : -1 Invalid module format kernel config (General setup, Loadable module) は同じにしてあります。 同じバージョンの gcc で作成したシステムでないと無理なのでしょうか。
413 名前:login:Penguin mailto:sage [05/02/12 01:22:07 ID:QcR6E3eX] >>410 >>411 の言うとおりアーキテクチャが分からないのでなんともいえないけど・・・ /dev/memをmmapでshortアクセスしたら、普通はshortで触ってくれるでしょう。 でも、触ってるデバイスが * 例えば32bit PCI * にぶら下がってたりしたら 32bit で触りに行っちゃうこともありますよ。 っていうか、PCIの向こうにいるデバイスに届くまでに余計な16bitが増えてたりする。 それでも、読みにいくときには多分shortで行っても多分大丈夫。 書き込みをshortでやったりすると、残りの16bitにゴミが乗っかっちゃうとか、 そんなんじゃないでしょうか? そうならば、shortで書きに行くときには、最初にデバイスから32bit分持ってきて、 それに16bit分上書きして、32bit書き戻すとかするしかないのでは。 (16bitアクセス限定でも、読みに行くときは16bit×2で32bit分をうまく返してくれることを かってに期待して書いてますけど) それから、32bitでアクセスするときにも触りに行くアドレスに注意が必要ですよ、多分。 32bitアラインメントじゃないとダメな予感がします。 もしそうならば、アラインメントの境界をまたいじゃうような16bitの書き込みをする場合、 両側の32×2 = 64bit分を持ってきて16bit書いて戻す、とかしないとダメですよね。 もちろんこれは、PCI上でうまく振舞うように作られていないデバイスの話で、 たとえ16bitアクセス限定デバイスでもそうならないようにつくることは可能だと思います。 ところどころ言ってるかもしれませんけどね・・・
414 名前:413 mailto:sage [05/02/12 01:24:29 ID:QcR6E3eX] 早速、間違えてました(w >ところどころ言ってるかもしれませんけどね・・・ ところどころ * うそ * 言ってるかもしれませんけどね・・・
415 名前:410 mailto:sage [05/02/16 00:46:02 ID:E/KjMwKc] いろいろ情報ありがとうございます。 もともとドライバ経由でアクセスしていたのですが、 パフォーマンス的な問題でmmapでを使用したかったという経緯があります。 ですが、mmapだとどうもうまくいかなくて試行錯誤していた次第です。 ですので、単純にmmapでの処理の問題かと思っていました。 時間はあるので、勉強も兼ねてもうちょっと情報収集をしたいと思います。
416 名前:login:Penguin [05/02/16 22:28:50 ID:mypLuczy] www.netfort.gr.jp/~matsu/lcd_pc/lcd_pc.html これカコイイ
417 名前:login:Penguin mailto:sage [05/02/20 21:06:04 ID:0sjUjbHi] 現在、デバイスドライバ作成(とりあえずキャラクタ型)の勉強しているのですが、 2.4.30-pre1上で作成したテストドライバでモジュールのロードは成功したと思われる のですが(lsmodで存在を確認)、実際にドライバを使用する為に作成したテストツールから 呼び出す(ioctlを使用する箇所で)と失敗しました。 $ ls -l /dev/testdev crw-rw-rw- 1 root root 60, 0 2月 20日 20:11 /dev/testdev $ ./testtool ioctl: Inappropriate ioctl for device <-- perrorで表示させてみたところ
418 名前:417 mailto:sage [05/02/20 21:09:12 ID:0sjUjbHi] つづき そこで、さらに詳細に状況を確認するためにstraceを使用してみました。 $ strace ./testtool execve("./testtool", ["./testtool"], [/* 52 vars */]) = 0 brk(0) = 0x8049a6c open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=62075, ...}) = 0 old_mmap(NULL, 62075, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40013000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0DU\1\000"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=1333605, ...}) = 0 old_mmap(NULL, 1145796, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40023000 mprotect(0x40134000, 27588, PROT_NONE) = 0 old_mmap(0x40134000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x110000) = 0x40134000 old_mmap(0x40139000, 7108, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40139000 close(3) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4013b000 munmap(0x40013000, 62075) = 0 open("/dev/testdev", O_RDWR) = 3 ioctl(3, FIBMAP, 0xbffff1d8) = -1 ENOTTY (Inappropriate ioctl for device) fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40013000 write(1, "errno = 25\n", 11errno = 25 ) = 11
419 名前:417 mailto:sage [05/02/20 21:10:12 ID:0sjUjbHi] つづき dup(2) = 4 fcntl64(4, F_GETFL) = 0x2 (flags O_RDWR) brk(0) = 0x8049a6c brk(0x804aa6c) = 0x804aa6c brk(0) = 0x804aa6c brk(0x804b000) = 0x804b000 fstat64(4, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40014000 _llseek(4, 0, 0xbfffef50, SEEK_CUR) = -1 ESPIPE (Illegal seek) write(4, "ioctl: Inappropriate io"..., 47ioctl: Inappropriate ioctl for device ) = 38 close(4) = 0 munmap(0x40014000, 4096) = 0 close(3) = 0 munmap(0x40013000, 4096) = 0 exit_group(1) = ? $ 結果を見ていると実行したおぼえのない以下の行がありました。 ioctl(3, FIBMAP, 0xbffff1d8) = -1 ENOTTY (Inappropriate ioctl for device) この現象はどこにエラーがある場合におこり得ますか? 知ってる方お願いします。m(_ _)m
420 名前:login:Penguin mailto:sage [05/02/20 21:38:19 ID:uvzGFsyf] 結果じゃなくてソースだそうよ
421 名前:417 mailto:sage [05/02/20 21:48:59 ID:0sjUjbHi] >>420 Please wait for a moment...
422 名前:417 mailto:sage [05/02/20 22:06:08 ID:0sjUjbHi] #define MODULE #define __KERNEL__ #include <linux/module.h> #include <linux/kernel.h> #include <linux/sched.h> #include <linux/fs.h> #include <linux/string.h> static int devmajor=60; static char *devname="testdev"; MODULE_PARM(devmajor, "i"); MODULE_PARM(devname, "s"); #include <asm/uaccess.h> static int devtest_open(struct inode * inode, struct file * file){ MOD_INC_USE_COUNT; return 0; } static int devtest_close(struct inode * inode, struct file * file){ MOD_DEC_USE_COUNT; return 0; } static int devtest_ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg){ int i; printk("testdev: ioctl: cmd=%04X\n",cmd); switch(cmd) { case 1: printk("Driver testing\n"); return 0; } return -EINVAL; }
423 名前:417 mailto:sage [05/02/20 22:07:26 ID:0sjUjbHi] つづき static struct file_operations devtest_fops = { ioctl: devtest_ioctl, open: devtest_open, release: devtest_close, }; int init_module(void){ printk("install '%s' into major %d\n",devname,devmajor); if(register_chrdev(devmajor,devname,&devtest_fops)){ printk("device registration error\n"); return -EBUSY; } return 0; } void cleanup_module(void){ printk("remove '%s' from major %d\n",devname,devmajor); if (unregister_chrdev(devmajor,devname)) { printk ("unregister_chrdev failed\n"); } };
424 名前:417 mailto:sage [05/02/20 22:10:07 ID:0sjUjbHi] デバドラ呼び出し部 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <string.h> #include <unistd.h> #include <errno.h> extern int errno; int main(void){ int fd, ret; fd=open("/dev/testdev",O_RDWR); if(fd<0){ fprintf(stderr,"cannot open device\n"); return 1; } errno = 0; ret = ioctl(fd,1); if(ret == -1){ printf("errno = %d\n", errno); perror("ioctl"); } close(fd); return 0; }
425 名前:417 mailto:sage [05/02/20 22:11:43 ID:0sjUjbHi] 以上で全部です。
426 名前:login:Penguin mailto:sage [05/02/20 23:44:25 ID:Ia/OzVXx] >>417 コピペしたら動いたぞ。 2.6.10 でだけど・・・ カキコしたソースで動かしてみそ。
427 名前:417 mailto:sage [05/02/21 00:06:03 ID:bwxnTums] >>426 マジ?しかも、2.6? このソースでコンパイル通った? そして実行結果キボンヌ
428 名前:login:Penguin mailto:sage [05/02/21 00:25:27 ID:PN7I+gvx] >>427 # uname -r 2.6.10-gentoo-r6 /var/log/messages より Feb 20 23:41:06 XXXXX testdev: ioctl: cmd=0001 Feb 20 23:41:06 XXXXX Driver testing 変更点は /dev/wrkdev にしただけ。
429 名前:417 mailto:sage [05/02/21 00:37:25 ID:bwxnTums] >>428 Thanks! こちらもたった今2.6で動作確認したところです。 う〜む、何故2.4ではエラーなんだろ。 もうちょっと自分で調べてみます。 テストしてくれてありがとう >>426 & >>428
430 名前:login:Penguin mailto:sage [05/03/06 13:19:22 ID:PjCVkwmZ] 何気に良スレ みんな頑張れ お気に入りに追加しますた。
431 名前:login:Penguin mailto:sage [2005/03/29(火) 16:05:44 ID:lbUCJwgD] ドライバのread、write関数でminor番号取得する方法ってないんですか? 2.6用に、LIRCの仮想ドライバで、デバイスファイル2つ作って、 片方にキーコード書き込んだらLIRCに送られるやつ書いてるんだけど。 まあ、LIRC側はIOCTLとreadだけだし、キーコード送るほうはwriteだけだから今のとこ何とかなってるんだけど、気持ち悪いし。
432 名前:login:Penguin mailto:sage [2005/03/29(火) 23:34:47 ID:ChOvrjsk] private_data を使う、かな?
433 名前:login:Penguin mailto:sage [2005/03/30(水) 11:17:39 ID:tWHa73x6] >>432 サンクス! open時に file->private_data にポインタ突っ込んでおくってことですね。 取得することばかり調べてて、あらかじめ持たせておくことを考えてませんでした。 修行が足りぬ…orz
434 名前:login:Penguin mailto:sage [2005/04/16(土) 06:28:18 ID:R/hasO1P] usb-hid についての質問です. usb 接続の joypad を,hid-input 経由ではなく, (drivers/usb/usb-skeleton.c のような) usb のデバイスドライバで処理したいと考えています. 問題は,joypad の挿入時に hid-core の probe 関数が呼ばれてしまい, 自作 usb デバイスドライバの probe 関数が呼ばれないことです. 上記の解決策はあるのでしょうか. 自作 usb デバイスドライバ内では, joybad のベンダーID,プロダクトIDを usb_device_id 構造体に設定しています. kernel は 2.6.10 です. よろしくお願いします.
435 名前:434 mailto:sage [2005/04/16(土) 08:17:16 ID:R/hasO1P] 自己レスです. 解決法を見付けたので,書き込みます. drivers/usb/input/hid-core.c 内の,hid_blacklist 構造体に, joypad のベンダIDとプロダクトIDを加えることで,解決しそうです. スレ汚し失礼しました.
436 名前:login:Penguin mailto:sage [2005/05/17(火) 18:53:06 ID:CbytfkQn] 2.6 kernel(2.6.11.x)上でデバドラ書く場合、 MOD_INC_USE_COUNT MOD_DEC_USE_COUNT を使用する事ってobsolete?
437 名前:login:Penguin [2005/05/18(水) 01:07:17 ID:2baf1QgQ] >>436 れがし
438 名前:login:Penguin mailto:sage [2005/05/19(木) 23:52:14 ID:m1yq1rQI] カーネル2.6.8(turbolinux10Server)でデバイスドライバを開発しています。 ドライバAでエクスポートしたシンボルをドライバBでコールしたいのですが、 ドライバBのinsmod時に"Unknown symbol"エラーが出てしまいます。 そこで、単純なソースで確認してみたのですが、同様の状態でした。 同様のソースをカーネル2.4.18(turbolinux8Server)でコンパイルしてinsmod したところ上手く動作したのですが、カーネル2.6では何か手続きが必要 なのでしょうか? 確認したソースは以下の通りです ==ドライバA== #include <linux/module.h> #include <linux/kernel.h> #include <linux/version.h> int __init test_init_module (void) { printk("test : init_module\n"); s_print(); return 0; } void __exit test_cleanup_module (void) { printk("test : cleanup_module\n"); return 0; } void s_print(void) { printk("Hello, World!\n"); } module_init(test_init_module) module_exit(test_cleanup_module)
439 名前:login:Penguin [2005/05/19(木) 23:52:48 ID:m1yq1rQI] ==ドライバB== #include <linux/module.h> #include <linux/kernel.h> extern void s_print(); int __init test2_init_module (void) { printk("test2 : init_module\n"); s_print(); return 0; } void __exit test2_cleanup_module (void) { printk("test2 : cleanup_module\n"); return 0; } module_init(test2_init_module) module_exit(test2_cleanup_module)
440 名前:login:Penguin [2005/05/19(木) 23:57:30 ID:m1yq1rQI] ==コンパイル手順== cc -c -w -O -I/usr/src/linux/include -I/usr/include -D__KERNEL__ -DMODULE -DKBUILD_MODNAME=test initial.c /usr/src/linux/scripts/mod/modpost initial.o cc -c -w -O -I/usr/src/linux/include -I/usr/include -D__KERNEL__-DMODULE -DKBUILD_MODNAME=test -c -o initial.mod.o initial.mod.c ld -r -o test.ko initial.o initial.mod.o ==動作確認== # insmod test.ko // シンボルのエクスポートを確認 # cat /proc/kallsyms | grep s_print f8xxxxxx T s_print [test] # insmod test2.ko test2 : Unknown symbol in module 's_print' となります。実機が側にないので出力メッセージは大体こんな感じということで。 よろしくお願いします。
441 名前:login:Penguin mailto:sage [2005/05/20(金) 03:04:35 ID:Ds9MyJAI] >>440 カーネルソースんとこでs_printグレップしようぜ 具烈婦 レップってすごいなコレ。どういう意味だ
442 名前:login:Penguin [2005/05/20(金) 08:58:08 ID:zG+tsX8i] >>441 烈婦ワロタ レスありがとうございます。 s_printでgrepしてみたのですが、同名のシンボルは無いようでした。 念のため、ドライバAに EXPORT_SYMBOL(s_print); を追加しても'Unknown symbol'になってしまいます。 ドライバ間の依存関係をどこかで明示する必要があるのでしょうか?
443 名前:login:Penguin mailto:sage [2005/06/07(火) 10:17:39 ID:6uaL4exB] 普通はそんなことはできないんじゃない? 誰かができると言ったのかな? デバイスファイル開いてioctlをコールが普通じゃねぇの?
444 名前:login:Penguin mailto:sage [2005/06/17(金) 18:54:11 ID:9kSGojSd] www.oreilly.com/catalog/linuxdrive3/book/index.csp Linux Device Drivers, Third Edition
445 名前:login:Penguin mailto:sage [2005/06/18(土) 19:13:08 ID:Uc6V46BE] >>444 chapter1まで読んだ。 Policy-free driversの意味がまったく分からない。 うえーん
446 名前:login:Penguin mailto:sage [2005/06/19(日) 15:13:18 ID:f3bsYXGy] the role of a device driver is providing mechanism, not policy. これが、policy-free
447 名前:login:Penguin mailto:sage [2005/06/19(日) 15:19:24 ID:f3bsYXGy] ここでのfreeはduty freeのfreeと同じ使われ方。 policyがないdriver
448 名前:login:Penguin [2005/06/29(水) 18:33:32 ID:hcN+gVRw] カーネル2.4.28を使用して、EZ USB FX2のドライバを作成しています。 USBを4つさし、ここに、デバイスドライバを作成します。デバイスドライバは、 カーネルにあるusb-skelton.cを使って作成しました。3つまでさして、制御した場合、 動作したのですが、4つさし、アプリを動かずとドライバが死にます。 4つとも、ここにドライバを作成し、メジャー番号180 で、それぞれ、 マイナー番号を100 120 140 160としました。 open / closeのみを行うプログラムを作成し、何回か行いました。 何回かおこなうと、ドライバが死にます。 ドライバソースを追っていったのですが、open時に dev = minor_table[minor] という行でdevが0になっていました。 minor_tableは、probe関数で取得しているのですが、なぜNULLになったのか なぞです。どなたかわかる方いらっしゃいますか?
449 名前:login:Penguin [2005/06/29(水) 18:42:20 ID:Cc/icRgl] Linux のドライバのプログラミングの 良い入門書があったらおしえてください
450 名前:login:Penguin mailto:sage [2005/06/29(水) 22:17:33 ID:OM3Tds/i] >>448 Kernel2.4.27のソースしか見てないので違ったら失礼。 >マイナー番号を100 120 140 160としました。 これがよくわからん。デフォでは192から16個を順番に割り当てるようになってるが、それをわざわざいじったってことか? そうなると、スケルトンをあちこち変更してあるのだろうから、さすがにソース無いとなんも判らん。
451 名前:login:Penguin [2005/06/29(水) 22:32:06 ID:rSbPN/4/] >>449 アレ買え。馬の絵の描いてあるヤツ。 高くても我慢しろ。読めば安いと思うようになる。 絶対買え。とにかく買え。12冊買え。たくさん買え。
452 名前:login:Penguin mailto:sage [2005/06/30(木) 09:52:01 ID:6k+4MtMc] 12冊=たくさん 納得した
453 名前:login:Penguin mailto:sage [2005/06/30(木) 11:24:58 ID:9CZUZn2O] なぜ12冊なのかちっとも納得いかないんだが
454 名前:login:Penguin mailto:sage [2005/06/30(木) 11:25:42 ID:J4A9ru3W] たくさんだからだろう
455 名前:Artane. ◆o6gE1yuDGM [2005/07/04(月) 07:22:47 ID:Y9u/GUb1] 2.6.13で又モジュール周りのAPIが変わりそうな悪寒… drivers/base/class_simple.cがまるごとなくなってる…そこのAPIを使ってる ttp://www.linuxant.com/ のx86_64用のHSFモデムドライバがそのままでは動かない状況に(;´Д`) その前はACPI絡みでデッドロックがかーねるにあって動かなかったし、どうなってるんだろうヽ(`ー´)ノ しかもライセンスがプロプラなのでどーすりゃいいのか頭が痛いです。
456 名前:login:Penguin mailto:sage [2005/07/07(木) 22:10:08 ID:DftqFJii] 2.4はcc -o hoge.o -c hoge.cするだけでokだったけど 2.6はmakeファイルを書かないとダメになった。 はぁ、マンドクセ
457 名前:login:Penguin mailto:sage [2005/07/07(木) 22:51:04 ID:Hy9t4ICF] ttp://japan.linux.com/kernel/03/10/26/1026229.shtml ここの一番下に書いてあるのなら楽だろ。簡単に再利用できるし。
458 名前:login:Penguin mailto:sage [2005/07/08(金) 11:00:44 ID:9KK2lDyF] obj-m := unko.o の1行でよくね?
459 名前:login:Penguin [2005/07/24(日) 15:33:14 ID:02p0TYUx] USBのドライバ書いたことアルヤツいる?
460 名前:login:Penguin mailto:sage [2005/07/28(木) 21:47:52 ID:3ylo+PR7] >>459 2.4.0testカーネルの時やってたなぁ ストレージ関係がクラスドライバでないときは動かすのに苦労したよ USB Snoopyで解析したりして
461 名前:login:Penguin mailto:sega [2005/07/31(日) 16:37:19 ID:0Amwd3lA] カーネル2.6.xのSMPの wait_event_interruptible でしつもんです。 起こされる要因をビットであらわすようにして 起こされたあとに flag &= ~FLAG; として 起床要因をクリアしたいです。そこで、 wait_event_interruptible(wq, !(flag & FLAG) ); tmpflag = flag; // ◆1 // ★ flag &= ~FLAG; // ◆2 if( tmpflag & ・・・ としていたのですが、割込が運悪く★のところに来たときに 次回起床要因flagを割込ルーチンで設定された直後にクリアしてしまいます。 ◆1と◆2をアトミックに処理するのに割禁使うのも大げさな気がします。 どうしたらよいでしょうか? (><)教えて!
462 名前:login:Penguin [2005/08/18(木) 13:31:44 ID:wsNIgIg1] ご存知の方がいたら教えて頂けないでしょうか? printk の動作に関してなのですが、たとえば、ドライバの登録の際に int init_module (void) /* Loads a module in the kernel */ { printk("Hello kernel \n"); return 0; } などと printk を使い、(X-Window は起動しないで)コンソールで # insmod filename.o を実行すると Hello kernel とコンソールに表示されるはずなのですが、 表示される場合と表示されない場合があります。実際には、 ほとんどの場合は表示されず、表示されるのは数十回に1回程度です。 そもそも 「printk はコンソールに *必ず* 出力するわけではない」 のでしょうか?どうなのでしょう?
463 名前:login:Penguin mailto:sage [2005/08/18(木) 14:45:51 ID:AA5MGziJ] >>462 ほんとうに\nを入れたのか
464 名前:login:Penguin [2005/08/18(木) 14:47:24 ID:zqtjM++q] >>462 ほんとうにコンソールなのか Xterm とかじゃないだろうな。
465 名前:login:Penguin [2005/08/18(木) 14:54:07 ID:zqtjM++q] X-Window は起動せずにって書いてあったな。 すまそ。 printk() は中で register_console() されたドライバの ->write() を 直接呼んでるから必ず出力されるよ。 出ないとするとログレベルの設定かな。 頭に "<1>" とかつけるといいのでは?
466 名前:462 [2005/08/18(木) 18:10:38 ID:wsNIgIg1] レスありがとうございます。 >>463 \n は入れてあります。 \n を入れるのと入れないのでは違いがあるんですか? >>465 出力されるときと出力されないときがあるんですよ。 でも、起動のたびにログレベルが変更されるというのは考えにくいし…
467 名前:login:Penguin mailto:sage [2005/08/18(木) 18:35:47 ID:spRqn48O] flushされていない or 同じメッセージなので纏められているのでは?(この場合、last message repeated xxx times とでる。)
468 名前:login:Penguin mailto:sage [2005/08/18(木) 20:41:10 ID:cWStGfHc] >>466 ログファイルに吐かれていればメッセージレベル。 出てなかったら改行だろう。 >>467 コンソールに出る方はまとめてくれない。