[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 09:40 / Filesize : 265 KB / Number-of Response : 871
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

ディバイスドライバをハックしよう!



1 名前:login:Penguin [02/01/31 01:14 ID:t3s191ys]
ディバイスドライバの改造、製作にまつわる情報交換、質問、
噂話、ぐち、政治、経済に関するスレです。できる限り生産的にいきましょーや。


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




527 名前:login:Penguin [2006/08/20(日) 01:06:14 ID:BobpEKad]
カーネル層のモジュールのテストプログラム
を作ってるんですが、カーネル層でinit_moduleや
ioctlからスレッドを起こして daemonのように
動作させることってできるんでしょうか?

Linuxデバイスドライバを読んでもスレッドを
起こすような処理は載っていないようなので
参考書籍だけでも教えていただけるとありがたいです。

528 名前:login:Penguin mailto:sage [2006/08/20(日) 11:29:13 ID:EWXtKjUy]
>>527
kernel_thread
daemonize


529 名前:login:Penguin mailto:sage [2006/08/20(日) 20:55:18 ID:bg2sTV9e]
というか、普通に載ってるよね

530 名前:login:Penguin [2006/08/24(木) 12:55:11 ID:6WITQjoc]
そいや、最近のノートPCには指紋センサーがあるけど

あれはハックできるものなの?

531 名前:login:Penguin mailto:sage [2006/08/24(木) 13:34:05 ID:wKY4BjAS]
>>530
OSM 8月号に記事載ってたよ。
shop.sbcr.jp/bm_detail.asp?sku=1016200604

532 名前:login:Penguin mailto:sage [2006/08/25(金) 00:34:04 ID:CPHGcnDi]
>>531 せんきゅー!

533 名前:login:Penguin mailto:sage [2006/08/26(土) 07:37:08 ID:F4NpQAPn]
>>529
すみません。ページご存知でしたら教えてください。
第3版持ってます。


534 名前:login:Penguin mailto:sage [2006/10/04(水) 21:49:48 ID:EGTQjLn1]
すみません、どなたかわかる方教えてください。

現在、XFree86でグラフィックドライバを作ってます。チップは独自のものです。
バス等に接続されておらず、メモリマップドI/Oでアクセスします。

一応画面は出たのですが、1024*768だと縦が半分しか表示されず、
(縦に圧縮される感じ。マウスカーソルが縦につぶれている)
1280*1024だと画面が横に5個くらい表示されてしまいます。

使用しているチップは1ライン4096byte固定なので、解像度に応じて次のラインを
描画するアドレスを更新しなくてはなりません。
カーネルのFBドライバだとline_lengthとかの変数に設定してあげればうまいこと
描画してくれるのですが、XFree86の構造体にはそういった変数が見当たりません。

カーネルFBドライバのline_lengthとかに相当するものはどれでしょうか?

縦に圧縮されるのと画面が5個くらい表示されるのは、別問題な気がしてます。
今、手元にソースがないんですが、InitをするときにvirtualYを*2してやると縦が一見
正常っぽく表示されました。カーソルとかが縦につぶれたままなので、根本対策には
なっていません。

535 名前:Mr.名無しさん [2006/10/09(月) 16:36:24 ID:OGKR436u]
■■■■■■■■■■■■■■■■
■                     ■  違う板にコピペすると、四角の枠の中に
■                     ■  メッセージとURLが現れる不思議な絵。
■                     ■
■                     ■  (その仕組みがリンク先に書いてある)
■                     ■
■                     ■  この原理を応用すると、まったく新しい
■                     ■  コピペが作れる予感。
■■■■■■■■■■■■■■■■




536 名前:login:Penguin mailto:sage [2006/11/05(日) 18:18:15 ID:j6ZWju7f]
>>534
グラフィックチップのモード設定を間違えている予感



537 名前:login:Penguin mailto:sage [2006/12/14(木) 22:35:16 ID:JyAlagq8]
すみません どなたか助けて下さる方はいらっしゃらないでしょうか?
当方PCIデバイスのドライバをLinuxデバイスドライバ読みながら
作成しております。

今DMAを用いてread,writeさせようと思っているのですが、
うまく転送ができておりません。
DMA転送の関数としては

dma_buff = kmalloc( count, GFP_KERNEL | __GFP_DMA)
  bus_addr = pci_map_single( pci_dev, dma_buff, count,
direction );

flags = claim_dma_lock();
disable_dma(channel);
clear_dma_ff(channel);
set_dma_mode(channel, mode);
set_dma_addr(channel, bus_addr);
set_dma_count(channel, count);
enable_dma(channel);
release_dma_lock(flags);
てな感じです。
get_dma_residueで転送できてるかどうかみてるのですが
まったく転送されてないみたいです。
DMAコントローラのレジスタの設定とかは
ほかに何かいるのでしょうか。
ちなみにターゲットのPCはPen3 800MHZ
チップセットは815です。
どなたかお知りの方いらっしゃったら お願いします。


538 名前:login:Penguin mailto:sage [2006/12/15(金) 11:02:30 ID:Qc0JIFW5]
>>537
見ているものがまったく違っているような気がしますが。
PCIでbus master転送したいんじゃないの?


539 名前:537 mailto:sage [2006/12/15(金) 15:20:46 ID:NJleqqJR]
おお、早速のレスありがとうございます。

DMA転送するにはチップセットの中の8237DMAコントローラをいじればいいって思ってました。バスマスタについて少し調べましたが、IDEのDMAもバスマスタになるんですね、知りませんでした。

となるとこのバスマスタはどうやればいいのでしょうか?参考になるものでもいいので、教えてください、お願いします。

540 名前:login:Penguin mailto:sage [2006/12/15(金) 23:40:00 ID:72pQobUh]
ターゲットとなるPCIデバイスの仕様がわからなきゃデバイスドライバは書けないよ
せめて型番だけでも出してくれ

541 名前:login:Penguin mailto:sage [2006/12/16(土) 18:42:01 ID:wkeveW0d]
ドライバというか、モジュールの話なんですけど
スレッドを使ったせい?なのか、psすると
3635 pts/0 R 0:00 modprobe hoge
と残るんですが、これは出ないようには出来ないものなんでしょうか?
勿論 rmmod hoge すると消えるんですけど。


542 名前:537 mailto:sage [2006/12/17(日) 19:34:20 ID:BtOAund7]
ターゲットのデバイスは内製のボードなのですよ orz
となると やっぱボード自体を作った人に聞いたほうがいいのかな?

543 名前:login:Penguin mailto:sage [2006/12/17(日) 19:50:10 ID:pl1Ns6BC]
チップのレジスタ仕様と、制御のシーケンスがわからないとドライバは書けないよ。

544 名前:login:Penguin mailto:sage [2006/12/17(日) 20:36:37 ID:6E+xGodr]
>>542
当然聞くべきなのですよ

545 名前:login:Penguin mailto:sage [2006/12/17(日) 22:08:40 ID:SVqrrgVr]
チップも内製なのか?
だったらデバイスドライバもチップ開発チームが書くものだよな
少なくともサンプルコードの類は書くはずだ

そうでなくて市販のチップを使ってPWBAだけ内製したのなら
使用したチップのデータシートなりプログラマーズガイドなりを読めばいいだけの話

546 名前:537 mailto:sage [2006/12/18(月) 01:17:23 ID:5wopQO2S]
ほぼ内製だったと思います。
ちょっと月曜日会社いったら、聞いてみようと思います。
大変参考になりました、ありがとうございました。

ところで、これは単なる質問ですが、
マザボのチップセットにある8237とかの
DMAコントローラは古いし遅いみたいだから
PCIとかIDEとかに使われてないみたいだけど、
Pen3 800MHzとかでも PIOのが早いの?



547 名前:login:Penguin mailto:sage [2006/12/18(月) 07:35:08 ID:a8xYea1H]
最近のデバイスで言うDMAはバスマスタDMAのことだよ。
バスマスタってのはデバイス側が主導権とってバスを制御して
CPUの頭越しにメインメモリにデータ出し入れすることだ。
そのためにはデバイスにバスをのっとってデータ転送しろって命令を
CPUからデバイスに発行する必要がある。

その手続きを知るためにレジスタなりデータシートなりを調べろって
みなさん言ってるんだよ。

548 名前:537 mailto:sage [2006/12/19(火) 00:01:59 ID:2Sv0wv+g]
なるほろ、大変勉強になりました。
ハード屋さんからマニュアルゲットして
がんばってみます。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<265KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef