- 1 名前:login:Penguin [02/01/31 01:14 ID:t3s191ys]
- ディバイスドライバの改造、製作にまつわる情報交換、質問、
噂話、ぐち、政治、経済に関するスレです。できる限り生産的にいきましょーや。
- 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 コンソールに出る方はまとめてくれない。
- 469 名前:462 mailto:sage [2005/08/19(金) 09:09:08 ID:qyuoI/lN]
- >>467, 468
/var/log/message には出てます。 改行もしてるんだけどなぁ。 どうもよくわからないので、あきらめることにしました。(^^; お忙しいところ、レスありがとうございました!
- 470 名前:login:Penguin [2005/08/19(金) 22:08:36 ID:ZOCJz/g6]
- /etc/syslog.conf に
kern.* /dev/console とか書いてあるか?
- 471 名前:462 mailto:sage [2005/08/22(月) 13:16:52 ID:nvUzxFpI]
- >>470
を! /etc/syslog.conf の kern.* /dev/console が コメントアウトされています! なるほど、これを有効にすると確実に表示されそう ですねぇ。 今、ハードが客先に行ってしまったので 確認できないんですけど、ハードが戻ってきたら 試してみます。 ありがとうございます!
- 472 名前:login:Penguin [2005/10/22(土) 01:07:43 ID:EmofMJka]
- やべえ、カッコイイ......デバイスドライバ自分で書いてる人たち......。
Cは一通り入門程度のことは覚えたけど、遊びでstdio.h使うことばっかりで入門の領域出てないんですよね、僕。 Linuxにも入って間もないからシェルスクリプトの使い方もまともに知らないからLinuxプログラミングなんてまだまだ....。 お馬さんの本、大学の図書館にありましたねー、ぱらっと見たけどさっぱり......。
- 473 名前:login:Penguin mailto:sage [2005/10/22(土) 17:23:49 ID:0rh+z8HN]
- デバドラ本第3版の和訳もう出てるのね。
洋書を見つけてレジに持っていこうとするも、ふと横を見ると書棚にありました
- 474 名前:login:Penguin mailto:sage [2005/10/23(日) 03:10:35 ID:JQc1kDtY]
- >>472
努力でどうとでもなる まぁ頑張れ
- 475 名前:login:Penguin mailto:sega [2005/10/23(日) 06:34:02 ID:TRsS2wCF]
- SMPな環境で、あるAという区間とBという区間があるとき
そこを走行するCPUをひとつだけにして、 かつAとBを同時に走らないようにしたい。 最速で処理できる区間ではspin_lock_irqsaveを使ってもいいけど ちょっと時間を食いたい処理のときには割り禁にしたくない/出来ない。 こういうときってセマフォを使うんだっけ? あと、誰かがそこを走行してたら、待たずにあきらめる処理も どうやるのかいまいちわからんです。
- 476 名前:login:Penguin mailto:sage [2005/10/23(日) 07:17:36 ID:TyUzTsLn]
- っ[MUTEX]
- 477 名前:login:Penguin mailto:sage [2005/10/24(月) 11:41:52 ID:y/bnKz7N]
- futex
- 478 名前:login:Penguin [2005/10/24(月) 21:00:03 ID:qab5z916]
- insmod hello.o
が出来ません.... bash: insmod: command not found と出てしょっぱなから弾かれました....。 FC4を入れているのですが、ぐぐったところKernelのバージョンが 上ってからサポートされなくなった(?)のようなことがかいてありましたが... ちょっとわからないです..。
- 479 名前:login:Penguin mailto:sage [2005/10/24(月) 21:41:23 ID:nHBdU4lq]
- >>478
module-init-toolsが入っていない。 なんて事はまずありえないので、パス通っていないだけだろう。
- 480 名前:login:Penguin mailto:sage [2005/10/25(火) 01:26:16 ID:boXSHzJM]
- っ[/sbin/insmod]
- 481 名前:login:Penguin mailto:sage [2005/10/25(火) 01:50:35 ID:mHOxbI49]
- $ su -
passwd: #
- 482 名前:login:Penguin mailto:sage [2005/10/25(火) 07:29:46 ID:gtGeQ0F/]
- モジュールに挑戦する前にやるべきことがあるだろう。
- 483 名前:login:Penguin mailto:sage [2005/10/27(木) 22:32:36 ID:5z/EqZNh]
- みなさん、返事が遅れてすみません....。
何日ものぞいていませんでした。 どうやら、おっしゃる通りパスが通っていないようでして、 あれから、/sbin/insmod [filename] を試してみましたがなんだか、だめだ!のようなメッセージが表示されて しまい、無理でした。Linuxのデバイスドライバのプログラミングは BIOSレベルでのデバイスドライバを書くときの参考にもなるかと 思ったのですが、やっぱりLinuxを初めてあまりたっていないのに 背伸びをしすぎたようです。出直してきます。 御回答いただいた方々、ほんとうにありがとうございました。:-)
- 484 名前:login:Penguin mailto:sage [2005/10/28(金) 05:51:31 ID:gqZeSigl]
- │
│ J ∩_∩ ∩_∩ ( ・(ェ)・) (・(ェ)・ ) エサクマか? 違うクマよ、 あわてて食いつくと面倒なことになるクマ。
- 485 名前:login:Penguin mailto:sage [2005/10/28(金) 08:53:26 ID:iWNW3bFs]
- >>483
いえいえ是非また来て下さいね>< 御町して檻ます><
- 486 名前:483 mailto:sage [2005/10/30(日) 22:20:06 ID:kv9dDPbi]
- やっとできました!
>>167さんのレスのようにお馬さん初版第二章の一番最初のなーんにもしない モジュールのソースに追加することでロードすることができました。 試しにカーネルソースのmodule.hを見てみるとメッセージでライセンスが無いといわれた経緯から MODULE_LICENSE (license)の定義をみつけ、それをキーワードにぐぐったらこれを追加するような 記述をみつけることができました。 カーネルバージョンが2.4.1以降からこうなったようなことがinsmodのmanページにあったので一気に解決しました。 たぶん、insmodが認識されなかったのはKterm上からやろうとしたからですね.... 嬉しい!
- 487 名前:login:Penguin mailto:sage [2005/10/30(日) 22:27:05 ID:dxIdqW+o]
- >>486
よくやった! とりあえず、今の状態を登山に例えるなら 登山用品店の自動ドアが開いたあたりだな。
- 488 名前:login:Penguin mailto:sage [2005/11/19(土) 17:12:54 ID:mr3HUTh9]
- 2.4から2.6へポーティングしててkoができるまで行きました。
chrdevなんですけどudevの仲間に入る方法がわかりません。 2.4のころのように直接的にmknodしてinsmodするものなのでしょうか。
- 489 名前:login:Penguin [2005/11/24(木) 19:13:51 ID:tUhrvxEF]
- ageようよ。
- 490 名前:login:Penguin mailto:sage [2005/11/25(金) 02:45:31 ID:Y8mPXznM]
- 質問なのですが、回路の方は勉強しておられますでしょうか?
- 491 名前:login:Penguin mailto:sage [2005/12/08(木) 03:07:19 ID:B0ejvBgu]
- ちょっと質問させて下さい。
ノートパソコンを使っているんですが、マイクとスピーカーの位置が近いのでサウンドドライバの 読み込み時からサウンドミキサーが起動して音量設定するまでの間にハウリングしたりするんです。 そこで、サウンドドライバ読み込み時にマイクをミュートにしたいと考えたのですが、 例えばドライバの中にマイクの初期音量を0にするコードを追加したりするようなことは可能なんでしょうか? # スレ違いでしたら誘導お願いします。
- 492 名前:login:Penguin [2005/12/08(木) 10:11:04 ID:j53o+rA9]
- ageようよ。
- 493 名前:login:Penguin [2005/12/11(日) 18:47:51 ID:rh+AeURO]
- はじめまして。
Windows対応のRS232C->USB変換ケーブルを使って、スイッチャを LINUXのPCで制御しようとしているんですが、そもそもドライバを 自分で作る必要があるのでしょうか? LINUXの環境はOSがRED HAT 9でカーネルは2.4です。 もしくは必要かどうかを確認する方法ってあるのでしょうか? ご存知の方がいらっしゃいましたら、答えていただけないでしょうか? よろしくお願いします。
- 494 名前:login:Penguin [2005/12/11(日) 21:37:52 ID:ZmBeQHZx]
- >>493
自動認識されないか?? suse10だと自動で使えた けどBreak信号遅れなくてヒデブだった
- 495 名前:493 [2005/12/13(火) 02:44:01 ID:bCmTAm2t]
- >>494
お返事ありがとうございます。 /var/log/messagesでログを見たら、新しいUSBデバイスが認識できている っぽいことが書かれてました。 たぶんRS232C->USB変換ケーブルは認識できてると思います。 で、早速プログラム組んでスイッチャに信号を送ってみたんですが、 これがうんともスンとも言わなくて。 もしかして変換ケーブルだけ認識しててスイッチャは認識していないかも って考えたのですが、シリアル通信だから信号を送るだけなら送れますよね?
- 496 名前:login:Penguin mailto:sage [2005/12/13(火) 21:07:28 ID:sg6goQTn]
- /dev/ttyUSBの読み書き許可がなかったよ
- 497 名前:色情前世鑑定士 mailto:sage [2005/12/13(火) 23:49:52 ID:xAfc4hOf]
- >>495
ボーレートとかあってますよね? sttyとか使って動作中のUSBシリアルの各設定を 観察・設定してみるといいかもしれません
- 498 名前:login:Penguin [2005/12/17(土) 23:06:34 ID:oosooT9i]
- >>496,497
助言ありがとうございます。 パーミッションに関してはchmod 666を実行したので、大丈夫だと思います。 ボーレート他の初期設定は、少し自信がないのですが、他のシリアル通信 のプログラムを参考にして一通りプログラム内で設定しています。 sttyで確認するというのは知らなかったので、早速やってみたいと思います。 ありがとうございます。
- 499 名前:login:Penguin mailto:sage [2006/01/28(土) 02:19:52 ID:eIqcEw8I]
- 馬本買った記念age
- 500 名前:login:Penguin [2006/01/28(土) 02:22:46 ID:eIqcEw8I]
- ageて無かった…orz
- 501 名前::login:Penguin [2006/01/28(土) 13:24:51 ID:z02En7Mn]
- tky007lip10.iij.net [210.130.172.193]
- 502 名前:login:Penguin [2006/02/06(月) 00:56:30 ID:gxgsnq8Z]
- age
- 503 名前:login:Penguin mailto:sage [2006/03/19(日) 20:02:53 ID:wmRM5297]
- www.doodoo.ru/image-2006/03-16-yeticrab.jpg
- 504 名前:login:Penguin mailto:sage [2006/03/21(火) 02:41:04 ID:wxAXo3DG]
- SMPプログラミングの入門ページとかありませんかね?
どちらかというとAの処理をCPU0に割り当ててBの処理を1に って感じで分けながら処理するタイプのプログラミングなので ASMPのほうがよいのですがこのような話題はどこで聞けばよいのでしょうか
- 505 名前:login:Penguin [2006/03/30(木) 20:19:25 ID:P2MixPUa]
- なんか誰も見てないような気もするけどちょっと質問
Redhat ES4(kernel 2.6..9-11 x86-64) CPU Xeon 2.8G(HT-on EM64T) メモリ4GB な環境で、SCSI Low level driverを書いてるんですが、 物理メモリ4GBしかないのに、SCSI Mid levle driverから 渡されてくる転送アドレス(物理アドレス)が4GBを超えた アドレスが渡されて来ます。 当然メモリ未実装エリアのアドレスなので転送しようにも 出来ない訳でSCSIカードが転送しようとしてエラーとなり ます。 pci_set_dma_msakに指定している値は、SCSIカードがサ ポートしてるアドレス範囲の40bitを指定しています。 これを32bitマスクにすると4GBを超えるアドレスは来な くなるんですけど、もしかしてpci_set_dma_msakて実装メ モリ量も気にしなければいけないんでしょうか? 馬本見てもそんな事書いてないし。たんにハードウェアの アドレス範囲を宣言するだけと認識してるんですけど。 何方かご存知の方居られたらご教授願います。
- 506 名前:login:Penguin mailto:sage [2006/03/31(金) 11:41:12 ID:zMWwd0XE]
- 適当に書いてみる。
他のドライバ見たらわかるけど、実装メモリは気にしない。 pci_dma_syncなんたらが失敗するの?
- 507 名前:login:Penguin [2006/03/31(金) 21:18:57 ID:OpI/WZIP]
- おお見てる人がw
実装メモリはカーネルが握ってるから本来気にする必要が無いのは 分かってるんですが、そのカーネルから来るアドレスが実装容量を超 えたアドレスを通知してくるので悩んで降ります。 pci_dma_syncでなくpci_map_sgで作られたスキャッタ/ギャザーリスト の中の物理アドレスが未実装領域のアドレスを指してる感じですね。 pci_set_dma_maskで32bitマスク(0xffffffff)してやればpci_map_sgで 作られたスキャッタ/ギャザーリスト内のアドレスは4GB未満のアドレ ス範囲で収まる感じです。(当然といえば当然) それを40bitマスク(0xffffffffff)にすると、実メモリ4GBしか無いにも 関わらず32bit以上、40bit未満のアドレスがスキャッタ/ギャザーリス トに含まれてしまいます。 カーネルのバグを疑い出して、カーネルソース追い始めた所でなの で実際にアドレス作り出す所まではまだ追いきれて無い状態です。 ご指摘の通り他のSCSI系ドライバのソースも参考にしてますが、実 装メモリなんて気にして無いしなんとも不可解…。 元々Solarisのドライバ作ってたんだけど、Linuxは今回初でかなり困っ てる状態ですorz
- 508 名前:login:Penguin mailto:sage [2006/03/32(土) 02:19:11 ID:9G03KeUN]
- また別の人が適当に書いてみる。
hugemem使ってみては?
- 509 名前:login:Penguin mailto:sage [2006/03/32(土) 10:42:43 ID:afhcBPMx]
- hugememってi386じゃなかったっけ?
x86_64で4G載ってるって事は、IOMMUとか関係あるのかな。 結局virt_to_bus(pci-nommu.c)かvirt_to_phys(pci-gart.c)呼んでるから、 scatterlistのpageが期待しない値なんでしょうけど、そこら辺調べたらいいのかな。 ドライバいじったことはあるけど、書いたこと無いので適当です。
- 510 名前:login:Penguin mailto:sage [2006/03/32(土) 10:47:55 ID:shKEnT0S]
- 似たようなドライバの中身を調べてみればすぐわかりそうなものだが
- 511 名前:login:Penguin mailto:sage [2006/03/32(土) 15:12:47 ID:afhcBPMx]
- >>510
俺もそう思って、見たけどわからなかったw SCSI側からと、PCI側から見たら、よくわからなくなった。。 bioがよくわからん。 pci_set_dma_maskって要するにbounceするかどうかなのか? あとは、ページ確保するときのDMA/DMA32の切り分け。
- 512 名前:login:Penguin [2006/03/32(土) 16:46:33 ID:p6EHT8/a]
- うぉレスが増えてる。
>>508 hugemem は、>>509 が指摘の通り、x86_64では無いですね。 ただこのドライバは、一つのソースでRedhat ES4の 32bit Uni-processer/ SMP/hugemem kernelとx86-64 kernelの4種類サポートでして、実装メモリ 12GBのマシンでhugememカーネル使ってる分にはアドレスは正常な値が 返って来てます。 hugemem kernelとx86-64 kernelではDMAアドレスは64bit幅で来るのでこ の二つのカーネルの時は処理(アドレス計算とか)は共通にしてます。 >>509 正にそうです。scatterlistに入ってるpageが明後日の所を指し示してるので、 そのままSCSIカードに送るとカード上のIOPのファームがアクセスに行くとメ モリが無いのでメモリアクセスエラーを検出します。 >>510 SCSIカードと言うか実はRAIDコントローラでして、カード上にPCI-PCIブリッ ジが乗っかっててIOPとSCSIコントローラが載ってるカードです。 カード−ドライバ間はI2Oで通信してて、近い奴としてはmagariadとかqla1280 当たりなんですよね。他にも色々見てるんですが違いはそうは無い感じ。 >>511 bioはいまいち良く分からないですね。 ページ確保の時のDMA/DMA32て、GFP_DMA/GFP_DMA32フラグの事でし ょうか? 今使ってるカーネルをみるとGFP_DMA32が未定義でして、kernl-2.6.14とか 2.6.15とか見ると定義されてるんですよね。 なんかその辺も絡んでるのかなと気にはなってはいました。 皆さんアドバイスありがとうです。 もう少しカーネルソース見て来ます。
- 513 名前:login:Penguin mailto:sage [2006/04/04(火) 08:20:23 ID:0xn4pI8o]
- 気になるから、どうなったか知りたいです。
- 514 名前:login:Penguin mailto:sage [2006/04/04(火) 13:11:55 ID:p7vmOtaT]
- >>504
sched_setaffinity(2)
- 515 名前:login:Penguin mailto:sage [2006/04/06(木) 22:28:49 ID:Mnqgo3eJ]
- >>513
まだ色々と追っかけてる途中です。 とりあえずPCIドライバ周りから追っかけ中です。 PCIドライバを見た限りでは、pci_map_sgすると中でdma_map_sg 呼び出しててその中見てもあんまり大したことしてなさそうですね。 やはりbio周りも見ないと駄目なのかも。 もうちとかかりそうですが、わかり次第、結果をお知らせします。
- 516 名前:505 mailto:sage [2006/04/08(土) 14:24:03 ID:+mDmSXuo]
- 原因わかりました。
結論から言うと、pci_map_sg()で作られるSGリストのアドレスは正常でした。 問題なのはpci_map_single()で出てくるアドレスが、低位メモリだとカーネル 論理アドレスを返し、高位メモリだとカーネル仮想アドレスを返してるのが、 原因でした。 高位メモリだとページをダイナミックに確保されるため、物理アドレスとペー ジが1:1でマッピングされないので、pci_map_single()だとvirt_to_physしてる だけなので使えませんね。 なのでpci_map_pageで確保してやれば問題は消えました。 SGリストに変なアドレスが入ると言ってましたが、カードのファーム側で受 け取ったリストを見てたのですが、カード内でドライバから受けた転送アドレ スをカード内部のバッファに結びつける為にファームが独自にSGリストを 再構成しており、そのリストがpci_map_sg()で作られた物と勘違いしてまし た。OTL 色々アドバイスありがとうございました。
- 517 名前:login:Penguin mailto:sage [2006/04/08(土) 16:09:33 ID:MBAxFSYD]
- >>516
解決おめでとうございます。 一般的に使えそうなものならまたどこかで公開してくださいな。
- 518 名前:login:Penguin mailto:sage [2006/04/10(月) 22:36:55 ID:C69QC/MM]
- >>516
よかったよかった。 私もソース読んで少し勉強になったよ。 ネットワーク系しかいじったこと無かったから。
- 519 名前:505 mailto:sage [2006/04/10(月) 23:00:56 ID:9eFrvNz6]
- >>517 >>518
ありがとうございます。 馬鹿高な価格の独自のカード用のドライバで有用性はかな り低いです。。。一応GPLなんですが、カード買わないと非 公開という阿保な方針らしいので、一般公開は難しそうです。 Linuxでの初開発で手探り状態でしたが、お蔭様で何とか目 処が立ってきた感じです。まだ細かな問題がありますが…。 Linuxでの開発はカーネルや他のドライバソース読まなけば 資料が少ない所がキツイですね。 まぁコード上のテクニックとか色々勉強になる部分は多いけ ど、納期のある仕事でやるのは大変ですね。 流石UNIX板だけあって、建設的なスレで助かりました。
- 520 名前:login:Penguin mailto:sage [2006/04/10(月) 23:42:28 ID:Cs5Rh9+Y]
- >>519
> Linuxでの開発はカーネルや他のドライバソース読まなけば > 資料が少ない所がキツイですね。 ちょっと教えてください。 Linuxより資料が多いOSってなんのことを指してますか? 自分は主にLinuxの開発に携わってますが、いつもオープンソースのありがたみを 感じながらやっているので、Linuxが資料が少ない、というのは意外です。
- 521 名前:login:Penguin mailto:sage [2006/04/11(火) 00:42:17 ID:KjDgNH9L]
- OSによっては中身がさっぱりわからないままドライバ開発しなきゃいけない事もあるしな。
つーか、そっちのほうが多そう。
- 522 名前:login:Penguin mailto:sage [2006/04/11(火) 00:47:03 ID:rZUiZ4e7]
- >>520
NetBSDはそういう部分のmanpageが充実してるとか聞きますな。 linuxはmanpage書き上げたら実装が別物になってたなんて笑えん状況がありそうだなあ…
- 523 名前:login:Penguin mailto:sage [2006/04/11(火) 00:57:41 ID:9nKANwAS]
- そこでmain treeにマージですよ。
main tree内の変更はたいていは面倒をみてくれる。
- 524 名前:login:Penguin [2006/05/11(木) 18:07:51 ID:PmwpTb/Y]
- ある内蔵デバイスのドライバでPCの機種毎に処理を変えなければいけない部分が
あり、ユーザ負担を減らすためにドライバ側で自動判別したいと思っています。 機種は違うのにSubvendorIDやSubdeviceIDまで何故か一致しているので、SMBIOS のDMI情報を参照して機種を判別したいのですが、これって可能なんでしょうか? そんなやり方は行儀が悪いとか、他にもっとまともなやり方があるとか何でも 構いませんので、どうかご教示をよろしくお願いします。m(__)m
- 525 名前:好色少年のススメ mailto:sage [2006/05/11(木) 23:43:06 ID:Uu/mTCgT]
- 確かに行儀はよくないかも
新しいハードが出るたびにパッチ提供とか考えたら面倒だし たとえそれが自社ハードだとしてもバージョンアップあるだろうし 判別はユーザランドで行う方が気分も楽だし処理も楽だしバグも少ない
- 526 名前:login:Penguin mailto:sage [2006/05/26(金) 20:11:11 ID:YiUMorw/]
- ttp://lkml.org/lkml/2006/5/24/238
|

|