/*
* $Id: joydev.c,v 1.19 2001/01/10 19:49:40 voj
tech Exp $
*
* Copyright (c) 1999-2000 Vojtech Pavlik 
;
* Copyright (c) 1999 Colin Van Dyke 
;
*
* Joystick device driver for the input&n
bsp;driver suite.
*
* Sponsored by SuSE and Intel
*/
// さぁ、いよいよはじまりました、Linuxドライバーコメント2002、
// 実況はわたくしモモナイ、解説はおなじみサキサカさんです。
// サキサカさん、今日はよろくお願いします。
// はいはい、よろしく。
// サキサカさん、本日のカードはkernel 2.4.16のdriver/input/joydev.cです
が、
// しょっぱなから、このファイルというのはどうなんでしょうか?
// 単に作者の23が、
>>45の言葉どおりキャラクタデバイスから読もうとして、
// 一番手頃なのがこれだったようですよ。
// 23ということは、いつものコメンテーターと作者が違うようですね。
// そうそう。
http://pc.2ch.net/test/read.cgi/prog/1011188426/215-281とは // 作者がちがうんで、私も心配しちょる。
// また煽られて逆上しませんか?
// 本人も、O<^Z=6:\Y2と思ったようだから大丈夫でしょう。
// むしろ、途中で飽きるんじゃないかな?
// そのあたり、読者の応援の声が欲しいところ。
// ところで作者は、joydev.cのGPLの表記を消してしまったようですが、
// 大丈夫でしょうか?
// まぁCopyright (c)は残したから、いいんじゃないかね。
// ともあれ、Linuxドライバーコメント2002 Round1 joydev.c
// いよいよスタートです。
// この放送は等幅フォント対応で、2chよりお伝えします!
#include <asm/io.h>  
; // さぁ、ソースのほうは順調に
#include <asm/system.h> // イン
クルードが進んでおります。
#include <asm/segment.h> // 本日は、/u
sr/src/linux/includeには、
#include <linux/delay.h> // grepと共
にレポーターのヤブナカさんが
#include <linux/errno.h> // 逝っており
ます。ヤブナカさ〜ん?
#include <linux/joystick.h> //*はい!ヤブナカです!今日はヘッ
ダが
#include <linux/input.h> //*いっぱいなので
、findも一緒に待機して
#include <linux/kernel.h> //*万全の体制です!
#include <linux/major.h> // 後程、なに
か不明なマクロなどありましたら
#include <linux/slab.h> // お願
いしま〜す
#include <linux/mm.h> //*
はい!了解です!
#include <linux/miscdevice.h> // さてサキサカさん、インクルードも後
半に
#include <linux/module.h> // 来ましたが、std
io.hが無いようですね?
#include <linux/poll.h> // そ
ういうボケはどうでもいいけど、
#include <linux/init.h> // 「
カーネル」って雰囲気は満点だね。
#include <linux/smp_lock.h> // どうやらインクルードも無
事終了しました。
// さて、始めは定義の類が続きます
#define JOYDEV_MINOR_BASE 0&nbs
p; // サキサカさん、この_BASEって何でしょうか?
#define JOYDEV_MINORS &nb
sp; 32 // 他のinputデバイスとメジャ
ー番号を共有
#define JOYDEV_BUFFER_SIZE 64&n
bsp;// するための工夫だね
 
; &nbs
p; // でも、input.hで宣言しなくてい
いのかなぁ
struct joydev { // さぁ、ここで構造体の
定義です。
int exist; // サキサカさん、ここで定義というのはど
うでしょう?
int open; // あたりまえだけど、joydev.c内
部向けってことだね。
int minor; // あまり他のドライバに応用が効く部分
じゃないでしょ。
struct input_handle handle; // でも、
wait_queue_head_t wait; //
devfs_handle_t devfs;
struct joydev *next;  
; // あ、リンクの様相です。
struct joydev_list *list; //&nbs
p; 複数デバイスが考えられる時の定番ですね
struct js_corr corr[ABS_MAX]; // このあたりの構造体
は、使い方がはっきり
struct JS_DATA_SAVE_TYPE glue;// した時点で、ヘッダを参
照したいと思います
int nabs;
int nkey;
__u16 keymap[KEY_MAX - BTN_MISC]; // さて、こ
のあたりの定数ですが...
__u16 keypam[KEY_MAX - BTN_MISC]; // キーと
ボタンがごっちゃだね。
__u8 absmap[ABS_MAX]; // ここらのABSってなんでしょ?
__u8 abspam[ABS_MAX]; // うーん、よくわからないなぁ
__s16 abs[ABS_MAX]; // それでは聞いてみましょう。ヤブナ
カさーん?
};
/************************input.h*************************************/
#define KEY_PROG4 203
#define KEY_SUSPEND 205 //*はい!ヤブナカです!
#define KEY_CLOSE 206 //*ただいまinput.hの300行付
近にいます!
#define KEY_UNKNOWN 220 //*ここまでがキーボードの番号で
#define BTN_MISC 0x100 //*ここからマウスや他
のコードが
#define BTN_0 0x100 //*ふ
られているいる様子です!
#define BTN_1 0x101 //*こ
こからですね...
#define BTN_2 0x102 //*さ
、カメラさんこっち来て!
// (略)
#define BTN_JOYSTICK 0x120 //*この付近、330行あたりで
#define BTN_TRIGGER 0x120 //*ジョイスティック向けの番号があっ
て、
#define BTN_THUMB 0x121 //*さ、こっちこっち
// (略)
#define BTN_TOUCH 0x14a //*はい、このあたり!
#define BTN_STYLUS 0x14b //*タッチパネルらしき
#define BTN_STYLUS2 0x14c //*定義を最後に
#define KEY_MAX 0x1ff //*全てのキーが
出そろうようです!
//*また、このすぐ後に Relative acesとAbsolute axesというコメントが
//*続くようです!
// input.hからは以上です!
// joydev.cにお返しします!
/********************************************************************/
// はい、ありがとうございました。
// キーボードとその他のボタンで統一的に管理してるけど
// ここではジョイスティックで使うかもしれない分だけにしてるんだね
// ABSはRELと対になって絶対値と相対値。アナログコントローラの話かな。
// とりあえず、CMです。
げ、ぶち切れてる。鬱死....
改行が挟まらなければ 相当おもしろい企画になる・・・
マジ良スレの予感
begin 644 2ch_joydev1.txt.bz2
M0EIH.3%!629360A%+XT``+9_G[JP``#,=_]U/[?;,+__WV`_?O_____OS___
MF?=@!.[NS<^WM;=[S4>SGN[5R&IH1H"GHIY-JC:30VB>FI^I/U3-0/4&FGIJ
M!Z@VC:4]3:@``!H'J``!M0,FTC0`-$28@P*>"9"GAHH&AZ(>IHT`]0,C0T:'
MJ``````#0```-#0:()II3QJ4_4VIZH\H9#TT31H-I`&U!H8AB#0#(:,0!IH:
M``#0#0T`TT#$A0:4]I--3T31H/4]0TR:-/U1ZFFF30T-``8@````:&F@9```
M`:`08!#1B:`R:83)ID`&$:-,`F`)A!H9`Q,@#``"8F3`3`30))$1IE,4\2/4
M_4T@T-&GJ>HR&@S2&@:``:#0```````````8'",1C"&^9*JG'[T9$HI(&-7K
M<R2UW8LHB7RW@PNGZ,5R,@F?`X:]]6?*@\AA1!+]AMG$$R$%Z#6BI@;I8)E$
M#0V\R67$M!!1MI'``(8.#?;]9*3"CC/04GY[9,")-38J#5@$!*1`,$)",DF"
M,!#ER=#/F.P!LPJ^\UD.DIML@*/A="L4E\"0*:`6CDL4ZLB'(N0K)R`2<S""
M26E3JSLO9#`O-\18TZ]PLT!16$^#A*9UI<SJM15`%.>PJ4F#PGPK,H%5JO)J
MGV@WNIA6V-^.(2KFCM43JQCZ4/(%H`86<FJ4'``3``&WJ0K&6-L(C'Q:Q4Z9
MDH1%=5`FDN8.BJZ,<9(R#9"JHQ#Q9-@FDA]<QPHS;$?AF/=[C;PK,Q&D+UTS
MHC$U/L;$)=$`1@MA("$:&1U24`PU>ZD,5?PWSR6A'J+P`<HKN*J_%O#>*5+`
ME%%>\*`3EL814Y2G.F*-2D%,``VX*\2%)C"PT3HA``;O`'/-HX%017@EU]Z*
M@4D\+3S@$%\4>-,B)N-T_&1W!-9(=EI$!-ISE-E9.I41`UHX*9;.<R+2/'O`
M`?,.,+.6+U<&5+>N6D`7YW:]"`6S<(/$\1@YX43%3*P)X3Y$5SXH$=900NO@
M*P53)YAM,.::9X6ECZ!6M;)1(`AI5)U)$@!B40HIBG1GB5AC802!GY%0>8A.
M88%M9MGB96$2;)_KVD6EEK!VONC\W"$J0AQG0MI<Y7-MD?H$I&@CJ+'RWB>?
MT<E-8XTLT4I8C'B&+2]CZZ)!?'W5T0$$`1.7=3!$`D!!,JJA+AC858TE3(R0
MW<XHBH"D.=,[GGGIM-U0R"#AA)D$`#[2`R2B80==-3WHHVE,EFS"LU*_"4LZ
M,ZL>3+V%DI'57CLV@]G8OK\_EF0MQY$P/R]6($`$#9S,X9A"]P6,R7>>XO3;
MOK\!N2S:AE#E<PN#!@!Q%%`G2`?C!>)-)=?"^4-19*JGMNJ4<`E#7OW"$'<+
M_0/AJ_(^I+V?B;R90$LIN#HX6GE:A5F%$_=X:K6!."L^0*`Q-5:N=8'-)@?+
M->J+1X5"YC%MKS2^ARBZ'&/[18EM_'1PY/750@QJ3K:;K>B"-O+N>S>E\WY/
M[<V088<WQW#YI((A`6>%Z$-&I*/IJ?(/^S@$L)#14I1&%H0>R=JTJU(SHD!,
MV[94*SBH*IX$B&@W;5ER`]M$:B"V$X:%-R&16KN)6E_4V<`9F\@A96NE1RIN
MC%-\@UC&,?/3;`7Q*CZ0[BY_*=L\E`6,P.>+DA)9%L0Y>=+,RO57L'-DS;7&
M9Q8]%(-E9G34[^*]A'`U3MV``_*!2N"=CP,\XO`2"5^S`/!")2),:$C@6`1$
M^PPLI,^5M+P;G*R76:WE`F8#!LWEP84Q?JNX"(1+!9H76'0B!9!D*NP1FCM;
M^M"D0F#,&8,*J15U;H75]L_`<K[QZ2DT@3C_I6ING0@9RX=;%-G]7K1-$XC+
M^&"1$C-:Q"F!_4UC%$03&(Y5UHHT(Q1(UAJ,05-<WLY`*D7]L02X[?7=S<P3
M%&PI\#K<LC@1",MHX<AF2C0]84!)%^8!P;+"Q!EK$0JFN`:ZZ"%8Q$Y'COU+
M6A7(,,:;)38Y@KYDBW+#D4F$LBRX3(D"%Q=5D/S6!,*]5RRXA.>P?%9-:E.)
M*$UHT7`(&DP8!4,QM;<7EZX0(P%7B[8@3T`)H21SX0.IL&>`DE08L*`8A
AW#!TY]Z\9@*S`]*GHI*TF5"K@6UJ/_XNY(IPH2`0BE\:
`
end
begin 644 2ch_joydev2.txt.bz2
M0EIH.3%!6293649+3QL``@#_G_40!`!H<_](?O_?ZK___^H_?O____OWQ;_^
MG!-@!$.*+,U@:WVR[<-"F*:8*GFA&D::,:GJ/*'I&U`]/5-&U`T/4`]0T])Z
MFF(#$`T#!```]0`!HD-)II/TAI,RFU,"9I1M$VIZ$T-``&@``9`````#1HT-
M`/U31Y(@9,$9,"-,0TPC$-,`$8$8"#)ID-&0T!B8"8A@)B--,3`F`2)$F33*
MI^TE/R:C4>IZ3`@]0/4;4?J0-/4-H0&]4]0```````R`,$T&@@9,$9,"-,0T
MPC$-,`$8$8"#)ID-&0T!B8"8A@)B--,3`F`:FDD])H,U``--&@```&0R,U&C
M(`````````R8$#1D8@3N:?BL#MGS.7=3&L7Y(,I:K2FCSU8[D>8$R++4E275
MXCRD!AW.?$9;QOZJV(B`HWT^E`+-+=ZZA18(GD$2*OZD)`"6,2P^&PX1&\^1
MNW_`IK&'6X6"X0K$-P#(2#(4E$'J@4,1BSN9Y)30R&4C"2&\DP1N,J2F;DD*
M??N%,@`9JA1ONIE?*U&;M+X"L&`-&O@4-QFD0]1DQI#:;[WH]0;W!UC(57`5
M)F&<"FJ^ZO)$>/Y!%&K>O6CKIHBM!V;O6$L&3PZ$`QM.6+.2N"G"\K@2-Y3M
MN(1<?/2L"
[email protected],THXW9O3WZ6?/*OML15<L&&AF0:Z"6T:]Y+0:GM3G
M=8"LVHKVL&.ROZJ<F&TO:"QRKFL&R+;2MD"@@=.S%Q.]0TK5&%+RO,W>^E+9
MV[&]%8K(A0$*+((:KC&@Y//61-0M<Y`.'1;`7CB2*I2AC,;K%":&ZK9@JH58
M(BID&`X"`ERY`:!JED15I6ZUC+!$VWF%E9#Q$3@2[,080$D13N4QGF"=#DX7
MJY6S$DPJ42LC+YT<49[31KES2(HRR`03GG(I*+]=X+.FDV7"EGRNN(5JM
M6RRXMPW[80PC355&1RD\4A4!<+1K\_4"4D7V6FPD5R6-#)W9.$TA@#1]V;96
MS]=UJ-G*5\,F=5ZE@SZJ1_,KL0$3$M/MP&,HP+CURG%\7[$S^;2EIML32;?O
M-"8[BJ:UIZ5OB?FQ?IF\\7'#MX^>;Z-#LOQ.@F8Z`5Z!?AQ<4Z`2^NB6]15\
M':-'1VR%2'HJM&[6^J?CG29$ZZG2H5`A(V@OYX18]2SJ2JK,&$KB^A6&:D'_
ML\_W5OTJGU'X"9.TI98C,C,L(PC.;;_*[0E3""*\9N=HMT@/P+5\'CD?3,M1
ML:O<6#4O$,+6;,+TQD\#N5&5HJZ+FE#8?=JH^QJRE'3ML,ZEW'Z](5)C%:5*
MPM0P)HV7`;PAH2,>F9C5JO0*"HBIQ8J,AR!JFWAQJ&**2V,DU[[+4BX8PW4J
MMK-/PQ3VB!OS&LF,&S_=1,.*)M`-I*A%!)NKA1)$N]J7P.7,P+4`H;X/R61S
ME7>$+U<6.>U2Y%!8QJ\"3"-V(XFBY2KC)DB`I*,D3=N:L&G="[0ACT+H:_
M5'97^OP=K%F[RFM59TF,%Q&MZA?ZXDFDV8QJL:4@"(Q`B(D4SF#'^B45`3(P
M,#@A+HG,9`*P#V((`!80::S4MI(A)-DR,S#,IGB"J$Z0@9<@GXL$T$&BA%Y.
M*[+H4,6@GEW4+3:GOX-9-RZN6+%V)/J,&E27I3W,T%\-<T:MM7!F[>=214/8
M8D1GA+>C<MB00UAK(4D=Y+/OJZ:1@F2A1,L6EB(M5@&S`'E3;.(T"K`R%T&"
M`:-DZ3"@8<2:^&1Q/NV`PQ""P",ZX0()QA`=74[4.A1!8PLB`;38L34?\B)1
=!)C:,L0V)L&C5"05)*J-`)!.&+N2*<*$@C):>-@`
`
end
只今、続き作成中です。それまで
>>52-53の美しい映像(?)でお楽しみ下さい。
m(__)m
struct joydev_list { // 先程、一部の地域で画像が乱れ、
struct js_event buffer[JOYDEV_BUFFER_SIZE]; // お見苦しい
int head; // 点があったようです。お詫びいたします。
int tail; // まぁ、字下げを1にしたし、文字も減らして
int startup;// どうにかなるかな?
struct fasync_struct *fasync; // お、なにやらsyncできるみたいだ。
struct joydev *joydev; // こちらは、先程の構造体ですね。
struct joydev_list *next; // やはり、ここもリストだね。
};
static struct joydev *joydev_table[JOYDEV_MINORS];
// さぁ、ここで変数定義!
// 一応、外部からはアクセスできないね。
// マイナー分だけ確保してるけど、
// joydev_list.joydevとの関係が気がかりだねぇ
// 配列の値はポインタのようですが?
// 領域を動的に確保することで
// 不必要に肥大化するのを防いでるんだね
MODULE_AUTHOR("Vojtech Pavlik <
[email protected]>"); // おっと!?
MODULE_DESCRIPTION("Joystick device driver");
MODULE_LICENSE("GPL"); // ここでマクロの登場だ。意味は大体わかりますね。
MODULE_SUPPORTED_DEVICE("input/js"); // suseもちゃんと貢献してるねぇ
// この後いよいよ関数の登場です。
// たのしみだね、モモナイさん
// 私は、23がどこまで理解できるか心配ですが...お願いしますよ
// サキサカさん!
// そう言われても、結局書くのは23ですからねぇ...
// ついに関数が来ました!
// 名前からすると、データ補正かな?
static int joydev_correct(int value, struct js_corr *corr)
{
// あれ、見慣れない構造体が...
//*モモナイさん!モモナイさん!
// なにやら「値」が来てるなぁ
//*モモナイさん!
// はいはい、ヤブナカさん?
//*今joystick.hに来ているんですが、sturct js_corrについての
//*情報が得られました!
// はい、カメラお渡しします。
/************************joystick.h**********************************/
//*只今、include/linux/jyostick.hの75行目付近に来ています!
/*
* Types and constants for get/set correction
*/
//*どうやら、この付近で補正の為の定数等を定義してるようです!
#define JS_CORR_NONE 0x00 /* returns raw values */
#define JS_CORR_BROKEN 0x01 /* broken line */
//*データがナマの場合と壊れた場合を分けているようです
struct js_corr {
__s32 coef[8]; //*このあたり、coefや
__s16 prec; //*precが何の略なのか
__u16 type; //*全くナゾです。
}; //*こちらからは以上です!
/********************************************************************/
// はい、ありがとうございました。
// なんだかわかったようなわからないような...
// 作者がそもそもjoydev.cがどういう物か理解してないからねぇ
switch (corr->type) {//さぁ、分岐した!
case JS_CORR_NONE: // rawなときだね。
break; // そのまま逝くようです。
case JS_CORR_BROKEN: // こちらは壊れた時のようですが?
value = value > corr->coef[0] ? (value < corr->coef[1] ? 0 :
((corr->coef[3] * (value - corr->coef[1])) >> 14)) :
((corr->coef[2] * (value - corr->coef[0])) >> 14);
// ははぁ、coef[0]-coef[1]の範囲から値がでてるとき、coef[2,3]で
// 適当にあわせつつ値を直しているんだな。
break; // 直してから先に進むようです。
default: // さて、その他。
return 0; // やることが解らんときは、何もしないで帰る、と。
}
if (value < -32767) return -32767; // おーっと、±32767の挟み打ち!
if (value > 32767) return 32767; // signed 16 bitかな。
// この関数も終りにきたぞ!
return value; // BROLENの補正のみやってるね
}
// 関数第一ラウンド、なんとか終了となりました。
// Linuxドライバーコメント2002、/usr/src/linux/driver/input/joydev.cより
// 2chでお送りいたしております。
// まだ続ける気かねぇ
おもしろい!(w
59 :
login:Penguin:02/02/02 23:09 ID:OVfU0W3z
うえ
60 :
login:Penguin:02/02/03 00:07 ID:zajX165D
61 :
login:Penguin:02/02/03 00:09 ID:BzrcOmdf
もういいよ。
sunは倒産。
SGIも倒産。
HPもWSから撤退。
IBMもWSから撤退。
NECもWSから撤退。
世界にはPCしかなくなりました。
OSもLinuxしかなくなりました。
犬厨の望む世界になりました。
終了。
62 :
23:02/02/03 02:51 ID:KGnsKyPB
そうか、もういいのか....(鬱
63 :
login:Penguin:02/02/03 14:14 ID:P0SAPnI+
>>61 その時、マイクロソフトのドライバ開発者は…
(続く)
64 :
login:Penguin:02/02/04 18:52 ID:NNgCZ8vd
>>63 >>61 その頃、マイクロソフトのドライバ開発者@新橋ガード下は、
「ってやんでぇバーカヤローゥ! Linuxがなんだってんだっ、ヒック、ゥィー!」
65 :
login:Penguin:02/02/04 23:07 ID:2sAhIg4J
>57
いいぞ!続きを!
66 :
login:Penguin:02/02/05 15:21 ID:iaI23jTt
>65 同感。
でも、もう少し読みやすい(見やすい)とうれしんだけどな。
67 :
login:Penguin:02/02/05 18:54 ID:F3yqU4bD
「予想される近未来」
・Linuxに市場を荒らされ全ての商用UNIXが撤退。
・Windowsは順調に売れて市場を拡大。
・エンタープライズ用途でのLinuxの駄目さ加減が発覚してみんな困る。
・みんなしょうがなくWindowsに移行する。
・Linuxはカーネルの分裂により大混乱。商用用途で使い物にならなくなる。
・Windowsしかなくなる。
>>67 BeOSのような第3の勢力が突発的に出現して
Gates帝国もUNIX連合も一夜にして淘汰される。に一票
サーバはどうか知らんが
結局ごちゃごちゃでも便利なものから離れられない。windowsは無くならんのは当然だが
linuxもWindowsがGPLにでもならん限り無くならんと思うなあ。
そのうち良くなるだろ。
もしBeOSみたいなのがでてきても、よっぽど革新的でFreeでないと、また往っちゃうよ
コピペにマジレスカコワルイ
71 :
login:Penguin:02/02/05 21:21 ID:JQSzVmkT
5年程度のスパンで見ると、Linuxは産業用の組み込み系のOSと
して活躍するでしょう。
また、IBM系のリナックスも順調にシェアを伸ばしていくでしょう。
PCではWindowsが制覇するでしょう。
72 :
login:Penguin:02/02/13 10:11 ID:Ocy9V5oG
モジュールを組み込むとき、変数が渡せるものもいくつかあるけど
そのときに どの変数が渡されているかあとで知る手段ってない?
例えば sb.o とかなら irqとかいろいろ渡せるよね。
insmodしたその後で irqいくつだったか忘れたときとか
知る手段無いよね。
あと、ついでに どの変数が渡せるかを事前に知りたい。
ソースみりゃわかるけど面倒くさいじゃん。
73 :
login:Penguin:02/02/13 11:37 ID:QvFCkM3Q
/proc以下のファイルで確認すればいんじゃないの?
ディバイスドライバをファックしよう!
75 :
BERO:02/04/02 18:12 ID:zlzOuE7v
デバイスドライバの解説って
「デバイスにはchar型とblock型があって・・charデバイスの実装サンプル」
で終わってるのが多いんだけど、
実際はソレを生で使ってることは少なくて、サウンドデバイス、CD-ROMデバイス、FlashROMデバイス、ビデオデバイスとか
デバイスごとのフレームワークがあって、実際のハードウェアドライバはその下にくるようになってる。
実験機器や自作ハードで生のI/Oポートをたたけるだけでいい、ていうのならともかく、
(フレームワークが存在するような)一般的なハードウェアでは、このテのデバドラ解説ってのは参考にならない。
ファイルシステムドライバとかもこの範疇に入らないし。
みたところ各フレームワークの解説ってのはみあたんなくて、結局ソースにあたるしかない。
ところが既存のソースも、古いコードが残ってたり、そこからのコピペと思しき不要なコードが紛れ込んでたりして、
どれをリファレンス実装として参考にしたらいいのやら、って感じでアタマいたくなる。
76 :
login:Penguin:02/04/05 22:06 ID:swoFdSIN
まぁ、アゲられついでに75さんにLinux界に伝わる格言を一つ。
「動けば正義」
>77
VBプログラマに通ずるものがある(w
お馬さん本買ってきて、サンプルコードをftp.ora.comからダウンロード
しようと思ったのに、ftp.ora.comがつながんねーYO!
どなたかftp.ora.com/pub/examples/linux/drivers/の中身を
ミラーしていただけないでしょうか?
82 :
login:Penguin:02/08/14 00:47 ID:2q+/MEDi
age
あがりついでに...
>>78 >>77 >VBプログラマに通ずるものがある(w
「クソコードを見付けたら、書き直すチャンス!」ってのが
VBとの違いだな。
糞コードをハケーン!!
じっとガマンして保守に付き合うのはプロ
とっとと書き直すのはアマ
85 :
login:Penguin:02/08/16 14:43 ID:S24KMUAB
>>84 じゃあオレはアマチュアの方がいいや。
プロっていってもピンキリだし。
たとえ糞コードでも動いているものであれば余計なことをしないのが当然だろ。
元と全く同じ動作をしれば何事も無く済むが僅かでも挙動が変わったりバグが入ったりしたら
周囲に迷惑をかけることになるのだから、
勝手に書き直すようなまねをしでかすのはアマチュアか怖いもの知らずの無分別な若造。
サン電子U-cableP5のドライバはいずこ?
IOのケーブルはLinux対応してまっか?DDIに聞いたら
Linuxは独自のOSですので当社では判りかねます。
つーかWinはMS独自のOSだしMacもMac独自のOSでは?
製作者及び団体の数ではWinの方が独自性が強いと思うのですが
先生方!教えてくだはい
おお、こんなスレがあったのか。
ちょっと感動……と思ったら
>>87 だから、自分でドライバを書けよ。
仕事としてソース非公開なLinux用ドライバ開発なんぞをやってます。
>>75の言ってる事は同感。
drivers/char/serial.cなんかを見てると情けなくて泣きたくなってくる。
「動けば正義」は否定しないけど、「動いたら放置」ってのはちょっと
なぁ。
Linuxだと、なら「ならお前が書き直せ」ってことになるんだけど、正直
どこから手をつければいいのか、途方にくれるようなドライバが多すぎ
る。
88>書ければWinでネットしません!
サン電子は「ドライバ書くので情報くれ」といってもくれない会社だから
どうしようもない。
じゃIO・DATAさんでも良いよ。
H"用のUSBケーブルで32kパケット通信(つなぎ放題)対応って2つしか無いのね!
9月にサンデンシから新しい奴が出るけどWinとMacのみ対応だし・・・・
>>90 書けるけどWindowsで繋いでますがなにか。
>>91 いや、情報のない状態からつついて解析していくのも、なかなか
面白いものだよ。
必要性と興味が持続しないとやっとれんけどな。
U-cableP5ならどっかにドライバ落ちてなかったか?
94>落ちてたけどウチのPCはFDも無いしCD−Rも無いから意味無し
それ以前にturboLinux7でドライバの入れ方知らんから無意味
Turboじゃなくても知らないが・・・
完全マスターTurboLinux読んで頑張ってみます。
お騒がせしました。
96 :
login:Penguin:02/08/22 00:52 ID:hok07Wzb
昔DOS3.1の時代に、プリンターのデバイスドライバーをひとつ一機種に
ついて書くたびに50万円もらっていた友達をしっている。
非常においしい商売だったようだ。
97 :
login:Penguin:02/09/17 02:52 ID:uJTVD8V1
今さらあげてしまいますが、オライリーのドライバの本に書いてある。
file構造体がなにをやっているのかよくわかりません。というかその存在自体が疑問です。file_operation構造体はinit_moduleによって登録されるってのはわかるんですが、file構造体はどんなときに使われるとかよくわかりません。
デバイスドライバで2番目に重要な構造体と書いてあったのでかなり意味があると思うのですが、
くだ質できく内容でないと判断したので、ここで聞かせて下さい。
>>97 Linux のドライバは(一部除いて)ファイルで表されてるわけです。
/dev/配下にいっぱいありますよね?
そのファイルをopen すればfile_operations 構造体のopen メソッドが呼ばれる。
そのファイルをread すればfile_operations 構造体のread メソッドが以下略。
多分システムコールかデバイスファイルについて知識不足なんだと思われ。
なぜ存在自体が疑問なのか書いてる途中でわけわかんなくなってきたよヽ(`Д´)ノウワァァン
ちなみにここでつまずいてたらその本絶対読めないから教えてくれる人探した方がいい。。。
99 :
login:Penguin:02/09/18 03:24 ID:AWtWYegc
ありがとうございました。
どうやらfile_operations構造体の次にでてきたので、
デバイスドライバ特有の構造体かと勘違いしてしまったようですが、
低水準システムコールのときのfile構造体と同じだったんですね。
わかったみたいです。
一応半分位まで読みました。なんとなくですがわかったきがするので、
音なるやつでも書いてみることにします。
>>99 あう。。。file 構造体の方でしたか。file_operations 構造体と間違えた。。。
ごめんなさい。でもわかったんならいいよね。。。
デバイスドライバで、file構造体って見ることあります?
漏れ、見たことないんですが。
age
久々に上がってたりして...で亀レス
>>101 一つのドライバで複数のデバイスを制御(特に割り込み)する時に
使わない? (private_data)
static な領域にデータ置いといてベタで検索でもいいけど...
デバイスドライバを書くときに使う各種マクロや関数などが
詳しく&解りやすく載っている資料とか無いでしょうか?
謎の関数が多くて、、、、
>>104 >37 にある Linux DeviceDriver 2nd Edition
これを wget で落して(いいのか?) grep で検索しる。
あとはお決まりのソース drivers/char 以下を検索かな?
106 :
101:02/09/24 18:33 ID:YwjfORCG
>>103 おお、なるほど。
そういうドライバは書いた事無いからなー。
>105
やっぱり、それしかないですか、、、
馬の本見てがんばります
さらに質問
ハードを直接叩く(?)デバイスドライバを作っているのですが
良いサンプルとか無いでしょうか?
とりあえずは、
linux/drivers/char/qpmouse.c
あたりを参考にしてるのですが、、、
>>107 お馬さんで充分かと...
> ハードを直接叩く(?)デバイスドライバを作っているのですが
これだけでサンプルないかって言われてもなぁ。
誰もレス出来ないんじゃぁ?
マウスドライバでも作ってんの?
レス出来ないかも知んないけど。
>>107 ターゲットと同じ種類のドライバ
or
似たような構造のハードを制御するドライバ
が一番いいサンプルなんだが。
目的のハードがどんな物かわからんので誰も答えられんと思う。
物によって微妙に作りが違うし。
110 :
ねここねこ:02/09/27 09:39 ID:2CKrLbeR
>108&109
確かに、物が不明だとわからないですね
物はFPGAというチップ経由で
データがやってくるハードのようです
外部のチップからFPGAにある程度データが貯まると
IRQをキックして(?)まとめてデータをCPUに対して送ってくるとか
言ってたな、、、
実はハードがまだ出来ていなかったり〜
>>110 > 実はハードがまだ出来ていなかったり〜
よくある話。
まだ漠然としているが、画像処理か計測系だね?
割り込み関係と poll、 DMA or mmap? 、PCI?。
まず、このあたりをお馬さんで理解すればよろしいかと。
112 :
ねここねこ:02/09/30 09:38 ID:ILjZfqgw
>111
>まだ漠然としているが、画像処理か計測系だね?
だいたいそんな感じです
お馬さん本見てがんばります
FPGAというチップってあーた
114 :
ねここねこ:02/10/04 10:18 ID:reYTaTWA
>113
なんか呼び方が変なのでしょうか?
FPGAというICが有ると効いたのですが、、、
115 :
ねここねこ:02/10/04 10:18 ID:reYTaTWA
116 :
login:Penguin:02/10/06 18:35 ID:URuHDkGy
hack! age
117 :
login:Penguin:02/10/17 21:17 ID:RGYfSOtJ
age
118 :
login:Penguin:02/12/13 10:20 ID:NJ02XiJx
うおータコがドライバ書くのってやっぱ無理があるなー
でも仕事だしがんばるぞーちくしょー
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
なんとか頑張って下さい>ひろゆき
お金は持ってないけど応援します。
ひろゆきは早起きのし過ぎでちょっと壊れてるな。
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
名スレの予感
福島もキタ━━━━━━(゚∀゚)━━━━━━ !!!!
>>81 まぁそういうところでよしゆきはすごいわな。
127 :
山崎渉:03/01/15 11:31 ID:m6zO97qQ
(^^)
128 :
ドライバー:03/01/15 13:09 ID:I5ofFU+k
いまLynxEMのドライバいじってるんだけど、
マルチディスプレイに成功した人います?
もう何年も放置されてる問題だから無理なのかな…?
>>128 Windows2000でも放置されてた問題だし
あきらめよう
130 :
login:Penguin:03/02/05 19:41 ID:YQeAwX++
保守age
131 :
login:Penguin:03/02/07 19:54 ID:jVRQXDIx
1ms以下のタイミングでポーリングを監視する方法って何かないですか?
やっぱ割り込み使わんと無理?
>>131 HZいじってタイマの周期を1ms以下にすればなんとかなると思うけど。
割り込み使うのが正攻法じゃないかなー。
133 :
:03/02/07 21:50 ID:VKdRg4g7
135 :
133:03/02/11 02:29 ID:/akGZqt4
136 :
login:Penguin:03/02/11 03:04 ID:bsSBCYyf
>>17 > モジュールアンロード
> # rmmod hello.o
正しくは、rmmod hello
気になったんで...
137 :
login:Penguin:03/02/14 03:21 ID:vgGnuLAo
お馬さんの本にspinlockにぎったままsleepしちゃいかん、
って書いてあるんですがどんな困ったことが起こるのか教えて欲しい
今日この頃…
>>137 スピンしっぱなしになる
ちなみに超電磁スピンはこれの応用
>>138 ああ、そっか。てことは攻撃中にspin_unlock()されるとマズー?
140 :
login:Penguin:03/02/20 22:11 ID:+wCEK+nh
>>137 デッドロックが起きる。
spinlock を獲得したままスリープすると、そのプロセスが目覚めるまで
同じ spinlock を獲得しようとするプロセスがビジーウェイトし続ける。
141 :
137:03/02/21 03:18 ID:qmT4Thn5
>> 140
どうもです。
自作基板に載っているPCIバスブリッジのDMAを叩くのに、複数プロセスからDMA転送を
同時に行うことはできないのでspinlockにぎらせてwait_event_interruptibleか何かを
コールしようとたくらんでました。
DMA転送が終われば必ず割り込みで叩き起こされるのでそこでspin_unlockすれば
問題ないかなと思ったのですが、間違いですか?
その間ビジーウェイトし続けるのがもったいないということであればsemaphoreで
ブロックするべきでしょうか。
>>141 だめ。
プロセスAのカーネル内: 獲得 -> sleep
プロセスBのカーネル内: 獲得に失敗してビジーウェイト
なのだけど、カーネル内では、ページフォルトとか明示的にschedule()呼ぶと
かしないとスイッチはおこらないので、単一プロセッサシステムだと絶対死亡。
SMPだとか、2.5のプリエンプションカーネルだと、大丈夫かもね。
終了割込みで起こされる処理なら、sleep と wakeupを使うのが普通じゃない?
143 :
bluehat:03/02/27 02:47 ID:2xZ0HU3V
デバドラをアクセス(介する?)することで、ファイルを暗号化して保存&
ファイルを複号化して取得、ってな事ってできんのか?
おめーだったらどうやって実現するよ?教えろ!ゴルァ!
普通loopだろう。
145 :
bluehat:03/02/28 03:17 ID:5YDI7es3
>>144 却下。普通じゃだめぽ。デバドラで実現しる!
>>145 んー、何をもってデバドラというのかよーわからんが、狭義な,
ハードウェアを制御するドライバのことなら
「オマエラ、おつむ悪すぎなので出直して下さい。」
>>145 んと、loopは広義のデバドラですよ。メジャー番号7のブロックデバイスです。
kernel-2.5 でデバドラのインターフェースが大幅に変わるという話を
きいたがおまえら知っているか?
>>148 プリエンプティブカーネルになるってのはどっかで見たが・・・
I/F というと、エントリーポイントの仕様でも変わるのか?
それとも、カーネルがエクスポートするルーチンの仕様変更?
>>148 モジュールまわりの仕様が変わるというのはあるが、
モジュール自体に影響ないはずだし…
構造体とかカーネル側の関数が変更されるのはよくあることだし…
その話の出所はどこよ?
151 :
148:03/03/07 00:48 ID:2S2Wvrkx
struct file_operations つくって register_chrdrv()するだろ。
そのやりかたが変わるとか聞いたんだが。
153 :
148:03/03/07 13:38 ID:2S2Wvrkx
>>152 安心したよ
>>149 カーネルプリエンプションに関しては大問題だ。
ドライバかなり書き直さなくてはいかんのぉ。
2.5のソース読んでからまた来い
>>153 その様子では 2.5のカーネルプリエンプションを理解するのが先です。
名前から想像するものとはちょっと違うものです。
156 :
login:Penguin:03/03/17 00:55 ID:POpqK4+0
デバイスドライバを書いてる人って 日本に何人いるんだろう
hello.o くらいだったら1万人くらいいるのかな?
157 :
login:Penguin:03/03/21 01:19 ID:4f4NMJji
3000人くらい
158 :
LINUX初心者:03/03/22 00:33 ID:c2EgVY2O
ご質問があります。
IDEのDVD-ROMから、暗号無しのDVDデータを取り出すソフトが必要になり
まして、MT.FUJIの仕様書とcdrom.cを読んでいます。どうやら、DVDの
情報はIOCTLを通して取り出せるみたいなのですが、データ(2Kバイト)の
データの取り出しは、IOCTL経由では出来ないように見えます。その割には
CD-ROMのモード1と2、CDオーディオのデータはIOCTLで読み出せます。
フリーのソフトを見るとpf_readで実行しているようですが、どうやれば
良いのでしょうか? 出来たらIOCTLを使いたいのですが・・・・
よろしくお願いします。
160 :
login:Penguin:03/04/13 20:50 ID:Z3+MYXr2
USBドライバの開発の参考って何かないですか?
161 :
あぼーん:03/04/13 20:51 ID:fhD9Fsc5
162 :
login:Penguin:03/04/13 22:03 ID:Z3+MYXr2
kill -9 161
>>160 定番は、似たようなのを見る だろ。なお、クラス(ってかベンダ)ドライバな
ら、一番簡単なのは、scanner.c 。バグありだけどね。
164 :
login:Penguin:03/04/13 22:16 ID:Z3+MYXr2
>>163 ありがとうございます。
ところで、カーネルに組み込まれているデバイスドライバのソースをモジュール化するのに定番の手法とかって
ないでしょうか?
カーネルがROM化されているので、モジュールにする必要があるもので。
>>164 手法って、なにも特別なことはないとおもうんだけど...
make modules 以外でコンパイルするっていみ? それなら -DMODULE がみそ。
カーネル関連のソース内部でも、ドライバでも、これを ifdef とかで見る。
それともmodule対応じゃないドライバを対応に書き直す方法? こっちなら、
適当な初期化/後かたづけ処理を module_init()とmodule_exit()で登録すればいい。
166 :
login:Penguin:03/04/13 22:33 ID:Z3+MYXr2
>>165 >module対応じゃないドライバを対応に書き直す方法
こちらの方です。ありがとうございます。意外と簡単なんですね。
早速、明日試してみます。
デスクトップで動いているドライバを組み込みLinuxに移植しようとしてるんですが、
ドライバを作るのははじめてなので、馬本で勉強してます。まだ2章目ですが
167 :
開発メモ:03/04/14 14:29 ID:Y6l/xCVk
Warning: loading module.o will taint the kernel: no license
がでたときは、
#include <linux/module.h>
MODULE_LICENSE("GPL");
printk の出力はdmesgで見ることができる。
#define MODULE
#include <linux/module.h>
int init_module(void){ printk("<1>こんにちは\n"); return 0;}
void cleanup_module(void){ printk("さやうなら\n");}
を gcc -c hello.c でコンパイル
insmod ./hello.o で組みこもうとすると
./hello.o: Note: modules without a GPL compatible license cannot use GPLONLY_ symbols
というメッセージがでます。
カーネルのバージョン管理だと小間生のですが、カーネルの再構築をせずにすり抜ける
ことは不可能でしょうか?
170 :
山崎渉:03/04/17 11:54 ID:KRn99/cy
(^^)
172 :
山崎渉:03/04/20 06:14 ID:xFRXxEWb
∧_∧
( ^^ )< ぬるぽ(^^)
173 :
login:Penguin:03/04/21 11:26 ID:dxqbEfvS
insmod test.o をするとこんなエラーがでます。
どんなライブラリをリンクすればいいのでしょうか?
./test.o: unresolved symbol remap_page_range
./test.o: unresolved symbol __wake_up
./test.o: unresolved symbol schedule
./test.o: unresolved symbol kmalloc
./test.o: unresolved symbol vfree
./test.o: unresolved symbol usb_deregister
./test.o: unresolved symbol video_register_device
./test.o: unresolved symbol remove_wait_queue
./test.o: unresolved symbol video_unregister_device
./test.o: unresolved symbol usb_free_urb
./test.o: unresolved symbol usb_alloc_urb
./test.o: unresolved symbol usb_register
./test.o: unresolved symbol __pollwait
./test.o: unresolved symbol kfree
./test.o: unresolved symbol usb_string
./test.o: unresolved symbol add_wait_queue
./test.o: unresolved symbol usb_submit_urb
./test.o: unresolved symbol usb_control_msg
./test.o: unresolved symbol __vmalloc
./test.o: unresolved symbol printk
./test.o: unresolved symbol usb_set_interface
./test.o: unresolved symbol vmalloc_to_page
./test.o: unresolved symbol __generic_copy_to_user
./test.o: unresolved symbol usb_unlink_urb
>>173 カーネルのバージョンとtest.cがわからないとちゃんと答えられない
>>173 find ライブラリのありそうなパス -exec grep -l "remap_page_range" {} \;
とかやってみるとか?
>>173 MODVERSIONSでせう。
test.cコンパイルするときに-DMODVERSIONSつけてみ。
当然includeはカーネルと同じものを使うこと。
177 :
173:03/04/21 12:48 ID:dxqbEfvS
カーネルは、2.4.20 です。
ソースはこれです。usbカメラのドライバです。
http://www.smcc.demon.nl/webcam/pwc-8.10.tar.gz このソースの *.c を
INCLUDEDIR = /usr/src/linux/include/
CFLAGS = -O2 -DMODULE -D__KERNEL__ -static -Wall -Wstrict-prototypes -DMODVERSIONS -I$(INCLUDEDIR) -DEXPORT_SYMTAB
でコンパイルしてできた、*.o を、
ld -o test.o -r ./*.o でリンク。insmod test.o で、173のメッセージがでます。
ROM化されたカーネルに、モジュールをいれてusbカメラを使えるようにしようと思ったのですが・・・
ちなみに、同じソースをカーネルに組みこめば動作するのは確認しました。
>>177 そのカーネルの.configは?
CONFIG_MODVERSIONS=nのときに-DMODVERSIONS付けても同じ事になったような気がするが。
179 :
うまうま:03/04/22 01:26 ID:0SpJ1zOH
>>177 お馬さん本2巻目の
「11.3.1 モジュールでバージョンサポートを使う」
「11.3.2 バージョン付きシンボルのエクスポート」
あたりをみたらどうよ? サンプルコードもあったよ
健闘を祈る!
180 :
177:03/04/23 19:22 ID:TY1i8cop
みなさん、ありがとうございます。
--static を外したら、うまく出来ました。
>>178 組込みのLinuxなんですが、開発元がソースをよこしてくれないので不明です。
GPL的にいいのだろうか・・・
181 :
login:Penguin:03/04/23 21:19 ID:DUkd9IIg
182 :
login:Penguin:03/04/24 12:36 ID:LW5TaSjX
Linux で USB制御とかを学ぶのに便利な電子工作キットのおすすめってありません?
できるだけ安いの。
183 :
うまうま:03/04/25 12:03 ID:HCQr+NWK
184 :
bloom:03/04/25 12:26 ID:1KQi+Ees
185 :
login:Penguin:03/05/02 11:48 ID:LZsBxbHZ
USB デバイスを/dev 以下のデバイスノードに割りあてるにはどうすればいいのでしょうか?
馬本を見ながら、
devfs = devfs_mk_dir(NULL, "matsu", NULL);
if(!devfs)
return -EBUSY;
devfs_register(devfs, "nt401", DEVFS_FL_AUTO_DEVNUM, 0, 0,
S_IFCHR | S_IRUGO | S_IWUGO,
&scull_fops,
sampleDevice
);
とやっているのですが、indmod すると
Hint: insmod errors can be caused by incorrect module parameters, including invalid IO or IRQ parameters
IOやIRQはどこからとってくればいいのでしょうか?
>>183 モルフィー企画は、5/1 千葉地裁に破産申し立てを行った模様。
やっと終わったようですね、夢が・・・
>>185 それはモジュールの初期化に失敗した時のメッセージでつ。
だまされないように。
>>185 それは、init_moduleがretun 0;以外で終了した場合のメッセージですよ。
普通、デバイスが見付からないときは -ENODEVとかでかえすでしょ?
返り値を確認汁。
ISAのデバイスでは、IOとかIRQの設定が違うと見付からないことが多いので、
insmodが、ヒントのために、IOとかIRQはどうよ? って書くことになってるだけ。
189 :
185:03/05/02 14:12 ID:LZsBxbHZ
>>187 >>188 ありがとうございます。
probe の処理のところへ devfs 関係の処理を移したらinsmod できるようになりました。
あぁ、すまん。よく読まずに答えた。USBなのね。
USBの場合は、usb_driver.probe() が NULL で帰った時がそのエラーですね。
で、probeのところでdevfs関係やるので正解です。
191 :
login:Penguin:03/05/02 15:56 ID:gUkzFRNW
モニタのドライバディスクっていうのはあるんでしょうか?
当方モニタを認識できないのですが・・・。
193 :
185:03/05/02 18:18 ID:LZsBxbHZ
>>190 insmod はできるようになったのですが、devfs関係の処理がうまくいきません。
devfs_mk_dir と devfs_register がNULL しか返さないのですが・・・
195 :
185:03/05/02 19:13 ID:LZsBxbHZ
>>194 了解っす。さっそく、カーネルを再コンパイルします。
196 :
ドライバ初心者:03/05/07 14:44 ID:8SxzL6UK
ううう、USB器機との通信方法がよくわからん。
0x07 を送ると 0x1f を返すというUSB器機との通信でどうやるの?
キャラクタデバイス作って、それをread, write するでいいの?
197 :
bloom:03/05/07 15:13 ID:dAUH81mE
>>196 ??? どのレベルでわからないんだろう。ユーザアプリから機器を操作するのは、
すべからくデバイスドライバを通してopen/close/read/write/ioctl 等です。
でも、0x07 を送ると 0x1fを返すとうUSB機器なら、デバドラいらないじゃん。っ
ていうか、機器もいらないじゃん。「0x07を送ると0x1fを返す」ダミーの関数
かませればいいじゃん。たぶん、その質問はなにか省略しすぎで返事がしにくい。
>>198 分かりにくくてすいません。
USB機器に、データ確認コマンド(0x07のバイト列)を送る。
USB機器にデータがあるなら、(0x01)が返ってくる。
(0x01)が返ってきたのを確認したら、データ取得コマンド(0x0a)を送る。
USB機器からデータ(20バイト)が返ってくる。
上記の仕様で、USB機器にバイト列を送ったり、USB機器が返すバイト列を受け取るにはどうすればいいのかが分からないのです。
urb構造体を使うのでしょうか?
>>199 なんか、道が遠いな。がんばれー。
> urb構造体を使うのでしょうか?
まぁ、正解なんだけど。なにしろ最終的には全部usb_submit_urb()だから...
実際には usb_bulk_msg()とか、その類を使うの。
その前に基本設計。ハンドシェイクのようなものがあるのよね。それをどうする?
ドライバを一番簡単にするなら、ドライバは、ただデータの横流しをするだけにして、
ハンドシェイクをアプリにさせたらいい。
アプリが /dev/それ をopenして
アプリが 0x07をwriteして
アプリが readでまって、0x01がかえったら
アプリが 0x0aをwriteして
アプリが readする
これが一番簡単だろ。ドライバのデバッグより、アプリのデバッグのほうが簡
単だから、ドライバを簡単にするのは意味がある。
もし、これにするなら、カーネルに標準でついてるdrivers/usb/scanner.c を
参考にしたらいい。はっきりいって、本当に横流ししかしないドライバなので、
参考にして書き直す必要スラなくて、idさえ指定すればスキャナじゃなくても
ナンデモ操作できます。おすすめ。
あ、でもclose/unloadあたりでのリソースの解放順序にバグがあるので、気を
つけてね。
202 :
ドライバ初心者:03/05/08 18:46 ID:01Q6DwzH
>>200 >>201 アドバイスありがとうございます。 非常に助かりました。
とりあえず、morphy と scanner の両方をコンパイルして試してみました。
morphy の方は、何とかデバイスをopenできるように改造できました。
scannerの方は。 カーネルがdevfsを使えないのと、今回のUSB器機からendpoint の取得がうまくできないようです。
/dev/usb のスペシャルファイルの取得はmorphy を参考に、read write はscanner を参考に、 ハンドシェイクは
>>201 の方法でやってみます。
203 :
ドライバ初心者:03/05/09 19:55 ID:ye3nMZo+
open,close,probe,disconnect はうまく動くようになりました。
read の実装に入ったのですが、 usb_bulk_msg で
#define RD_NAK_TIMEOUT (10*HZ)
usb_bulk_msg(dev, usb_rcvbulkpipe(dev, endpoint), buffer, 20, &partial, RD_NAK_TIMEOUT);
usb_rcvbulkpipe へ渡すパラメータの endpoint にはどんな値を渡せばいいのでしょうか?
lsusb で以下のように表示されている 2 とかでいいのでしょうか?
bEndpointAddress 0x02 EP 2 OUT
scanner.c のソースを読むと、1,2,3, のどれかの値が入るようなのですが・・・
>>203 相手側の仕様にあわせてください。
仕様書ぐらいあるよね?
>>205 たぶん、1にかいて、2を読むんだとおもうけど、そんな状態でコーディングを
すすめちゃだめです。仕様書をもらって、それをもとに設計してから書くの。
207 :
うまうま:03/05/11 02:10 ID:sP9foAmw
>>203 ひょっとして未公開プロトコルをハックしてlinux用にドライバ
作ってんの?
lsusbの表示について
デバイスからデータを読むためのエンドポイントは IN になって
いるはずだよ。そのようなエンドポイントがひとつしかないなら
その番号でOKだと思う。
逆に、デバイスへデータを書き込むためのエンドポイントは OUT
そのターゲットデバイスにはエンドポイントが複数あるっぽいけど、
それだったらコマンドやりとり時、どのエンドポイントが使われて
いるのか調べる必要がある。
208 :
206:03/05/11 02:28 ID:+b1ggx7/
あう。よく読まず1,2を逆にかいてしまいました。つことで
>>206に惑わされないで2がOUTね。
>>205
>>206 組み込み用のLinuxにUSB機器をつなげてアレコレしようという計画がありまして。
ところが、社内でC言語の経験があるのは私だけ。とりあえず研究開発名目で、USBドライバを
作ってみろと白羽の矢が立ちました。
うまうまさんのアドバイスでwriteができるようになりました。ありがとうございました。
あとはreadだけです。
210 :
ドライバ初心者:03/05/15 18:21 ID:QUGfuS7s
read するとタイムアップになってしまう・・・。何が悪いのでしょうか。
キューのクリアとか必要ですか?
初歩的な質問ですみませんが、導師のみなさま、お導きを。
write()されたデータを一時的に保持して、次のread()で保持した値を返す
ようなキャラクタデバドラがあるとします。
アクセスする側が単独のプロセスの場合、実装は簡単ですが、複数のプロセスが
上記デバドラにアクセスする場合はセマフォを使っての排他制御が必要となります。
これをアクセス側にセマフォを設けないで、上記デバドラ側で同等の機構を
実現するにはどのように実装すればいいのでしょうか?
>>211 プロセス別にキューを持てばいいんでは?
openされたら新しいキューを割り当てて、
closeされたら開放。
213 :
211:03/05/16 18:32 ID:g3wElzO+
>>212 では、同一プロセスの複数スレッドまで考慮しなければならない場合、
どうすればいいのでしょうか?
214 :
212:03/05/16 19:18 ID:0mzALYCZ
>>213 スレッドじゃなくても、二つ以上開いたら破綻しますな。
→お手軽コース:1回だけオープンできるようにする。
→まじめに作る:複数キューを持てるようにする。file.private_dataにキューのポインタ入れるのが簡単かな?
というところで。
215 :
うまうま:03/05/17 03:23 ID:WAKxeCTB
>>210 readしたとき、とりあえず何バイトか読み出してる?
デバイスが返しうるバイト数よりも多く読み出そうとして待ち
続けているという可能性はない?
>>215 >readしたとき、とりあえず何バイトか読み出してる?
その通りです! すっと、返されるはずのバイト数よりも多いバイト数で読み出していました!
今はハードが手元に無いので月曜日に試してみます。ありがとうございました。
217 :
動画直リン:03/05/18 01:11 ID:pMLvChGr
猿でもわかるように書かれたデバドラ作成解説ページってある?
>>215 タイムアウトは無くなりましたが、こんどはusb-uhci.c 内でエラーになってしまいました。
/proc/kmsg の出力は
usb-uhci.c: ENXIO c0010200, flags 0, urb de96cbe0, burb de96cbe0
usb_bulk_msg の使い方がまずいのでしょうか・・・
usb_bulk_msg(scn->dev, usb_rcvbulkpipe(scn->dev, M_READ), ibuf,
count, &partial, RD_NAK_TIMEOUT);
USBデバドラ開発に役立ちそうなページ
usb.c File Reference
http://www.atomised.org/docs/linux-2.4.19-drivers/usb_8c.html
>>218 デバドラの前に、まずはRFC2795から行ってみよう。
>>220 英語読むのめんどくせ
猿にハムレット歌わせるんだっけ?
>>219 は私のバグでした。
しかしながら。タイムアウトは解決しないままです。
Windows用のドライバではちゃんと読みこめているようなのですが・・・
lsusb で 下のようにでているのと関係があるのか・・・
unknown descriptor type: 05 24 00 10 01
unknown descriptor type: 04 24 02 06
unknown descriptor type: 05 24 06 00 01
unknown descriptor type: 05 24 01 03 01
223 :
山崎渉:03/05/22 01:55 ID:p4opmoqv
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
225 :
login:Penguin:03/05/27 12:06 ID:VgmJadOg
あまりにも便利なので上げさせてください
insmod するとこんなエラーが出てきたのですがどうすればいいでしょう?
couldn't find the kernel version the module was compiled for
227 :
山崎渉:03/05/28 16:42 ID:3t6i6zxR
∧_∧
ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
228 :
login:Penguin:03/05/28 16:55 ID:3qAfQe3K
>>226 そのドライバを今のカーネルでコンパイルし直してください。
もしくは -f オプションで insmod してください。なんちって
>>226 なにをいれた? 「実はモジュールじゃない」ってときもそれ。
230 :
226:03/05/29 18:33 ID:FeUqO3hy
>>228 >>229 MIPS で動いているLinux に、Redhat7.2 のUSBデバイスドライバです。
ソースのコンパイルはちゃんと通るのですが。
あと、Hello World を出力するだけのデバドラの動作は確認済。
>>230 archがあってないとか。
$ file vmlinux
$ file そのモジュール
の結果を見てみたい所ですね。
232 :
226:03/05/30 10:13 ID:Mg17snq6
>>231 $file vmlinux
./vmlinux: ELF 32-bit LSB mips-2 executable, MIPS R3000_LE [bfd bug], version 1, statically linked, not stripped
$file test.o
./test.o: ELF 32-bit LSB mips-2 relocatable, MIPS R3000_LE [bfd bug], version 1, not stripped
>>232 あってるねえ。謎だなあ。
init_moduleがエラーを返してるって事はないよね?
234 :
226:03/06/02 11:33 ID:O0kbkjww
>>233 cc に渡すパラメータに -DCONFIG_MODVERSIONS を付け加えたら無くなりました。
ところが今度は、insmod するとこんなエラーが・・・
./test.o: unresolved symbol _gp_disp
./test.o: Note: modules without a GPL compatible license cannot use GPLONLY_ symbols
_gp_disp はどこのライブラリにあるのでしょうか?
>>234 そんな関数見たことないなー。
別なモジュールに依存してるとかないの?
カーネル絡みはlibgcc以外のライブラリ使わないよ。
236 :
コピペ:03/06/03 13:33 ID:9FZ3sCry
(゚∀゚) ?
Insmod が _gp_disp シンボルが未定義だと文句を言います
(゚∀゚) !
_gp_disp は MIPS の PIC コード中で使われているマジックシンボルです。
このエラーは、システムをクラッシュから救ってくれたため、むしろ有り難いものです。
この場合の問題の要点は、カーネル作成時の Makefile のオプションと、
カーネルモジュール作成時のオプションは同じにすべきだということです。
特に、オプション -mno-pic -mno-abicalls -G 0 が重要です。
まあなんか知らんけどgoogleって便利ってのはわかった
意味まではわかんないけど
>>236 へぇ、MIPSのPICは変わっていると聞いたことがあるが…
そんな事もやってるのか。
ひとつ賢くなったような気がする。
239 :
():03/06/03 18:52 ID:U5Cecnio
Windowsで動いているUSBデバイスドライバを、Linux へ移植しようとしています。デバイスの認識、open, write, close はうまく出来ているようなのですがreadがうまく行きません。 -75 のエラーが usb_bulk_msg() から返って来ます。-EOVERFLOW のエラーのようです。
ところが、一度、Windowsに認識させてから、そのデバイスをLinux につなぎ直してreadするとうまく行きます。
何らかの初期化をしているようなのですが、Linux ではどのようにすればいいのでしょうか? sniffer Tool の出力には
0000027510:31:13>>>>>>> URB 4 going down...
0000027610:31:13-- URB_FUNCTION_CLASS_INTERFACE:
0000027710:31:13 TransferFlags = 00000000 (USBD_TRANSFER_DIRECTION_OUT, ~USBD_SHORT_TRANSFER_OK)
0000027810:31:13 TransferBufferLength = 00000008
0000027910:31:13 TransferBuffer = 81406fd0
0000028010:31:13 TransferBufferMDL = 00000000
0000028110:31:13
0000028210:31:13 0000:
0000028310:31:13 80
0000028410:31:13 25
0000028510:31:13 00
0000028610:31:13 00
0000028710:31:13 00
0000028810:31:13 02
0000028910:31:13 08
0000029010:31:13 00
0000029110:31:13
0000029210:31:13 UrbLink = 00000000
0000029310:31:13 RequestTypeReservedBits = 00
0000029410:31:13 Request = 20
0000029510:31:13 Value = 0000
0000029610:31:13 Index = 0000
とでていたので、usb_ctrl_msg()を使うのかと思ったのですが。
#define EPIPE32/* Broken pipe */
のエラーを返してしまいます。どうやればいいのでしょうか?
ちなみにチップは、日立の38K0です。
240 :
login:Penguin:03/06/04 10:07 ID:RzUG7kJc
デバドラ開発超初心者です。
誰か教えてちょーだい!!
カーネルモジュールでぬるぽ等による例外が起きてoopsが出た後って
リブートしなくちゃいけないの?
rmmodするとリソースbusyと言われて出来ないし。
簡単にやり直せる方法はないのでしょうか?
kdbとかを使うと出来るのでしょうか?
小さなドライバなので出来ればprintkだけでデバッグ
済ませてしまいたいです。
>>240 su して、
reboot
これが最速。
>>240 MOD_INC_USE_COUNTしなければ、rmmodできるはず。
Oops食らったまま動かし続けるのは気持ち悪すぎるが。
243 :
240:03/06/04 18:14 ID:RzUG7kJc
>>241 >>242さん、ありがとうございます。
MOD_INC_USE_COUNT、MOD_DEC_USE_COUNTを空に
再定義してみました、単純なミスとかで他のメモリ
領域に影響なさそうであれば、これで切り抜けよう
と思います。
危なそうな場合は、やっぱりrebootですね。
244 :
うまうま:03/06/04 23:56 ID:yoK8ZXbv
>>239 ドライバの移植?なかなかおもしろそうだね
read, writeのコマンドシーケンスは合ってる?
ひょっとして、readする前にデバイスに対し的確なコマンドを
writeしてあげないといけないのでは?
そのsnifferログは、OSから8バイトのデータをデバイスに送っている
点や、URB番号が若い点からして、USBデバイスからディスクリプタを
読み出そうとしているところと見た。それはWindowsでもLinuxでもデバイスを
繋いだらUSBホスト側が自動的に行う部分。いわゆる初期化処理。
今回のreadできない問題に関係あるとは思えないな。
245 :
239:03/06/09 11:05 ID:FPzn7DZy
>>244 write シーケンスの前にあるこの処理が妖しいとは思うのですが、Linux でどうやって実現したらいいのか・・・
0000037010:31:29>>>>>>> URB 7 going down...
0000037110:31:29-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
0000037210:31:29 PipeHandle = 814d7b1c
0000037310:31:29 TransferFlags = 00000003 (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK)
0000037410:31:29 TransferBufferLength = 00001000
0000037510:31:29 TransferBuffer = 8140c000
0000037610:31:29 TransferBufferMDL = 00000000
0000037710:31:29 UrbLink = 00000000
0000037810:31:29B133TN: m_Endpoint1IN.SubmitUrb status ==>
0000037910:31:290x00000103
0000038010:31:29
0000038110:31:29B133TN: B133TNDevice::Create Status
0000038210:31:290x00000000
0000038310:31:29
0000038410:31:29B133TN: Entering B133TNDevice::Device Control,
0000038510:31:29IRP: Major=0xe
0000038610:31:29 Minor=0x0 Flags=0x30
0000038710:31:29B133TN: Code=0x222000 InputSize=0x4 OutputSize=0x0
0000038810:31:29B133TN:
0000038910:31:29B133TN: Entering B133TNDevice::IOCTL_B133TN_COMMAND_OUT_Handler,
0000039010:31:29IRP: Major=0xe
0000039110:31:29 Minor=0x0 Flags=0x30
0000039210:31:29B133TN: Code=0x222000 InputSize=0x4 OutputSize=0x0
0000039310:31:29B133TN:
0000039410:31:29B133TN: FIFO ReservedDataSize=>
0000039510:31:290x00000000
0000039610:31:29
0000039710:31:29UsbSnoop - IRP_MJ_INTERNAL_DEVICE_CONTROL, IOCTL_INTERNAL_USB_SUBMIT_URB
0000039810:31:29
246 :
239:03/06/10 11:06 ID:3w0EVlGb
cat /proc/bus/usb/devices で表示されるインターフェースの中から
C:* #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=100mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=piece
E: Ad=83(I) Atr=03(Int.) MxPS= 16 Ivl= 16ms
I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=piece
E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl= 0ms
E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl= 0ms
I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=piece
のデバイスを活性化するにはどうすればいいのでしょうか?
248 :
247:03/06/13 18:44 ID:pewsS0ej
249 :
うまうま:03/06/13 22:20 ID:EYuB3skO
>>248 こりゃ使えるサイトだ。日本語でUSBの仕様をここまで説明したサイトって、
他にはないよきっと
>>247に質問!
「活性化」というのがよくわからないから教えてほしい。
cat /proc/bus/usb/devices で
>>247のような表示がされたってことは、
すべてのPIPEがオープンされているものと思ったけど。
結局、このデバイスにはInterfaceが二つあって、USBバス上に
接続したときは Interface 0しか初期化されなかった。その状態で
Interface 1のEndpoint 0x81からread()しようとしたが、
まだPIPEがオープンされてないためできなかったということ?
250 :
login:Penguin:03/06/14 17:46 ID:G+Mtao/F
オイラGPLライセンスだよ〜
と表明するときに書くマクロって
どういうやつだっけ?
MODULE_LICENSE("GPL"); のことかにゃ。
253 :
247:03/06/16 12:53 ID:bzsTHCID
>>249 そのとおりです。
えーと、いま作成中のドライバを試してみたら解決していませんでした。
Interface 1の初期化ってどうやるのでしょう?
254 :
247:03/06/16 17:13 ID:bzsTHCID
追記:cat /proc/bus/usb/devices の表示は
>>247 なのですが、なぜかread
が出来ないのです。writeは出来るのですが
255 :
:03/06/19 18:39 ID:L1S32rBn
質問です。USB のpipe を reset するにはどうすればいいのでしょうか?
256 :
中年ハード屋:03/06/20 00:46 ID:GdrpjdbN
DVDのCSS回路を設計するために、そのCSSの方法を理解するために、
LINUXのide-cdを利用したソフトを書いています。(ライセンス済みです)
それで、DVDのディスクキーや内部情報、そして、認証などは出来るのですが、
タイトルキーの取得が出来なくて困っています。
atapiを通したイトルキーの取得で何かしらのトリックがあるのでしょうか?
このようなソフトを書く場合に、通常のアプリソフトのように(いまの
やりかた)書けば動作するのですか、それともドライバーソフトのように
特殊な方法が必要なのでしょうか?
よろしくお願いします
257 :
login:Penguin:03/06/20 12:05 ID:w5824KTx
258 :
login:Penguin:03/07/02 02:02 ID:VujfXoME
(・∀・)renice!
259 :
login:Penguin:03/07/06 23:29 ID:lEtq+gmE
(・∀・)renice!
260 :
login:Penguin:03/07/08 15:11 ID:nDf4bQ70
(・∀・)renice!
261 :
linuxer:03/07/09 01:17 ID:W4/RwfEH
僕はLinux のethernet のドライバを改造したいデス
ふつは通信用途に最適化されてると効きました
それはぺケットをみる目的につかいます
なにかアイディアはありますか??
tcpdump等の既存のものより詳細にみれなければ意味がない気がするけど大丈
夫なのかしら。
263 :
_:03/07/09 01:29 ID:RRaEUYou
>>262 石にもよるでしょうねえ。
最近の利口な奴はいろいろ手を入れてくれるし。
>>261 現行ドライバだと、どの点が不満なのか言ってもらわないと助言しようがないよ
パケットモニタリングはNICチップのpromiscuousモードの仕様に依存する話だ
>>265 現行のドライバならpromiscuousモードで動かしたときに
パフォーマンスがわるいな感じです
それでぺケットを取りこぼすことになってしまうので
キャプチャ用途に最適化できたらいいなと考えましたです
>>266 promiscuousモードだと全パケットをホストPCに転送するから
通常モードに比べて取りこぼす可能性は増える。対象のNICチップは何?
素直にintelなり3comを買えば済むだけの話かもよ。
ちなみにリアルテック(蟹)の性能がよくないのは特許を避けてるから。
現状でいいパフォーマンスのNICが欲しけりゃIntel(or元DEC)、3comの
ちょっと値が張るNICを買うしかないよ。
ドライバでどうこうできる話ではない
>>267 リアルテクです。3COMも使ってますが、スイッチと相性が悪いな感じで
無反応になってしまう(壊れているのかもしれない)こともありますで
リアルテクでペルフォマンスがよくならないかなと想いました
ちなみに特許って具体的にはどんな特許ですか?
>>268 そもそもパケットモニタリングするのにスイッチングハブを使ってる時点でアウト
リピータハブ(ダムハプ)を使わないと他ホストの通信は傍受できないよ
結論
・RealtekのNICは捨てて、Intelか3Comを使え
・スイッチングハブではなく、リピータハブを使え
全然デバドラと関係ないや スレ違いどころか板違い?
>>267 >promiscuousモードだと全パケットをホストPCに転送するから
違うよ。promiscuousモードって言うのは、リンク層で受信したデータが
自ホストの物理アドレスでなくても受信すること。
>>270が正しい事を言っている。
272 :
login:Penguin:03/07/14 02:37 ID:imGWjqw6
age
>>271 すまん 267=270 なのだが 何か矛盾したこと言ったかな?
MAC層(データリンク層)の処理はNICチップで行われる。
ホストPCはMAC層の処理にはまったく関与しない。
MAC層の処理後、必要なデータだけPCIバスを介してホストPCにDMA転送する。
つまり、通常モードだと自ホスト宛かブロードキャストのパケットデータだけを
ホストPCに転送すればいいのに対し、promiscuousモードだとすべての
パケットデータを転送しなくてはならず、転送量が膨大になる。
そのため、バッファがあふれる(=データを取りこぼす)ことになりやすい。
274 :
268:03/07/15 03:30 ID:Yac3cQfq
スイッチはL3スイッチでポトミラリング機能がありますよ
ただ3COMのNICでも限界があるとですがぎりぎりまでぺケットの
モニタ用に最適化したいと思いましたです
リアルテクの話は忘れてください ふつはバッファも通信用に
チュニングすれて確保してると思ったけどぺケットをモニタするときは
受け取るだけだから ドライバで受信用のバッファを多めに
できたらいいなと思ったよ でもどうやったらいいか分らないよ
ヘルプしてください
275 :
山崎 渉:03/07/15 11:17 ID:2JhhXBQM
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
276 :
login:Penguin:03/07/15 12:07 ID:Fo16Kpwc
(・∀・)renice!
277 :
login:Penguin:03/07/22 11:30 ID:6WQ9WMDa
(・∀・)renice!
278 :
login:Penguin:03/07/25 12:52 ID:NH3LXVfX
(・∀・)renice!
279 :
login:Penguin:03/07/30 12:07 ID:cPdgkLk2
(・∀・)renice!
∧_∧ ∧_∧
ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。
=〔~∪ ̄ ̄ ̄∪ ̄ ̄〕
= ◎――――――◎ 山崎渉&ぼるじょあ
281 :
login:Penguin:03/08/02 10:27 ID:2rmp9gin
(・∀・)renice!
282 :
login:Penguin:03/08/08 11:54 ID:mg5o8ebS
(・∀・)renice!
283 :
login:Penguin:03/08/13 12:30 ID:pfCYHBFY
(・∀・)renice!
$> cd /pub
$> more beer
$> man woman
$> Segmentaion fault (core dumped)
286 :
山崎 渉:03/08/15 22:51 ID:dil3w4kp
(⌒V⌒)
│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
287 :
login:Penguin:03/08/15 23:47 ID:GfNK1qbf
(・∀・)renice!
288 :
login:Penguin:03/08/16 15:04 ID:rNtMNMvg
(・∀・)renice!
289 :
login:Penguin:03/08/25 09:46 ID:+hXUD3jL
(・∀・)renice!
290 :
login:Penguin:03/09/02 21:16 ID:1mo12GKS
insmod xxx.oってことはドライバのソースはどんなに大きくてもxxx.cの1っこだけじゃないとだめなの?
>>1は、ママンでもファックしてろや!hahahahahahaaaaaaaaaaaaaa!
>>290 完全なるカーネルモジュールにヘッダやリンカはいらない。
ソースは常にひとつ。
>>290 Cファイルをインクルードすればいいだろ。
だいぶ下がってますが、
2.6 と 2.4 のドライバ記述って何か変りました?
2.6 まだインストしてないので報告キボンヌ・・・
2.2 -> 2.4 程は変ってないのかなー?
297 :
login:Penguin:04/01/16 18:02 ID:ZUOtu/O9
PCIのデバイスドライバを作成していますが、
全くできません。
less /proc/iomemで書かれているアドレスで
read、write関数を使って書いたり、読んだりしてもだめです。
何がいけないんでしょうか?
とりあえず、lspci -vvv を晒してみたらどうでしょう。
もちろんデバイス指定でね。
それを見て私が答えられるかどうかはまた別の話ですけど。
299 :
login:Penguin:04/01/16 19:52 ID:ZUOtu/O9
lspci -vvvで次のような表示になりました。
00:11.0 Class ff00: Altera Corporation: Unknown device 1998 (rev 07)
Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-
Status: Cap- 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR-
Interrupt: pin A routed to IRQ 16
Region 0: Memory at dffe0000 (32-bit, non-prefetchable) [size=64K]
300 :
298:04/01/16 20:57 ID:JS8EwlnL
FPGAですね。
私もそんなに知っているわけではないので、
あまりあてにはしないで欲しいのですけれど…
lspciの結果は特に変なところは無いと思います。
Class ff00はどのクラスにも属さないと言うことだと思うのでちょっと気にはなりますが、
読み書きぐらいはできるでしょうね、きっと。
だとすると、あとはドライバのソースでチョンボがあるか
FPGAの中で書きこみ禁止になっているとかですかね。
FPGAにどんなipが載っているのか分からないので、あくまで推測ですけど。
あんまり力になれなくてごめんね。
>>298 read/writeのかわりに
ioremap_nocache()で対象アドレスのページを取得して、
ポインタで直接参照してみたら?
よみたい物理アドレスが
(unsigned int) p_adr
だとしたら
unsigned char p_read(unsigned int p_adr){
unsigned int v_page,v_offset;
unsigned char ret;
v_offset=p_adr&0x0fff;
v_page=ioremap_nocache(p_adr&0xfffff000, 0x1000);
ret=*((unsigned char *)(v_page + v_offset));
iounmap(v_page);
return (ret);
}
適当だけどこんな感じで。ページサイズが4K決め打ちだけど。
302 :
login:Penguin:04/01/18 02:28 ID:+zT3hNOG
PCIバスアナライザで観測しながらアクセスしてみそ
>>303 持っているならいい方法だけどね。
買おうとすると激しく高い。
レンタルでも中古でも激しく高い。
でも、欲しいね。
305 :
login:Penguin:04/01/28 10:42 ID:N5b+GE5n
マジレスすれば
ロジアナでPCIバスを観測するか、PCIバスアナライザを使うか
どっちかしないと、PCIデバイス/ドライバの開発は無理だろう
んなこたーない!
297 が FPGA開発を同時にやってるならまだしも・・・
あったほうが楽なのは確かだが、無理ではない。
ハード屋さんはバスレベルで確認して提出するはず。
read/write 出来ないのはドライバの不具合。
>>297 は pci_find_device 関数など、基本から勉強したほうがよさそう。
307 :
305:04/01/28 15:27 ID:N5b+GE5n
無理ではないって言っても、そんなマゾプレイみたいなコトしたくないよ
目隠しして半田付けしろっていうのに近いな
PCIのロジックって複雑だから、実機でバグが露呈するのはよくあること
430FXで動いたからって 875Pでは動かないとか余裕であるよ
市場に流通してるチップセットすべてで確認しないと市販は無理
名の通った枯れてるチップならまだしも、実機の動作チェックもしてない
FPGAの回路をつかったPCIカードなら、最初から疑ってかからなきゃダメだと思います
> ハード屋さんはバスレベルで確認して提出するはず。
PCIバスの全パターンをシミュレーションできる検証ツールってすごく高いよ
特にFPGAの開発のために検証環境買うのはコストにあわない
PCIバスアナライザがある環境で実機試験して、少しずつ直すほうが早くて安い
>>307 そーゆーのはハード屋さんの仕事じゃないかと。
PCIブリッジの違いで動かないなんてのは設定云々じゃない限りドライバじゃ直せん。
> そーゆーのはハード屋さんの仕事じゃないかと。
おれもそう思う。
でも、実際はソフト組み込んだらなんかおかしくて、
実は結局、微妙にハードが悪かったなんて事は良くある話だね。
きっと
>>305 は苦い思いをしたんだろうよ。
>実は結局、微妙にハードが悪かったなんて事は良くある話だね。
ハード絡みやってりゃ必ずあるね。
慣れてくればハード、ソフトどっちが悪いか何となくわかるようになるけど。
制御チップ動かす時なんかはオシロ、ロジアナの出番が増える。
さすがに PCI制御用FPGAまで計測器突っ込んだ亊はないけどね・・・
そこまで行くと スレ違いですね >> 307
311 :
307:04/01/30 07:19 ID:tIkj6Ynv
私はPWBAからASIC/FPGA デバイスドライバ アプリ まで全部自分で開発する
ある意味何でも屋です
FPGAの検証を実機でやるときにデバイスドライバを作ってるはずだから
バスレベルで動作検証済なら、そのとき使ったドライバをハード屋さんから
もらってくればいいんだと思います
もちろんLinuxじゃない別のOSで検証してる場合もあるだろうけど
今の時代はLinuxでやってるケースがほとんどではないかなぁ
Linuxは
1. ソースが公開されてて、ドキュメントも多くドライバ書くのが楽
2. CDからブートしてRAMDISKだけで動くシステムを簡単に作れる
等の利点があって、特に2が重要
PCIバスのハードのデバッグだとしばしばフリーズするので
正しくshutdownしないままリセットすることが頻発する。
winだろうがlinuxだろうがHDDにOSが入ってるシステムだと、
リセット連発していると、次の起動時に時間がかかるし
そのうちHDDの内容が不整合を起こしてくる。
1CD ramdiskオンリー システムだと、気軽にリセットできて楽なんだ。
まぁlinuxじゃなくてFreeBSDでもいいんだけど。
私は5〜6年くらい前はFreeBSD(2.x/3.xの時代)でPCIカードのハードのデバグ
やってたけど、今世紀に入ってからLinux(2.2の頃から)でやるようになった。
時代の流れで、商品としてlinuxへの対応が必要ってことになったので
最初からlinux用のドライバ書いておけば後が楽になるからね。
スレ違いだったかな
駄文失礼
>駄文失礼
気にしなくていいぜ。(w
313 :
login:Penguin:04/02/09 07:11 ID:7h6uvjnn
すいません、どうしようもない質問なんですが、
実験的にカーネルパニックを発生させるドライバを作るのには
どうすればよいでしょうか?
カーネル関数panic()を使っても
ハングするだけでパニックしないんです。。。
どうか教えてください。
このスレは俺に勇気をくれた。
>>313 コンソールに"Kernel panic: …"って出てないの?
317 :
login:Penguin:04/02/10 21:13 ID:WwFCucZO
>>315−316
返信ありがとうございます!
単純にパニックするよりoops画面が表示するようにしたいのです。
mmapあたりをいじくるドライバを作れば、
oops画面を表示させることは可能ですか?
>>317 試してないけど、
*(unsigned long)0 = 0;
とか。
319 :
login:Penguin:04/02/11 00:21 ID:QfDGoor4
>>318 似たようなので、
x=0;
x=x/x;
ってのをやってみたのですがダメですた。
やっぱLinuxって頑強だと思いますた。
mmapも見てみたらカーネル空間でなく補助記憶空間に
マップするだけのようですし・・・
アドレス例外でoopsできるような方法とかあるのですかね??
Oopsとpanicを混同しているような気がしないでもない。
321 :
login:Penguin:04/02/12 00:21 ID:9Bh5Rhh+
>>320 すみません。。。
パニックとシステムフォルト(oops)と勘違いしていたようです。。。
ドライバからシステムフォルト(oops)
させるような方法ってあるのでしょうか?
linuxはsolarisみたいにクラッシュダンプ取れますか??
Linuxでのデバイス・ノード管理は現在
従来の/dev以下のデバイス・ノードファイル、devfs、udevが
存在しているようですが、デバイスドライバを書くような
デバドラ開発者にはこの状態は影響するのでしょうか?
325 :
login:Penguin:04/02/19 10:34 ID:iwEBqmwA
私は従来の/dev以下のデバイス・ノードファイルを使ってます
devfsに対応するのも簡単だけど優先度低いから先送り
modpostについて詳しく解説している文書をご存知でしたら教えて下さい。
データシートをどうやって手に入れるか
それが問題だ
何のデータシート?
329 :
login:Penguin:04/04/08 16:25 ID:E32BiKCa
mmapについて質問させてください。
メモリデバイスをmmapするとき、ページサイズを4096Byteとした場合、
mmapされたデバイスの先頭からの"物理アドレス"と
mmapしたプロセスのデバイスに割り当てられた"仮想アドレス"の
下位12bit(2^12 = 4096)は一致するのでしょうか?
mmapではプロセスの仮想空間にページサイズ単位で
ファイルやデバイスを割り当てることが出来るわけですよね。
ページサイズが関係してくると言うことはMMUのようなものが
作用して、この割り当てを管理しているのですよね。
(あるいはMMUそのものなんですか?そこが分かってないのですが)
もしも、MMUの管理下にあるならば、実空間と仮想空間のアドレスの
下位12bitは一致するはずです。
MMUはページサイズ以下のアドレスを知らないはずですから。
ここまでは私の理解に間違えはないですよね。
でも、mmapが実際にどんな風に動いているか良く分からないので、
上のような疑問が沸いてしまったのです。
どなたかお分かりいになる方がいましたら教えてください。
331 :
login:Penguin:04/04/09 00:53 ID:E9wQ2At3
いいなこのスレ
あぁソース嫁ってことかw
>>329 CPU/MMUアーキテクチャに依存する話だね。
IA32に限っていえばその理解でいいと思うよ。
他archでもまずそうなってるだろう。
そうなってないMMUなんて見たことない。
2次キャッシュを UBS mem に格納して使いたし。可能?
>>335 CPUの2次キャッシュをUSBメモリにやらせるってこと?
337 :
login:Penguin:04/04/10 01:41 ID:04yJkWho
AGE
338 :
login:Penguin:04/04/13 23:49 ID:bzoEXS/o
USBのデバイスドライバ作る時のTIPSを教えてください
デバイスを破壊出来るデバイスドライバーの作り方教えてください
>>339 1.どこからかゴルフのドライバーを手に入れる。
2.ドライバーのフェイスにデバイスを貼り付ける(ガムテープでも可)
しかる後にドライバーを振りかぶり、路面、ブロック塀etc.にぶつけること。
>>340 ( ´д)ヒソ(´д`)ヒソ(д` )
>>340 ( ´д)チョメ(´д`)チョメ(д` )
v2.6.x 用の module (.ko) の作り方ってどっかに落ちてませんか?
v2.4.x だと gcc -c するだけで insmod できるイメージができましたが、
v2.6.x だとなんか後工程があるんですよね?
344 :
login:Penguin:04/04/27 21:18 ID:VEIU93yI
>>339 FDDにアクセスして、その音で音楽を鳴らす。
CDDのトレイを頻繁に出し入れする。
ってトレイは入れられたっけ?
>>344 出し入れ可能だけど、作り方は教えられないのでは?
もう既に完成してしまっているし ソース嫁としか言えないと思う
>>344 CDDのトレイを開け閉めする位ならioctlで……
347 :
login:Penguin:04/05/05 09:59 ID:IcDQ6/Fz
v2.4でUSBキーボードドライバにRAWレベルアクセスする方法知りませんか?
usb/usbkbd.cを単品でモジュール化してみたけど、プログラムからのアクセス
方法がわからない・・・
usb_register時にマイナーバージョンの情報を登録してないみたいだけど
デバイスファイルでアクセスしようと思うと無理なのかな〜・・・
348 :
login:Penguin:04/07/17 17:55 ID:z93SFsgN
落ちそう・・・見込みなさそうだけど上げ
349 :
login:Penguin:04/07/18 17:33 ID:qhsm/Ia2
350 :
login:Penguin:04/07/27 03:02 ID:AwmCdxXP
Moz2chで見てると
レスがだんだん右にずれていくます。
351 :
login:Penguin:04/07/27 03:08 ID:AwmCdxXP
USBに2台のWebカメラをつなげてまちゅが
May 30 08:31:05 localhost kernel: usb-uhci.c: interrupt,status 3, frame# 1728
しばらく動いた後に/var/log/messageに出力されてカメラがハングしてちまいます。
USBのデバイスドライバは何を言ったのでしょうか?おちえてください。
>>351 要はエラーが起きたのですね。それ以上あまり解析のタシにはなりません。
status 3 ってのは、割り込みが起きて、IOC と Error が立っていたんです。
# IOCの方は、割り込みを発生する機能なので、エラーじゃないですが。
353 :
login:Penguin:04/08/02 14:39 ID:QD1yhPkc
チップセットのドライバって具体的にはどんなことやってるの?
354 :
login:Penguin:04/08/02 16:42 ID:4u8OC/CN
すごく恥かしいあんなことやこんなこと
355 :
login:Penguin:04/08/02 17:48 ID:Wbtl3uph
突然ですが、デバドラのioctlからpollやselectって呼べるかどなたか知ってますか?
pollやselectの引数の構造体に何を入れていいのかわかりません。
>>356 ioctlのハンドラからsys_selectとか呼びたいって事ですか?
呼べないことはないと思うけど…
なんでそんな変な事をする必要があるのか興味がありますな。
引数は普通にselectに食わせているものを同じように渡せば良いはず。
>>357 3つのCPUおよびOSがある組込み系のデバドラを考えてます。
普通はioctlやselectをモジュール側に個別に書くのでしょうが、
それだとダメみたいです。デバドラ側で一括して処理を行うようにしないといけません。
ioctlをモジュール側から呼びだして、デバイス側ではそのioctl処理からpoll(割り込み処理)を
考えてます。なぜioctlかと言うと、ユーザデータをデバドラに渡したい(アドレスのチェック)からです。
>>358 >ioctlをモジュール側から呼びだして、デバイス側ではそのioctl処理からpoll(割り込み処理)を考えてます。
ちょっと待てよ、そこで言ってるモジュール側とデバイス側の区別がわからないのだが?
一般に、デバドラ内部からシステムコールやライブラリ関数は呼べないよ。
書いてあることだけじゃいまいち要領を得ないが、taskletなりtask_queueなりを
自分で管理して、カーネルのスケジューラに登録するのが常套手段だ。
カーネルスケジューラはは2.2系 2.4系 2.6系で大きく異なるから
各バージョンすべてで動作する共通コードを書くのは結構大変
泣ける マジで
>>359 モジュール側とはライブラリのソースで、デバイス側とはデバイスドライバのソースです。
表現が下手ですね。文章もあまりうまくないのでごめんなさい。
ライブラリ側では、whileループでバッファの中身をチェックしています。
バッファが空になるまで、プロセスを眠らすことがそもそもの目的です。
>>360 ありがとうございます。げえ、かなり大変そうですね。。。かなり萎えてきました。
今いろいろいじくり回してて、デバドラのioctlのfile構造体のメンバf_opを、
poll(select)の関数を指すようにしてやっています。
そのために、ioctlとは別のfile_operation構造体をつくってそこでpollを宣言しました。
>>356 の言う「モジュール」=「ライブラリのソース」は「ユーザランドの
アプリケーションが使うライブラリ」かな?
はい。そうです。
わかりにくくてすいません。
>>362 なんか、あさっての方向に走ってないか?
- poll() したいなら poll() を実装する
- イベント待ちをしたいread()だろうがioctl()だろうがかまわず待て
やりたいことを確認したほうがいいぞ。
- なにをどう待ちたい?
- 付加的にやりたいことは何?
後者は、
> なぜioctlかと言うと、ユーザデータをデバドラに渡したい(アドレスのチェック)からです。
がわからんかったって話。
あうあ
- - イベント待ちをしたいread()だろうがioctl()だろうがかまわず待て
+ - イベント待ちをしたいなら、read()だろうがioctl()だろうがかまわず待て
大丈夫か!?
>>364よ!!
がんばれよ! 見守ってるからさ!
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をロードしてもうんともすんとも言いません
.netとかjavaみたいなバイトコードなドライバーでハードウェア
を制御する環境を作るって可能ですか?
>>369 まあそうでしょうな。
lsusbはハード的につながっていれば見えるし。
>>370 そりゃ作れん事は無いが…
速度が厳しくないかい?
>>371 JITなりリコンパイラーなり方法はあるだろうし、全てのドライバーが
速度を必要とするわけじゃないと考えたわけで。部分的にでも・・・と
何にしてもバイナリの非互換性がどうにかならんかなぁと。
カーネル毎にコンパイルはダリ
>>370 Kernelから呼び出すような仕組みにしても、
Javaで言うnativeなのが無いと駄目じゃない?
レジスタとかメモリ領域さわれないし。
結局そこ(nativeなモジュール)で非互換性が出る気がする。
>>373 そのへんはバイトコードインタプリタで抽象化すればいいのではないかと。
PCIあたりならかなりの所まで出来そうな気がするなあ。
そういやOpenFirmwareなんてのがあったのう…あれはForthだっけ?
成るほど・・・
>>373 やっぱりそういうところで不備が出てきますか。。。言語拡張で・・・となると
Javaじゃなくなるし、コンパイラーも自前に用意しなきゃならなくなるし。。。
>>374 漏れもそんな感じの考えでいたんだけど、やっぱそれが難しいんでしょうね。
とはいえ、可能性があることはわかりました。ありがとうございます。
>>OpenFirmware
調べてみましたが上の考えのBIOS版みたいなもんでしょうか?
とりあえず、神が現れることを祈りつつ作れる作れない、作る作らないは別として
自分でも調べてみようと思います。厨の妄想に付き合っていただきありがとうございました。
カーネルのバージョンによってカーネルが持つ構造体が微妙に違うことがよくある。
(メンパが増えてるとか)
現状のinsmodによるデバイスドライバのダイナミックリンクは
その手の構造体の違いを解決してくれないので、原則的に
カーネルバージョンに依存したドライバしかリンクできない。
強制的に違うバージョンのドライバをinsmodすることも可能だが
正常に動く保証はない。たまたま動くことはあるけれども。
まあソース見て「あーこれなら動くな」と思ったら
迷わず-f
ドライバのソースがあるならリビルドする方がいいような気がするのう。
いっぱいコンパイラに怒られたりすると直す気が失せるが…
>>376 なるほど。JAVA云々無しにしてもやっぱカーネルとは別離すべきなのかも。
いや、マイクロ・モノリシックの話じゃなくて仕様的なものを。moduleの管理も
こんなんでいいの?って気もするし。Xもドライバー持ってるってのがよくわから
んし(嫌味とかじゃなくて本当にわからんのです。)
って偉そうな事言っててもしょうがないな・・・たまにはソースぐらい読もう・・・
>>636 > 昨日Linuxにふれたものですから
であり、(非常に一般的なやりかたにもかかわらず)やりかたがわからないとい
う人が tamagoをいれたい理由はなにかしら?
特に強い理由がないなら、「いれるな」が正しいガイドだと思うのですよ。
>>635 つかいかたは man xmodmap でみるといい。
キーコードは xev で調べられます。使いかたは man xev でみるといい。
Xサーバはroot権限のユーザランドプロセスで /dev/ioとか /dev/memに
直接アクセスしてビデオチップを制御する。
Xのドライバといわゆるデバイスドライバとは動作メカニズムがまったく違う。
ユーザ空間からmmapでマッピングしてデバイスいじくるときって、
アプリがマッピング先のメモリに書き込む動作と同時に
デバイスにデータって書きこまれるんでしょうか?
バッファリングみたいのって気にしなくてもいいの?
>>382 デバイスをmmapしてアクセスするときは、単にMMUがそこを指しているだけで、
ディスク上のファイルをmmapしたときのようなバッファリングはありませんよ。
類似のがある場合はあって、それはキャッシュなのです。
/dev/fb* は通常キャッシュが抑止されています。
/dev/mem は O_SYNCでopenしてやるとキャッシュを抑止します。
PCIデバイスの場合 各共有メモリ空間ごとにprefetchableビットが定義されている
ほとんどのPCIカードはprefetchableがdisableになっておりキャッシュ無効になってる
>>383 >>384 CPUキャッシュですか。
環境にもよるのでしょうけど、基本的にはあまり気にしなくてもいいのですね。
実は、drivers/char/mem.c みたんですけど、mmap システムコールを呼んだときと、
そこにアクセスした時のコードの流れがよくわからないのでちょっと???でした。
あとは、コンパイラのオプティマイズも気にしておいたほうがいいのでしょうね。
>>385 CPUキャッシュはユーザー空間から叩く手段がないので、
カーネルとハードウエア側の制御にお任せするしかないです。
最適化の方はvolatile付けておけば大丈夫でしょう。
なにもしないと最近のコンパイラは賢すぎてとんでもないことをやってくれますからな。
>>385 キャッシュは気にしてください。キャッシュがあると
. 書き込みがキャッシュが溢れるまでなされない。
. 読みだしも同様。
. 同一ラインにのる近隣のレジスタがいっしょにアクセスされちゃう
という、デバイスの制御にとっては致命的なことがいろいろ。
すみません。
キャッシュを気にししなくてもよいと書いたのは、
キャッシュが働かないので、気にしなくても良いという意味で
書いていました。
387さんのおっしゃるとおり、デバイスアクセスでキャッシュが
働いてしまうと、ひどい目にあいますね。
ところで、mmapのキャッシュ無効化ってmem.cの
noncached_address を修正すれば有効無効をユーザで
任意に操作可能になるんですかね?
ハードやBIOSでキャッシュ関係の細工が何かあったりしたらだめなのかもしれませんが。
>>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使わずに、ちゃんと専用ドライバ使わないとだめなの?
デバイスドライバはカーネルメモリを消費するらしいのですが、
現在のカーネルメモリーの残量を知るにはどうしたらよいですか?
393 :
391:04/11/21 17:37:11 ID:RzBM8DsM
>390 /usr/include/usb.h
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:04/12/12 18:22:17 ID:fch5Qtg6
あ、マシンは i686です。
たしか-fno-strict-aliasingだったかな。それつけれ。
より詳細が知りたいときはググれ。
397 :
394: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すればいいのでしょうか。
>>398 kmalloc() or vmalloc()
401 :
login:Penguin:04/12/14 15:55:34 ID:ScDxM3L+
【序 論】
オウム事件とは、「オウム、創価、統一が共同でやっていた覚醒剤密造などの不法行為がばれそうになり、全ての罪をオウムに押付けた。」事件であると理解しています。
統一教会は、その起源から考えて、KCIA及びCIAの影響下にあると考えるべきです。
日本側のCIA専属のお爺さんたち、つまり、笹川さん、児玉さん、中曽根さんたちが、統一とつるんでいたのも、CIAの犬同士という絆があったわけです。
一方で、創価は創価で、笹川一派を通じて、統一と繋がりがありますし、それ以前に創価内部に深く入り込んでいる暴力団、
後藤組のもつ北朝鮮コネクションから、オウムの麻薬ビジネスに関わっていたわけです。
もちろん、日本社会に創価マフィアのネットワークをはりめぐらした学会を、CIAが放っておくわけがなく、マネーロンダリングなどに、しっかり利用されています。
宗教法人の財務の閉鎖性をCIAが利用しないと考える方が異常です。
そして、CIAお得意の麻薬ビジネスの日本支部が、オウムだったわけで、その収益が北朝鮮に還元されていたのも当然のことであり、
北の現体制を維持するための、CIAの有難い配慮だったわけです。
なにしろ北の体制が崩壊すると、一番困るのは、CIAのスポンサーである軍産複合体と国際金融資本であり、極東の緊張は、彼らの飯の種なわけですから。
麻薬王にして、CIAの帝王である大ブッシュさんが、統一の文と仲良しなのも、アッタリマエなわけですね。
今度の米大統領選でも、随分と統一のカネが小ブッシュ陣営に流れたようですね。
尚、本件の主たる議論は、2チャンネル、警察板の「告発します 第3部」スレッドにて、進めています。
http://mentai.2ch.net/test/read.cgi?bbs=police&key=985780338&ls=100
国際金融資本と無関係な人はいません。ここが大事なところです。
国際金融資本とダーティーな勢力になんらかの関係があるというのなら、
全ての人間がダーティーな勢力と関係があるということです。
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>
デバイスドライバーをイジルとハードが壊れます
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 値を変更するためには、何か工夫が必要なのでしょう
か?
>>406 jiffesの値が飛ぶせいじゃないの?
初期値をいじる方がいいと思うが。
やっぱりそれしか方法ないでしょうかね。カーネルコンパイルが億劫で
まだ試していませんでした。
例えば、jiffies += 8640000; だとそれほど時間はかからないのですが、
jiffies += 8640000; にすると、より多くの時間がかかるようです。仮
想マシン環境で実験しているのですが、その間、仮想マシンのプロセス
の CPU 使用率は高いままでした。
ん? 何書いてたんだ、俺
>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幅でデバイスにアクセスが行くとは限らないのでしょうか?
なにか考慮が不足してるのでしょうか。
>>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 で作成したシステムでないと無理なのでしょうか。
>>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:05/02/12 01:24:29 ID:QcR6E3eX
早速、間違えてました(w
>ところどころ言ってるかもしれませんけどね・・・
ところどころ * うそ * 言ってるかもしれませんけどね・・・
415 :
410:05/02/16 00:46:02 ID:E/KjMwKc
いろいろ情報ありがとうございます。
もともとドライバ経由でアクセスしていたのですが、
パフォーマンス的な問題でmmapでを使用したかったという経緯があります。
ですが、mmapだとどうもうまくいかなくて試行錯誤していた次第です。
ですので、単純にmmapでの処理の問題かと思っていました。
時間はあるので、勉強も兼ねてもうちょっと情報収集をしたいと思います。
416 :
login:Penguin:05/02/16 22:28:50 ID:mypLuczy
現在、デバイスドライバ作成(とりあえずキャラクタ型)の勉強しているのですが、
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: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: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
結果じゃなくてソースだそうよ
421 :
417:05/02/20 21:48:59 ID:0sjUjbHi
>>420 Please wait for a moment...
422 :
417: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: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: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:05/02/20 22:11:43 ID:0sjUjbHi
以上で全部です。
>>417 コピペしたら動いたぞ。 2.6.10 でだけど・・・
カキコしたソースで動かしてみそ。
427 :
417:05/02/21 00:06:03 ID:bwxnTums
>>426 マジ?しかも、2.6?
このソースでコンパイル通った?
そして実行結果キボンヌ
>>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:05/02/21 00:37:25 ID:bwxnTums
>>428 Thanks!
こちらもたった今2.6で動作確認したところです。
う〜む、何故2.4ではエラーなんだろ。
もうちょっと自分で調べてみます。
テストしてくれてありがとう
>>426 &
>>428
何気に良スレ
みんな頑張れ
お気に入りに追加しますた。
ドライバのread、write関数でminor番号取得する方法ってないんですか?
2.6用に、LIRCの仮想ドライバで、デバイスファイル2つ作って、
片方にキーコード書き込んだらLIRCに送られるやつ書いてるんだけど。
まあ、LIRC側はIOCTLとreadだけだし、キーコード送るほうはwriteだけだから今のとこ何とかなってるんだけど、気持ち悪いし。
private_data を使う、かな?
>>432 サンクス!
open時に file->private_data にポインタ突っ込んでおくってことですね。
取得することばかり調べてて、あらかじめ持たせておくことを考えてませんでした。
修行が足りぬ…orz
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:2005/04/16(土) 08:17:16 ID:R/hasO1P
自己レスです.
解決法を見付けたので,書き込みます.
drivers/usb/input/hid-core.c 内の,hid_blacklist 構造体に,
joypad のベンダIDとプロダクトIDを加えることで,解決しそうです.
スレ汚し失礼しました.
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
カーネル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'
となります。実機が側にないので出力メッセージは大体こんな感じということで。
よろしくお願いします。
>>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'になってしまいます。
ドライバ間の依存関係をどこかで明示する必要があるのでしょうか?
普通はそんなことはできないんじゃない?
誰かができると言ったのかな?
デバイスファイル開いてioctlをコールが普通じゃねぇの?
>>444 chapter1まで読んだ。
Policy-free driversの意味がまったく分からない。
うえーん
the role of a device driver is providing mechanism, not policy.
これが、policy-free
ここでの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 のドライバのプログラミングの
良い入門書があったらおしえてください
>>448 Kernel2.4.27のソースしか見てないので違ったら失礼。
>マイナー番号を100 120 140 160としました。
これがよくわからん。デフォでは192から16個を順番に割り当てるようになってるが、それをわざわざいじったってことか?
そうなると、スケルトンをあちこち変更してあるのだろうから、さすがにソース無いとなんも判らん。
451 :
login:Penguin:2005/06/29(水) 22:32:06 ID:rSbPN/4/
>>449 アレ買え。馬の絵の描いてあるヤツ。
高くても我慢しろ。読めば安いと思うようになる。
絶対買え。とにかく買え。12冊買え。たくさん買え。
12冊=たくさん
納得した
なぜ12冊なのかちっとも納得いかないんだが
たくさんだからだろう
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絡みでデッドロックがかーねるにあって動かなかったし、どうなってるんだろうヽ(`ー´)ノ
しかもライセンスがプロプラなのでどーすりゃいいのか頭が痛いです。
2.4はcc -o hoge.o -c hoge.cするだけでokだったけど
2.6はmakeファイルを書かないとダメになった。
はぁ、マンドクセ
obj-m := unko.o
の1行でよくね?
459 :
login:Penguin:2005/07/24(日) 15:33:14 ID:02p0TYUx
USBのドライバ書いたことアルヤツいる?
>>459 2.4.0testカーネルの時やってたなぁ
ストレージ関係がクラスドライバでないときは動かすのに苦労したよ
USB Snoopyで解析したりして
カーネル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 はコンソールに *必ず* 出力するわけではない」
のでしょうか?どうなのでしょう?
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 出力されるときと出力されないときがあるんですよ。
でも、起動のたびにログレベルが変更されるというのは考えにくいし…
flushされていない or
同じメッセージなので纏められているのでは?(この場合、last message repeated xxx times とでる。)
>>466 ログファイルに吐かれていればメッセージレベル。
出てなかったら改行だろう。
>>467 コンソールに出る方はまとめてくれない。
469 :
462: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: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プログラミングなんてまだまだ....。
お馬さんの本、大学の図書館にありましたねー、ぱらっと見たけどさっぱり......。
デバドラ本第3版の和訳もう出てるのね。
洋書を見つけてレジに持っていこうとするも、ふと横を見ると書棚にありました
SMPな環境で、あるAという区間とBという区間があるとき
そこを走行するCPUをひとつだけにして、
かつAとBを同時に走らないようにしたい。
最速で処理できる区間ではspin_lock_irqsaveを使ってもいいけど
ちょっと時間を食いたい処理のときには割り禁にしたくない/出来ない。
こういうときってセマフォを使うんだっけ?
あと、誰かがそこを走行してたら、待たずにあきらめる処理も
どうやるのかいまいちわからんです。
っ[MUTEX]
futex
478 :
login:Penguin:2005/10/24(月) 21:00:03 ID:qab5z916
insmod hello.o
が出来ません....
bash: insmod: command not found
と出てしょっぱなから弾かれました....。
FC4を入れているのですが、ぐぐったところKernelのバージョンが
上ってからサポートされなくなった(?)のようなことがかいてありましたが...
ちょっとわからないです..。
>>478 module-init-toolsが入っていない。
なんて事はまずありえないので、パス通っていないだけだろう。
っ[/sbin/insmod]
$ su -
passwd:
#
モジュールに挑戦する前にやるべきことがあるだろう。
みなさん、返事が遅れてすみません....。
何日ものぞいていませんでした。
どうやら、おっしゃる通りパスが通っていないようでして、
あれから、/sbin/insmod [filename]
を試してみましたがなんだか、だめだ!のようなメッセージが表示されて
しまい、無理でした。Linuxのデバイスドライバのプログラミングは
BIOSレベルでのデバイスドライバを書くときの参考にもなるかと
思ったのですが、やっぱりLinuxを初めてあまりたっていないのに
背伸びをしすぎたようです。出直してきます。
御回答いただいた方々、ほんとうにありがとうございました。:-)
│
│
J
∩_∩ ∩_∩
( ・(ェ)・) (・(ェ)・ )
エサクマか? 違うクマよ、
あわてて食いつくと面倒なことになるクマ。
>>483 いえいえ是非また来て下さいね><
御町して檻ます><
486 :
483 :2005/10/30(日) 22:20:06 ID:kv9dDPbi
やっとできました!
>>167さんのレスのようにお馬さん初版第二章の一番最初のなーんにもしない
モジュールのソースに追加することでロードすることができました。
試しにカーネルソースのmodule.hを見てみるとメッセージでライセンスが無いといわれた経緯から
MODULE_LICENSE (license)の定義をみつけ、それをキーワードにぐぐったらこれを追加するような
記述をみつけることができました。
カーネルバージョンが2.4.1以降からこうなったようなことがinsmodのmanページにあったので一気に解決しました。
たぶん、insmodが認識されなかったのはKterm上からやろうとしたからですね....
嬉しい!
>>486 よくやった!
とりあえず、今の状態を登山に例えるなら
登山用品店の自動ドアが開いたあたりだな。
2.4から2.6へポーティングしててkoができるまで行きました。
chrdevなんですけどudevの仲間に入る方法がわかりません。
2.4のころのように直接的にmknodしてinsmodするものなのでしょうか。
489 :
login:Penguin:2005/11/24(木) 19:13:51 ID:tUhrvxEF
ageようよ。
質問なのですが、回路の方は勉強しておられますでしょうか?
ちょっと質問させて下さい。
ノートパソコンを使っているんですが、マイクとスピーカーの位置が近いのでサウンドドライバの
読み込み時からサウンドミキサーが起動して音量設定するまでの間にハウリングしたりするんです。
そこで、サウンドドライバ読み込み時にマイクをミュートにしたいと考えたのですが、
例えばドライバの中にマイクの初期音量を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変換ケーブルは認識できてると思います。
で、早速プログラム組んでスイッチャに信号を送ってみたんですが、
これがうんともスンとも言わなくて。
もしかして変換ケーブルだけ認識しててスイッチャは認識していないかも
って考えたのですが、シリアル通信だから信号を送るだけなら送れますよね?
/dev/ttyUSBの読み書き許可がなかったよ
>>495 ボーレートとかあってますよね?
sttyとか使って動作中のUSBシリアルの各設定を
観察・設定してみるといいかもしれません
498 :
login:Penguin:2005/12/17(土) 23:06:34 ID:oosooT9i
>>496,497
助言ありがとうございます。
パーミッションに関してはchmod 666を実行したので、大丈夫だと思います。
ボーレート他の初期設定は、少し自信がないのですが、他のシリアル通信
のプログラムを参考にして一通りプログラム内で設定しています。
sttyで確認するというのは知らなかったので、早速やってみたいと思います。
ありがとうございます。
馬本買った記念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
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て実装メ
モリ量も気にしなければいけないんでしょうか?
馬本見てもそんな事書いてないし。たんにハードウェアの
アドレス範囲を宣言するだけと認識してるんですけど。
何方かご存知の方居られたらご教授願います。
適当に書いてみる。
他のドライバ見たらわかるけど、実装メモリは気にしない。
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
また別の人が適当に書いてみる。
hugemem使ってみては?
hugememってi386じゃなかったっけ?
x86_64で4G載ってるって事は、IOMMUとか関係あるのかな。
結局virt_to_bus(pci-nommu.c)かvirt_to_phys(pci-gart.c)呼んでるから、
scatterlistのpageが期待しない値なんでしょうけど、そこら辺調べたらいいのかな。
ドライバいじったことはあるけど、書いたこと無いので適当です。
似たようなドライバの中身を調べてみればすぐわかりそうなものだが
>>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とか見ると定義されてるんですよね。
なんかその辺も絡んでるのかなと気にはなってはいました。
皆さんアドバイスありがとうです。
もう少しカーネルソース見て来ます。
気になるから、どうなったか知りたいです。
>>504 sched_setaffinity(2)
>>513 まだ色々と追っかけてる途中です。
とりあえずPCIドライバ周りから追っかけ中です。
PCIドライバを見た限りでは、pci_map_sgすると中でdma_map_sg
呼び出しててその中見てもあんまり大したことしてなさそうですね。
やはりbio周りも見ないと駄目なのかも。
もうちとかかりそうですが、わかり次第、結果をお知らせします。
516 :
505: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
色々アドバイスありがとうございました。
>>516 解決おめでとうございます。
一般的に使えそうなものならまたどこかで公開してくださいな。
>>516 よかったよかった。
私もソース読んで少し勉強になったよ。
ネットワーク系しかいじったこと無かったから。
519 :
505:2006/04/10(月) 23:00:56 ID:9eFrvNz6
>>517 >>518 ありがとうございます。
馬鹿高な価格の独自のカード用のドライバで有用性はかな
り低いです。。。一応GPLなんですが、カード買わないと非
公開という阿保な方針らしいので、一般公開は難しそうです。
Linuxでの初開発で手探り状態でしたが、お蔭様で何とか目
処が立ってきた感じです。まだ細かな問題がありますが…。
Linuxでの開発はカーネルや他のドライバソース読まなけば
資料が少ない所がキツイですね。
まぁコード上のテクニックとか色々勉強になる部分は多いけ
ど、納期のある仕事でやるのは大変ですね。
流石UNIX板だけあって、建設的なスレで助かりました。
>>519 > Linuxでの開発はカーネルや他のドライバソース読まなけば
> 資料が少ない所がキツイですね。
ちょっと教えてください。
Linuxより資料が多いOSってなんのことを指してますか?
自分は主にLinuxの開発に携わってますが、いつもオープンソースのありがたみを
感じながらやっているので、Linuxが資料が少ない、というのは意外です。
OSによっては中身がさっぱりわからないままドライバ開発しなきゃいけない事もあるしな。
つーか、そっちのほうが多そう。
>>520 NetBSDはそういう部分のmanpageが充実してるとか聞きますな。
linuxはmanpage書き上げたら実装が別物になってたなんて笑えん状況がありそうだなあ…
そこでmain treeにマージですよ。
main tree内の変更はたいていは面倒をみてくれる。
524 :
login:Penguin:2006/05/11(木) 18:07:51 ID:PmwpTb/Y
ある内蔵デバイスのドライバでPCの機種毎に処理を変えなければいけない部分が
あり、ユーザ負担を減らすためにドライバ側で自動判別したいと思っています。
機種は違うのにSubvendorIDやSubdeviceIDまで何故か一致しているので、SMBIOS
のDMI情報を参照して機種を判別したいのですが、これって可能なんでしょうか?
そんなやり方は行儀が悪いとか、他にもっとまともなやり方があるとか何でも
構いませんので、どうかご教示をよろしくお願いします。m(__)m
確かに行儀はよくないかも
新しいハードが出るたびにパッチ提供とか考えたら面倒だし
たとえそれが自社ハードだとしてもバージョンアップあるだろうし
判別はユーザランドで行う方が気分も楽だし処理も楽だしバグも少ない
527 :
login:Penguin:2006/08/20(日) 01:06:14 ID:BobpEKad
カーネル層のモジュールのテストプログラム
を作ってるんですが、カーネル層でinit_moduleや
ioctlからスレッドを起こして daemonのように
動作させることってできるんでしょうか?
Linuxデバイスドライバを読んでもスレッドを
起こすような処理は載っていないようなので
参考書籍だけでも教えていただけるとありがたいです。
>>527 kernel_thread
daemonize
というか、普通に載ってるよね
530 :
login:Penguin:2006/08/24(木) 12:55:11 ID:6WITQjoc
そいや、最近のノートPCには指紋センサーがあるけど
あれはハックできるものなの?
>>529 すみません。ページご存知でしたら教えてください。
第3版持ってます。
すみません、どなたかわかる方教えてください。
現在、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が現れる不思議な絵。
■ ■
■ ■ (その仕組みがリンク先に書いてある)
■ ■
■ ■ この原理を応用すると、まったく新しい
■ ■ コピペが作れる予感。
■■■■■■■■■■■■■■■■
>>534 グラフィックチップのモード設定を間違えている予感
すみません どなたか助けて下さる方はいらっしゃらないでしょうか?
当方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です。
どなたかお知りの方いらっしゃったら お願いします。
>>537 見ているものがまったく違っているような気がしますが。
PCIでbus master転送したいんじゃないの?
539 :
537:2006/12/15(金) 15:20:46 ID:NJleqqJR
おお、早速のレスありがとうございます。
DMA転送するにはチップセットの中の8237DMAコントローラをいじればいいって思ってました。バスマスタについて少し調べましたが、IDEのDMAもバスマスタになるんですね、知りませんでした。
となるとこのバスマスタはどうやればいいのでしょうか?参考になるものでもいいので、教えてください、お願いします。
ターゲットとなるPCIデバイスの仕様がわからなきゃデバイスドライバは書けないよ
せめて型番だけでも出してくれ
ドライバというか、モジュールの話なんですけど
スレッドを使ったせい?なのか、psすると
3635 pts/0 R 0:00 modprobe hoge
と残るんですが、これは出ないようには出来ないものなんでしょうか?
勿論 rmmod hoge すると消えるんですけど。
542 :
537:2006/12/17(日) 19:34:20 ID:BtOAund7
ターゲットのデバイスは内製のボードなのですよ orz
となると やっぱボード自体を作った人に聞いたほうがいいのかな?
チップのレジスタ仕様と、制御のシーケンスがわからないとドライバは書けないよ。
チップも内製なのか?
だったらデバイスドライバもチップ開発チームが書くものだよな
少なくともサンプルコードの類は書くはずだ
そうでなくて市販のチップを使ってPWBAだけ内製したのなら
使用したチップのデータシートなりプログラマーズガイドなりを読めばいいだけの話
546 :
537:2006/12/18(月) 01:17:23 ID:5wopQO2S
ほぼ内製だったと思います。
ちょっと月曜日会社いったら、聞いてみようと思います。
大変参考になりました、ありがとうございました。
ところで、これは単なる質問ですが、
マザボのチップセットにある8237とかの
DMAコントローラは古いし遅いみたいだから
PCIとかIDEとかに使われてないみたいだけど、
Pen3 800MHzとかでも PIOのが早いの?
最近のデバイスで言うDMAはバスマスタDMAのことだよ。
バスマスタってのはデバイス側が主導権とってバスを制御して
CPUの頭越しにメインメモリにデータ出し入れすることだ。
そのためにはデバイスにバスをのっとってデータ転送しろって命令を
CPUからデバイスに発行する必要がある。
その手続きを知るためにレジスタなりデータシートなりを調べろって
みなさん言ってるんだよ。
548 :
537:2006/12/19(火) 00:01:59 ID:2Sv0wv+g
なるほろ、大変勉強になりました。
ハード屋さんからマニュアルゲットして
がんばってみます。
549 :
login:Penguin:2006/12/19(火) 23:53:27 ID:g20RCuxU
すみません ドライバでDMA転送するための連続したメモリ領域(64MB)を確保したいのです。
kmallocで確保可能な連続したDMA領域は最大128kB ということはネットで検索すると出て来たのですが、
どうすればドライバのDMA転送で利用可能な128kBを超えるの連続領域を確保出来るでしょうか?
OSはlinuxカーネル2.6です。
ご存じの方おられましたら御教示戴きたくよろしくお願い致します。
>>550 とりあえずそのふざけた石を投げ捨てれ。
やるならalloc_pagesだろうなあ。そのサイズで連続領域を簡単に確保できるとは思えんが。
ついでに書いておくと128KByte制限は8237の呪いなのでPCIならそんなものはない。
投げ捨てぇー…れないorz
>>551 早速ありがとうございます。
検索してても思ったのですが、
なんか連続領域"64MB"っていうのは常識外れっぽいのですね…
とはいえ組込み系で使った独自ロケットI/OのPC向け転用の必要があり、
石を投げ捨てる訳にもいかず今回の質問とあいなりました。
alloc_pages、試してみます!!
回答感謝いたします。
センキュー!!!!
かなり強引だけど、カーネルオプションで使用メモリ量に制限かけといて、
未使用領域を作った上でそこ使っちゃえば?
>>553 MMUの面倒は誰が見るですか?
面倒な世の中になったのう…
物理アドレスで完結してりゃなにも考えなくていいのに。
>>553 アドバイスありがとうございます。
ちょっと恐いですが、検討してみます。
>>554 MMU…よく判ってません…勉強してきます。
ご指摘ありがとうございます。
いろいろレスありがとうございました。
スレの皆様が良い年越しを迎えられますように!!
それでは、また来年!!
RocketIOってことはXilinxのFPGAだよな
だったら128KBのブロックのアドレスポインタリストを渡すと
自動的にリスト通りブロックをたどって転送するように
FPGA回路を再設計するのがまっとうな手段だろうな
デバイスドライバやOS設定の変更ではどうにもならんと思う
カーネル組込みで、ドライバ初期化のときなら確保できそうな気もするな。
開放したら二度と確保できなくなりそうだが。
明けましておめでとうございます。
さらにレス&アドバイスありがとうございます。
うー勉強不足。知らないこと多過ぎますね!ハードル高いです orz
安定化まで考えると更にハードル上がりそうですが、ハード側とも相談してみます。
それでは本年もよろしくお願いいたします!!
皆様に聞きたいのですが
当方Linux 2.6カーネルの元でドライバの開発を行っています。
起動してからinsmodでインサートするタイプのモジュールを作っています。
カーネルをフリーズさせたりして固まらせてしまって、やむなくリセットボタンを
押す事が多々あるのですが、その際にファイルシステムのチェックが
強制的に行われてしまい、これでかなりの時間をロスしてしまいます。
何とかこのファイルチェックを飛ばして時間の短縮を行う方法はないでしょうか?
VMwareとかの仮想マシンを使えばいいのかもしれませんが、
特殊命令を使っておりますので、仮想マシンがその命令をサポートしていないために
導入できません。
>>559 mount -o remount,ro /
とかやって、書き込み不可にしてから遊べばよくね?
/etc/fstabの6番目のフィールドの値を0にする。man fstabしてみそ。
tune2fsで-c 0とかもしておいたほうがいいかも。
>>560 でもそれをやると、kmallocをGFP_KERNELで使ったときに
メモリがスワップアウトしたらまずいことになりませんか?
>>561 やってみました
なんかファイルチェックをしなくなったことで壊れそうでもありますが
やっぱり我慢してチェックしたほうがいいでしょうか...
>>563 ああそうか、swapファイルはswapパーティションですもんね
ありがとうございます
評価機はネットブートさせてNFSroot稼動させればいつ飛んでも
大丈夫な環境にできるんじゃない?
566 :
login:Penguin:2007/02/05(月) 06:03:38 ID:9i1Bwf6u
通常、Linuxのドライバをインストールする時はカーネルにパッチを当ててカーネルごと
コンパイルしなければいけないけど、Windowsのようにカーネルソース無しでドライバを
コンパイルしてインストールできるようにする方法ってあるの?
567 :
login:Penguin:2007/02/05(月) 06:26:04 ID:9i1Bwf6u
>>566 いまはそんなことしなくていいよ
insmod rmmodで動的にドライバを挿入したり削除したりできる
いやぁソースはいるだろ。
ソースはいるけどカーネルのリビルドはいらない
いやぁリビルドは途中までいるだろ。
572 :
login:Penguin:2007/02/10(土) 16:03:43 ID:XWBlzb1u
Makefileに
obj-m += module.o
って書いて
make -C /usr/src/linux M=$PWD modules
575 :
login:Penguin:2007/02/10(土) 19:18:09 ID:XWBlzb1u
>>543 そうみたいですね
私のみた資料では、そうコンパイルする様に書いてあったのですが結構古い奴だった
のでしょうか
>>574 本当にありがとうございました。
その方法で無事にモジュールを作れました
感謝感謝
576 :
542:2007/02/10(土) 19:55:09 ID:XWBlzb1u
.koってファイルが出てきたらからinsmodにかけてみたら
insmod: error inserting 'module.ko': -1 Invalid module format
って言われワラタ
turbo linuxなんて微妙なの使ってるせいなんですかねこれは.....
577 :
542:2007/02/10(土) 20:03:22 ID:XWBlzb1u
今までsage忘れてたごめん
話題提供時はage、その後はsage
ってのが一番角が立たない。
正直、どうでもいいけど。
/usr/src/linux が今動いてるカーネルソースじゃないとか
580 :
542:2007/02/10(土) 21:33:23 ID:XWBlzb1u
>>579 そうですね
元からあったソースでコンパイルしようとすると必要なMakefileがないとかで無理
でしたから、kernel.orgから同じバージョンのコード落してきてまた設定しなし
いた訳ですがそれが原因ですかね。
ディストリとかは独自の変更を加えているらしいし、また変更が加えられていない
純粋なカーネルインストールしてから出直してきます
581 :
login:Penguin:2007/02/18(日) 23:17:11 ID:PxJoV1oA
すみません。kmallocで確保したメモリ領域をDMA転送するために、__paで変換して
渡してやるのと、dma_map_singleで変換して渡すのと、違いはあるのでしょうか?
たとえば性能(処理効率)が違うとか? どう使い分けているのでしょうか?
UNIXTIMEを日付文字列に変換するのに なんかAPI用意されてないの?
"2007/02/19 12:34:56" とかその程度のでいいんだけど。
strftime
>>583 いや、デバイスドライバ内でなんだけど、あったっけ? いや、ない。
585 :
login:Penguin:2007/02/21(水) 07:53:48 ID:Wuryqsb6
Linux 2.6.16用のパッチとe2comprを同時に使いたいのだが、e2comprは2.6.10用まで
しかない。カーネルとドライバが完全に分離され、カーネルバージョンが上がっても
カーネル側の旧インターフェースが温存されるようになれば、ドライバの開発が停滞しても
最新のカーネルでそのドライバを使い続ける事ができる。
そのカーネル側のABI決めようぜ話はLinusに一蹴されてるんじゃなかったけ?
587 :
login:Penguin:2007/02/22(木) 09:14:42 ID:y9d4aAAQ
>>586 カーネル側のドライバとして旧バージョンのカーネルのモジュールをロードできる
ラッパーを作成して、カーネル側インターフェースが変更されるたびにラッパーを
更新していく手もあるべ。
588 :
login:Penguin:2007/02/22(木) 09:16:48 ID:y9d4aAAQ
ラッパーにx86エミュレーションを追加するとザウルスでWindowsのドライバを読み込めたりもする。
つ NDISwrapper
つcapative ntfs
591 :
login:Penguin:2007/04/03(火) 00:09:41 ID:3ycIJVku
<linux/module.h>が無いんだけど、
デバドラ開発するには、なにかパッケージ追加しなきゃいけないの?
使ってるのはfedora6
592 :
login:Penguin:2007/04/03(火) 00:24:35 ID:3ycIJVku
yum install kernel-devel
してもダメだな。何が足りない?
594 :
login:Penguin:2007/04/03(火) 01:00:14 ID:3ycIJVku
>>593 あ、カーネルソースに有った。ありがとう。
普通、/usr/includeには入らないの?
595 :
login:Penguin:2007/04/03(火) 01:08:21 ID:3ycIJVku
あと、
man printk
って出ないの?
>>594 カーネル用ヘッダと、ユーザプログラム用ヘッダは
まざるとまずいから分離されてる。だから/usr/includeにカーネル用ヘッダはふつうは無い。
/usr/include/linux に入ってないか?鳥にもよるけど。
599 :
login:Penguin:2007/04/04(水) 00:15:23 ID:wyW6RdvI
カーネル用ヘッダと、ユーザプログラム用ヘッダがまざると、何でとまずいだろ。
600 :
login:Penguin:2007/04/04(水) 00:23:08 ID:ICf0Aql0
爆発しても知りません。
>>598,
>>599 /usr/include/linuxにあるのは確かにカーネルのヘッダだが、glibcをビルドするときに使った
アーキテクチャ依存部分とかのカーネルヘッダ、
/usr/src/linux/includeにあるのは「現在使用中のカーネル」のヘッダファイル
だよね。(間違ってたらスマソ)
これらが同じだとちょっとカーネルに変更があったときとかまずくない?
最悪glibc動かなくなるときもあるかと。
602 :
login:Penguin:2007/04/08(日) 00:07:55 ID:gmHS+Fdj
>>17 をコンパイルするとエラーがたくさん出るんだけど何が悪いの??
エラーの一部
↓
/usr/src/kernels/2.6.20-1.2933.fc6-i586/include/asm/bitops.h:244: error: expected ‘=’, ‘,’’, ‘asm’ or ‘__attribute__’ before ‘int’
from /usr/src/kernels/2.6.20-1.2933.fc6-i586/include/linux/thread_info.h:
20,
from /usr/src/kernels/2.6.20-1.2933.fc6-i586/include/linux/preempt.h:9,
from /usr/src/kernels/2.6.20-1.2933.fc6-i586/include/linux/spinlock.h:49,
from /usr/src/kernels/2.6.20-1.2933.fc6-i586/include/linux/module.h:9,
脳?
604 :
login:Penguin:2007/04/08(日) 00:10:46 ID:gmHS+Fdj
>>603 いや、たぶん違うと思う。
こんなのも出てる。
↓
/usr/src/kernels/2.6.20-1.2933.fc6-i586/include/asm/system.h:346: error: expected declarat
ion specifiers or ‘...’ before ‘u8’
/usr/src/kernels/2.6.20-1.2933.fc6-i586/include/asm/system.h:346: error: expected declarat
ion specifiers or ‘...’ before ‘u8’
じゃ、頭?
606 :
login:Penguin:2007/04/08(日) 00:12:08 ID:gmHS+Fdj
NGID ID:2aPQfsMY
マジレスすると、読み込むヘッダーファイルが足りないんだよ。
608 :
602:2007/04/08(日) 00:19:06 ID:gmHS+Fdj
環境はVMWare上でfedora 6を動かしてる。
こんなのも。
↓
/usr/src/kernels/2.6.20-1.2933.fc6-i586/include/linux/bitmap.h:149: error: ‘BITS_PER_LONG’
undeclared (first use in this function)
BITS_PER_LONGを定義しているファイルをさがすことだね。
なんだこのキチガイ
また、きちがいあつかいですか?
ほう「また」なんだ
で?
あらら
なにがあららなの?
脳?
それはお互い様だろ?
俺はその質問者じゃないんだけどねえ
お友達?
620 :
602:2007/04/08(日) 00:58:54 ID:gmHS+Fdj
もういちど、しきりなおし。
>>17 をコンパイルするとエラーがたくさん出るんだけど何が悪いの??
エラーの一部
↓
/usr/src/kernels/2.6.20-1.2933.fc6-i586/include/asm/bitops.h:244: error: expected ‘=’, ‘,’’, ‘asm’ or ‘__attribute__’ before ‘int’
from /usr/src/kernels/2.6.20-1.2933.fc6-i586/include/linux/thread_info.h:
20,
from /usr/src/kernels/2.6.20-1.2933.fc6-i586/include/linux/preempt.h:9,
from /usr/src/kernels/2.6.20-1.2933.fc6-i586/include/linux/spinlock.h:49,
from /usr/src/kernels/2.6.20-1.2933.fc6-i586/include/linux/module.h:9,
2.6以降はモジュールのフォーマットが変わって、
.oじゃなくて.koになってるからね。
ビルドの仕方も面倒になって...俺もよくしらない。
linux/compiler.hかな?
624 :
login:Penguin:2007/04/08(日) 02:07:26 ID:gmHS+Fdj
>>621-622 情報が古いのか。。
でも、ウェブにあるサンプルは大体同じような感じなんだけど。
2.6用モジュールhello worldってないのかな。
>>624 2.6 kernel hello world
でぐぐればすぐ出てくるぞ。
626 :
login:Penguin:2007/04/08(日) 02:28:17 ID:gmHS+Fdj
>>625 なかなか無いよ。たとえばどこ?
すぐ出てきたなら、ここに貼って。
#include <linux/init.h>
がいるみたいね
628 :
login:Penguin:2007/04/08(日) 02:41:10 ID:gmHS+Fdj
630 :
login:Penguin:2007/04/12(木) 01:42:14 ID:MCdnGupN
aio_write()でユーザ空間の登録だけして、後からハードウェア割り込みでその登録したユーザ空間にアクセスすることってできる?
やり方教えて。
632 :
login:Penguin:2007/04/15(日) 01:56:51 ID:YIKahQqf
タスクレットの中でcopy_to_user()、copy_from_user()を使えますか?
試してみろ!!
callした瞬間ぼくの丸太のような足蹴りが君の股間をつぶす
それでもいいのなら!
634 :
login:Penguin:2007/04/27(金) 00:53:37 ID:6m6QKylD
プログラムで確保したメモリの物理アドレスを知る方法と、その物理アドレスを使ってメモリにアクセスする方法を教えて。
637 :
login:Penguin:2007/04/27(金) 08:23:06 ID:6m6QKylD
ユーザプログラムで確保したメモリの物理アドレスを知る方法と、その物理アドレスを使ってメモリにアクセスする方法を教えて。
638 :
login:Penguin:2007/04/27(金) 08:26:29 ID:6m6QKylD
(1)ユーザプログラムで確保したメモリの物理アドレスを知る方法と、
(2)その物理アドレスにアクセスする方法を教えて。
>>634-635 そこの記述では不十分だよ。
>>638 つ 馬本
なんで物理アドレスが必要なのかよくわからんが、virt_to_pyhsかのう。
640 :
login:Penguin:2007/04/27(金) 21:21:47 ID:6NURgk06
>>639 virt_to_phys()で本当にユーザプログラムで確保したメモリの物理アドレスが求められる?
質問はカーネルの仮想アドレスを物理アドレスに変換したいのではないよ。
ユーザプログラムで確保したメモリのアドレスの物理アドレスだよ。
あと
>>638の(2)については、知ってる人いないの?
痛い人現る
cr3レジスタからたどれば
643 :
login:Penguin:2007/04/27(金) 23:27:03 ID:6NURgk06
>>642 で、そのcr3レジスタの値はどこから持ってくるの?
cr3レジスタの値はあくまでも現在のプロセスの仮想アドレスのページテーブルだよね。
カーネルプロセスからユーザプログラムのページテーブルを取得するにはどうするの?
mm_structを保存しておけば、任意のユーザプロセスのメモリ空間にアクセスできる?
カーネル書き直せば?w
645 :
login:Penguin:2007/04/28(土) 07:44:33 ID:oKLKreO7
カーネルを書きなおしてもいいよ。どこをどうすればいいの?その方法を教えて。
(1)カーネルから任意のユーザプログラムで確保したメモリの物理アドレスを知る方法と、
(2)その物理アドレスにアクセスする方法を教えて。
カーネルからだとページテーブルがページアウトしている可能性もあるから
めんどくさい
647 :
login:Penguin:2007/04/28(土) 08:04:23 ID:oKLKreO7
ページアウトはしていないと仮定していいよ。それなら簡単?
ザワザワ…
ザワザワ…
馬の多さにワロタ
651 :
login:Penguin:2007/05/03(木) 23:34:15 ID:ErpReMz0
カーネルのソースツリーの一部分だけ、お試しでコンパイル
したいときってどのようにすればいいですか?
たとえば、lib/ の下だけすこしいじって、syntaxのチェック
だけしたいときとか。2.6.21です。
>>651 なんだかんだいっても、一度全体コンパイルしておくのが一番早い。
653 :
login:Penguin:2007/05/04(金) 00:18:46 ID:yYLKnQ2E
>>652 thx.でも、
一度全体をコンパイルしておいて、lib/以下をちょっと(.cのみ)いじって、
全体をmake bzImageすると、それだけで5分以上かかるんすよ...
わたしのへぼマシンだと。
やっぱりCPU速くするのが一番
そこをなんとか。
>>653 2.6だったらトップディレクトリから
$ make lib/cmdline.o
CC lib/cmdline.o
とか出来る。
できました。ありがとうございました。
>>576 カーネルをコンパイルしたgccでモジュールをコンパイルしないとinsmod時にそのエラーが出るよ。
質問です。
>>620さんと同じ状況です。
ただ
>>628>>629の方法を試したのですが
解決しませんでした。
いまだに
>>620さんが書かれてるエラーがでてしまいます。
考えられる原因はありますでしょうか?
ubuntu 7.04、gcc version 4.1.2 (Ubuntu 4.1.2-0ubuntu4)
を使っています。
>>15 IPLで使いたい分のメモリを確保すればいいって聞いたことがある。
カーネルのブートパラメータでから使いたい分を引く感じ。
>>660 それで短くなるの? ならないと思うけど。
>>661 あれ?なんかぜんぜん違う話へのレスになってる…。
スマソ、なんか誤爆っぽい…orz
663 :
login:Penguin:2007/06/03(日) 15:06:38 ID:W8zh9WHI
ドライバ内での double 型の使用について質問があります.
Kernel 2.6 のドライバ内で double の演算と,sprintf("%.2f", ...) の様な
関数を使うのはどうすればいいのでしょうか?
現在,下記のようなエラーが出ていてドライバをロードできないです.
% make
...(snip)
WARNING: "__adddf3" [hoge.ko] undefined!
WARNING: "__muldf3" [hoge.ko] undefined!
WARNING: "__floatsidf" [hoge.ko] undefined!
% insmod hoge,ko
insmod: error inserting 'hoge.ko': -1 Unknown symbol in module
>>663 ドライバで浮動小数点の計算はしない方がいいと思う。
proc_fs で表示するために使いたいのですが,駄目なんでしょうか...?
浮動小数点演算はFPUを使う可能性があるから
カーネルモードでは可能な限り避けるべき
きちんと対応すれば使えないことはないけど、
速度的な利点はほとんどなくなる
「速度的な利点」って何に対する何の利点?
きっと
>>666 の CPU は浮動小数点演算を使うと割り込み禁止になるんだろう
nVidiaのドライバの解析って3年ぐらいまでやってる人間
いたけど今どうなってるの?
!(-_Φ+){ ... }
671 :
663:2007/06/05(火) 02:17:22 ID:aHzmfEHS
>>665 固定小数点じゃだめか?
値が必ず正値と仮定、valに本当の値の100倍を入れるとすると
unsigned int val;
sprintf(str, "%d.%02d", val/100, val%100)
みたいな感じ
負値だと剰余の扱いがちょっと面倒になる
673 :
login:Penguin:2007/07/16(月) 18:26:19 ID:h1/eDBu5
はck
674 :
login:Penguin:2007/08/06(月) 00:29:52 ID:E6mK6Nbx
ドライバ書くときってCPUの事は知っておいた方がいいのでしょうか?
どうでもいいよ
タマゴがどっち向きかだけ知っとけば
676 :
login:Penguin:2007/08/28(火) 23:24:19 ID:aUO2fWSH
あげ
>>675 俺はとんがったほうから食べるのが好きだ。
どちらから割るのが正しいかが問題だ。大きいほうか、尖った方か。
16bit時代以降、中には大きい方から割って、尖った方から食べるという
両刀使いが出てきてさらにややこしくなった。
そんな両刀使いがいたのか
具体的にはドレ?
NUXIとかmixed endianでggr。1234じゃなくて2143並びになったりするらしい。
実は漏れも知らなかったが、最近でも某腕プロセッサはデータ型によってはまさにミックスになるそうな。
まあそうはいっても日常的にミックスは体験してるよな
通信プロトコルは大体ビッグだからな
682 :
login:Penguin:2007/08/31(金) 07:07:24 ID:IHXG9RG5
uartのドライバ書きたいのだけど、uart_opsのメンバのそれぞれの責務がよく分からない。
文字列送って受けるだけなのに、なぜこんなにいっぱいあるんでしょう?
軽くおしえてもらえないでしょうか?
include/linux/serial_core.h
/*
* This structure describes all the operations that can be
* done on the physical hardware.
*/
struct uart_ops {
unsigned int (*tx_empty)(struct uart_port *);
void (*set_mctrl)(struct uart_port *, unsigned int mctrl);
unsigned int (*get_mctrl)(struct uart_port *);
void (*stop_tx)(struct uart_port *);
void (*start_tx)(struct uart_port *);
void (*send_xchar)(struct uart_port *, char ch);
void (*stop_rx)(struct uart_port *);
void (*enable_ms)(struct uart_port *);
void (*break_ctl)(struct uart_port *, int ctl);
int (*startup)(struct uart_port *);
void (*shutdown)(struct uart_port *);
void (*set_termios)(struct uart_port *, struct ktermios *new,
struct ktermios *old);
void (*pm)(struct uart_port *, unsigned int state,
unsigned int oldstate);
int (*set_wake)(struct uart_port *, unsigned int state);
>>682 シリアル通信の基本を誰かに教えてもらったら...
>>682 ドライバを組むのなら、ターゲットの仕様をきちんとおさえるのが基本。
uart程度の解説なら本屋にいくらでもあるし、ググればいくらでも情報
が手に入る。
その程度の情報収集ができないなら、ドライバ開発は諦めたほうが良い。
685 :
login:Penguin:2007/09/12(水) 11:40:08 ID:W+jFMZNC
初歩的な質問で、すみません
linuxカーネルは2.6.18-1.2798.fc6-i586で、fedora core6のカーネルを使っています
USBマウスが差し込まれたときに、呼ばれるprobeのコールバックと、外されたときに呼ぶdisconnect
のコールバックを書いたのですが、なぜかvenderIDと、productIDに間違いはないはずなのに
これらが呼ばれません
USBドライバの登録には成功しているようなのですが、登録に使う構造体の初期化に間違いがあったのでしょうか
それとも、このドライバ以外のUSBマウスドライバがあると、駄目なのでしょうか
文字数制限の問題で、ソースは
>>686に貼らせていただきます
686 :
685:2007/09/12(水) 11:47:03 ID:W+jFMZNC
>>685 ハードウエアを接続したとき、dmesgにはなんて出てくる?
688 :
685:2007/09/12(水) 13:23:18 ID:W+jFMZNC
>>687 dmesgは、このように出力しています
usbcore: registered new driver usb_mouse
succes_usbregist<6>usb 4-2: new low speed USB device using ohci_hcd and address 6
usb 4-2: configuration #1 chosen from 1 choice
input: Cypress Sem PS2/USB Browser Combo Mouse as /class/input/input6
input: USB HID v1.00 Mouse [Cypress Sem PS2/USB Browser Combo Mouse] on usb-0000:00:0b.1-2
usb_device_id の .driver_info だけ定義するとすべてのデバイスにマッチするらしい(馬本参照)ので
デバッグ用にやってみるのがいいかも
> このドライバ以外のUSBマウスドライバがあると、駄目なのでしょうか
たぶんそう
691 :
login:Penguin:2007/09/13(木) 12:25:45 ID:oMFp/NB1
ドライバの開発って難しいでしょうか?
そのような質問をする方には難しいです。
>>685 むかしは定義に合致するドライバが呼ばれたが最近は1つ合致するやつが
あると、それ以上呼ばないようになってたと思う
HIDドライバが先にとっちゃうんでしょう。.configで無効にしてやってみそ
694 :
login:Penguin:2007/10/03(水) 08:13:37 ID:WhUHfKUP
あげ
696 :
login:Penguin:2007/10/08(月) 12:39:42 ID:v1nGyoTL
馬本でデバドラを勉強しています。
カーネルのソースでドライバやったことがない人にも分かりやすいソースってどれですかね?
そんな事言ってる位なら、馬本のドライバソース見ればいいじゃん。ダウンロードできるよ
>>696 何系のドライバかによるのでは>どれを見たらいいか。
ドライバの種類によってどういうインタフェースセット(いわゆる*_opsとか)を
register_*とかで登録するのか、またインタフェース間やカーネル側処理がキュー等を
介してどのように連携するのか全く異なる。
漏れも読みたて入門者なんであれだけど、
キャラクタデバイスなら/dev/null(mem.c)とパラレルポート(ppdev.c + parport/*)
ブロックデバイスならフロッピー(floppy.c)かramdisk(rd.c)
ファイルシステムならromfs(romfs/*, readonly-fs)とbfs(bfs/*, readwrite-fs)
が短かったり馴染みがあったりしてすんなり読めた。
699 :
696:2007/10/09(火) 12:16:03 ID:BjHL69v3
複数のデバイス間でデータをバイパス
したいのですがサンプルないですか?
いくらなんでも漠然としすぎだろw
2ポートとか4ポート付きのNICって
モジュールはどのようにロードされるの?
またデータの共有とかRx,Txバッファの
管理とかどうなってるの?
1ポートのNICが複数枚ある場合と大差はない。
704 :
login:Penguin:2007/10/21(日) 17:41:17 ID:yGaxVLsH
>>701 各ポートにデバイス eth0, eth1 ... と付いて、このデバイスファイルごとに
設定が管理されるだけじゃね?
>>704 pciのデバイスとしては1つにしか見えないんだけどさ
どうやって、その後4ポート認識してるかわからないんだよね
>>705 それはPCIブリッジが載ってるからじゃね?
LANチップはその向こうのローカルバスに4ケ載ってるかと。
707 :
login:Penguin:2007/10/23(火) 20:59:15 ID:pGCXISsZ
どなたかおしえてください。カーネルモジュールにバイナリコードを渡したい
のでrequest_firmware()を呼び出しているのですが、このrequest_firmware()
という関数から呼び出されるhotplugはどのディレクトリでバイナリコードを
検索してくれるのかわかりません。言ってみればバイナリコードをどのディレクトリ
におけばいいかがわかりません。ディストリビューションはfc6でカーネルは2.6.22です。
カーネルモジュールに対応するデバイスは無いので、sysfs上に仮想的なバスと
デバイス、ドライバを作ってあります。このデバイスのdevice構造体を使って
request_firmwareを呼んでいます。申し訳ありませんが、かなりまいってるので
お願いします。ご助力ください。
>>707 Documentation/firmware_class/*
?
BUFFALOのCD-RWドライブがまだ使えるのでハックしたいんですが、
必要な情報ってメーカーから提供されているんでしょうか?
ハゲシク板違い
お馬さんの本読んで勉強してるのだが、さっぱり分からん。
ちなみに今3章のscullデバイス。
みんな最初はこんなもんなの?
それとも、俺がバカなだけなのか?諦めたほうがいいのか?
意見求む!!
やる気の問題じゃね?
>>711 「作ってみなきゃわかんない」 の典型かもしれん。
実際作業するとキャラクタデバイスは楽しい。
そして、ブロックデバイスに挑戦するときに
分けわかんなさをもう一度楽しめる
よくわかんないのが、他のドライバの叩き方なんだよな。
ネットワーク通信してファイルとかブロックデバイスにも書くような
ドライバが最終ゴールなんだけど、他のドライバのAPIってどうやって
叩くのか(どこがインタフェース界面なのか)と。
OSの勉強やり直しっぽい
716 :
login:Penguin:2007/10/27(土) 19:45:56 ID:5LV4rb/o
>>714 それってkernelspaceじゃなくてuserspaceでやればいいのでは。
>>716 使う側からはファイルシステムに見せたいので、実際プロトタイプは
FUSE方式でやろうとしてます。でもそれだと簡単ではあるものの
二級市民みたいなので、kernelspaceでの正しいやり方を知りたいなと。
nfsとかcryptfsのコードを読むは読むにしても、どっかにそういう
各種ドライバを内部から使うための情報をとりまとめたものとかは
ないのかなと。
719 :
711:2007/10/28(日) 02:49:08 ID:W9zUZBn1
>>712 鋭いな。そうかもしんない。
>>713 なるほど、これは貴重な意見が聞けた。サンスコ!!
>>717 ntfs-3g なんかはfuseだけど、実用的に動いているし、全然2級って感じしないけど。
721 :
login:Penguin:2007/10/28(日) 23:36:04 ID:jy3FHf6c
馬本にOSの仕組みを知ってる必要があると書いてありましたが、
どんなことを知っていたほうがいいのでしょうか?
メモリ管理・特権・スケジューリング・ファイルシステム(ry…全部じゃん
723 :
login:Penguin:2007/10/28(日) 23:45:24 ID:jy3FHf6c
>>722 ありがとうございます。
詳解Linuxカーネルも読みます。
>>723 知りたくなったときに読めばいいよ
でも必ず買っとけ
買うなら原書(英語版)のほうがいいぜ
版が新しいし安いからな
> 版が新しいし
4th edition でたの?
konozama.comとか少しは自分で調べようよ
Oh〜、チョッとお聞きしただけで損何怒らなくても
いいじゃないですかぁ〜。Hey,take it easy !
でも調べるところは教えてくれるアナタに感謝で〜す!
729 :
login:Penguin:2007/11/08(木) 00:29:00 ID:Cm3oK6QC
メーカーとかが作ったデバドラのソースって公開してるものはあるのでしょうか?
ネットワークデバイス系はそういうのが結構多いような。
超いい加減だけど:
つ $ grep -r 'Inc[.o]' drivers | egrep -v '(Red|Vista|Foundation)'
731 :
login:Penguin:2007/11/12(月) 11:19:56 ID:vNQ95D4g
kernel2.6.18.6でターゲット側のUSBドライバ書こうとしてるんですが
参考になるサンプルってありますでしょうか?
drivers/usb/gadget/net2280.cとかが近いのかも知れないですけど
どうもpciで登録してるように見えて「別物かなぁ?」と思いまして。
あとホスト側のUSBドライバで挿されたら何でも拾う設定って
usb_device_idの.device_infoに適当な値を突っ込めばいいと思って
たんですがどうにもattachの際に自作のprobeが呼ばれません。
成功した方っていらっしゃいます?
ご存知の方いらっしゃればお願いします。
>>731 おめー御馬様のサンプル
見てていってるんだよね?
もしそうなら、適正無いから諦めろ
見てないなら、お前は調査能力ない
からニートかなんかになれ
>>732 よく判ってらっしゃる。
馬本はさらっと読みましたが元がLinuxでも組み込みでもない世界で
やってて、急遽ヘルプで入ったんでさっぱり。
前任が逃げてヘルプなんで誰も知ってる人がいない\(^o^)/
で、聞いてみたんですが俺も逃げっかな・・・
>>733 一週間悩んだら解かんないか?
すげー複雑な科学計算とか遺伝子関係の
プログラミング以外ほとんどの対象のプログラミング
なんて簡単だぞ
時間がかかるものが多いのは事実だが
ドライバは簡単な部類だ
>>734 まだ2日程度なんですよね。
「デバドラ」だと思ったんで聞いてみたんですがレベル設定あるみたいなんで
「くだらねぇ」でも行ってきます(´・ω・`)
御馬様っていうのか・・・
昨日、買いました。勉強します〜
>>734 ちなみに、回答しない人の言うことは無視したほうがいいよ。
>>732はニートとか言ってるし典型的な煽り。
738 :
735:2007/11/14(水) 00:27:19 ID:2+ZY8Hov
馬本見たら「本書の範囲を超えるので載せません」て書かれてた(´・ω・`)
USB gadgetは難しいだろうかnet2280.cよりもZero.c見たほうがいいのかなぁ・・・。
文句とか愚痴だけいって何も貢献しない人間ほどむかつく奴はいない。
740 :
login:Penguin:2007/11/17(土) 09:40:38 ID:MN9c6cz5
742 :
login:Penguin:2007/11/17(土) 11:43:31 ID:4avAGLIe
do_fork
743 :
login:Penguin:2007/11/29(木) 13:55:56 ID:yo1OGExb
mmapで特定のデバイスのIOメモリを仮想空間に割り付けて,
その領域に対してユーザーからデータを書き込むことを考えています.
ユーザープログラムからその領域上に,あるデータ型の双方向リスト
を作りたいのですが,ユーザー空間の特定のアドレス範囲から空き
メモリ領域を動的に確保する方法ってないでしょうか
void *dev_malloc(start_address, end_adress, nbyte);
とすると仮想アドレスstart_address〜end_adressの範囲から
nbyteバイトの領域を確保するみたいなイメージです
>>743 かーなーり スレ違い
デバイスドライバ関係ない
汎用heap管理ライブラリがほしいってことだろ
heap-management とか ヒープ管理 でぐぐってみそ
ちなみに
void *dev_malloc(start_address, end_adress, nbyte);
ってI/Fはありえないと思うぞ
毎回 start_addressとend_adressを与えるわけ??
745 :
login:Penguin:2007/12/02(日) 23:50:11 ID:lbIQi7BJ
あげ
746 :
login:Penguin:2007/12/13(木) 19:50:31 ID:pBhS9AMD
あげ
747 :
俺:2007/12/18(火) 23:09:45 ID:K//ZswLt
ドライバでCPUキャッシュのフラッシュやりたい!
どうやるの?だれかおせぇ〜てぇ〜
>>747 CPUキャッシュのフラッシュをする命令を実行すればいいんじゃない?
CPUはなに?
749 :
俺:2007/12/18(火) 23:59:27 ID:K//ZswLt
>>748 Xeonの5100です。
データシートとか見つからなくて。。。
ご存知でしたら教えていただけませんか?
<経緯>
Linuxマシンで、DMAでPCIeのデバイスからホストメモリにデータ転送
したときにキャッシュのせいか、2周目のリングバッファ領域が
うまく参照できていなく、フラッシュすればと思いました。。
751 :
login:Penguin:2007/12/24(月) 18:03:58 ID:ugbio3bt
Linux 2.6.22 ARM9マシンでシリアルコンソールでデバッグするためにカーネルコマンドラインで
console=uart,mmio,0x80004600,57600n8
とすると、カーネルの初期化中に
early_uart_console_init()→register_console()→early_uart_setup()→parse_options()→ioremap()→__arm_ioremap()→__arm_ioremap_pfn()→get_vm_area()→__get_vm_area_node()→kmalloc_node()→kmalloc()→kmem_cache_alloc()
が呼ばれてkmem_cache_alloc()でこけます。
slabアロケータがまだ初期化されていないのにkmem_cache_alloc()が呼ばれているのがこける原因と思うのですが、armマシンでもearly_uart_consoleは使えるのでしょうか?
752 :
【大吉】 【801円】 :2008/01/01(火) 19:54:53 ID:EHGXP/cp
新年あげ
753 :
【中吉】 【156円】 :2008/01/01(火) 20:58:21 ID:LfamTH+n
>750
749じゃないけど,これいいな.サンクス.
みんなチップのデータとかはどこから調べてくるの?
ちょっと想像してみたけど,「とりあえずメーカサイトを調べる」
以外の方法がわからん.
windowsのドライバから情報調べたりする人もいるの?
いたらその解析方法とかおしえてください.
>>749 Intel の CPU だとその手のキャッシュのことは気にしなくていいんじゃなかったっけ?
いわゆるバススヌープ。ま、明示的にフラッシュしたきゃできるだろうけど。
(実は俺自身は x86 以外用のドライバしか書いたことがないので聞きかじりだが...)
あと、キャッシュが効いているなら1周目でも駄目な場合がありそうだがどうなん?
単にリングバッファのアリゴリズムでしくじってたりして。
って、よく見るとえらい昔の書き込みだった。もう解決したのかな。
チップの購入先の営業から入手とか
チップベンダのwebサイトからダウンロードだろ
常考
757 :
login:Penguin:2008/01/14(月) 11:44:33 ID:MLu8ArWP
今馬本の第 3 版読んでんだけど scull のソースコードって
Web でダウンロードできるの?
あるよ
>>758 早速ありがとう.
本を斜め読みしてるんだけど URL が見当たらないです.
検索しても見付からないし,もしよろしければ教えていただけますと
うれしいです
>>759 ありがとう! 3版のは FTP で以下からダウンロードできました.
ar.linux.it/pub/ldd3/ldd3-samples-1.0.0.tar.gz
かなり感謝です ありがとう
764 :
!omikuji !dama:2008/01/25(金) 07:11:44 ID:dVpHcdky
kaso
ドライバでのロックの掛け方とか
その変のデザインパターンみたいなもの
ないのですか?
馬本読んでも、DualSocket 4コアとか
その辺の場合どうすればいいとかまったく
書いてなくて困ってる。
CPU毎にあるモノを意識しなければならないのか
全リソースを意識した作りなのかの判断も
ケースバイケースとかだし。WDMの方がいいよね
WDMってよく知らないが、割り禁、スピン、寝る&起こす以外に
排他の方法があるの?
そもそも排他なんじゃねーの?
昔はLinuxも明示的にスケジュールよぶまで
カーネル空間は排他だったじゃん
SMPが出てきて全部直す羽目になったけど
割込みハンドラ
770 :
login:Penguin:2008/02/03(日) 19:45:35 ID:coODkdMv
過疎
「新着1件ってことは、いつもの良スレ上げ厨かなぁ」と思ったらそう来たか。
772 :
login:Penguin:2008/02/19(火) 16:29:32 ID:vNMS2dUr
基本的にPCIデバイスにデータ渡すだけのドライバを作ってるのですが、
I2Cデータ転送もしたいといわれ、苦戦中につき質問させて下さい。
カーネルリリースは2.6.11-1.1369_FC4
今のところインクルードしてるのは下記ヘッダーです。
linux/module.h
linux/kernel.h
linux/pci.h
linux/pci-dev.h
asm/uaccess.h
unistd/.h
sys/ioctl.h
sys/perm.h
I2Cのオープンのために、これにfcntl.hを加えたところ、dev_tの型などが再定義されたとエラーが出ます。
また、KERNELDIRを取得して、その場でMAKEしているため
Makefileにて、環境変数C_INCLUDE_PATHに/usr/includeを設定しているのですが
fcntl.hを除いてコンパイルしてもclose, ioctl等が未定義と警告されます。
これらエラーや警告の対応に行き詰まってしまいました。
インクルードに過不足あるのか、Makefileが悪いのか、そもそもPCIドライバからI2Cを叩く方法が悪いのか…
アドバイス等お願い出来ますでしょうか。
デバイスドライバでunistd.hなんかincludeしちゃダメだろ
fcntl.hも同様
何言ってるのかわからないなw
PCIデバイスとして、I2Cバスへのブリッジが載っているのか?
それとも、PCIバス/デバイスとは関係なく、全く別のI2Cバス上のデバイスをアクセスしたいだけなのか?
775 :
772:2008/02/19(火) 22:00:59 ID:vQR2/dLm
>>773 やっぱりダメですか。
というか、無理やり環境変数使ってコンパイラのエラーを抜けてる(unistd.h以降3ヘッダ、加えてfcntl.h)のは全部includeしちゃダメですかね。
>>774 >PCIデバイスとして、I2Cバスへのブリッジが載っているのか?
>それとも、PCIバス/デバイスとは関係なく、全く別のI2Cバス上のデバイスをアクセスしたいだけなのか?
PCIデバイスにI2Cバスへのブリッジが載っている、のはずです。
つーかさ
カーネルモードで動いてるデバイスドライバの中から
open()とかclose()とかioctl()みたいなシステムコールを
発行できるわけないだろ?
>>772が作りたいと思ってるのは root権限で直接I/O叩くだけの
ユーザランドで動くアプリなんじゃないのか?
>>775 じゃあ、そのPCI-I2Cブリッジのデバイスドライバを書いているんだとして、
>I2Cのオープンのために
なんで、こうなるのよw
とりあえずDocumentation/i2c/summaryでも読んでくれ。
>>776 呼んじゃダメなんですね。了解しました。
先週までアプリしかやったことがなく、ついそっち寄りな考えに、と、蛇足でした。失礼しました。
>>777 あー、確かに。
教えていただいたものを読んでみます。
ありがとうございました。
>>773 そういえば、しちゃダメだ ってどこにも書いてないな
わからない奴はわからないんじゃないか?
ちょっと相談なんだが、いいかな
writeの中で長時間割り込み待ちをするような処理と、その場で終わる処理を持ったデバドラがあって、
(処理の切り替えはioctl)
まずアプリAが長時間かかる処理のためにwriteわ呼び出す。
当然割り込み待ちになるが、そのままアプリBがioctlやwriteを呼び出すとどうなる?
普通に処理出来る?
一つのデバイスを二つのアプリで同時に使うっつー事ですか?
>>781 その通りで。
ただ、1つのアプリがマルチスレッドになってるという場合もありでお願いしたい
できるかどうかは作り方次第だろうな
資源の排他処理が必要なら、ロック使わなきゃならん
その場合は、すぐ終わるはずの処理ももちろん待たされる
待たせたくなけりゃ、長時間かかるというwriteにバッファを設けて
write処理と割り込み処理とを分離するみたいな工夫したらどうだ
的外れならスマソ
>>783 資源は共有しないからロックはいらなさそうだ
writeにバッファを設けて処理を分離ってのがイマイチわからんのだけど、説明頼んでもいいかい?
デバドラの中でもスレッドとかで並列にするの?
シリアルポートを想像してみたらどうだろう
Write、Read、割り込みがそれぞれ並列に動くはずだ
Writeで割り込み使ってるかどうかは知らないけど
ブロック と ノンブロック という用語を使ってほしいところだな
んで複数プロセスから同時に使えるかどうかはデバイスドライバの作り方次第
手抜きにつくると open()されるときに競合問題を判断して
同時にひとつとかopenできないようにするよな
複数同時にopenして、ひとつがブロックしてる時に
また別のがノンブロックの処理要求してきたなんて場合は
そういう風にうまく動くようにドライバの中で考慮する必要がある
追記
呼び出し側がマルチスレッド使ってるかどうかはあまり関係ない
ふたつのプロセスがメモリを共有してようがしてまいが
ドライバにとっては関係ない話だ
それよりCPUが複数ある(いわゆるSMP)かどうかの方が重要
smp対応させるなら必要なところできっちりspinlockしないとダメ
>>787-788 ブロック=長時間処理
ノンブロック=即時処理
でおk?
複数からopenされるのはアリにしないといけないっぽいんで、考えてみる。
ブロック中にアプリBからもwrite自体は呼び出せる?
その時点で破綻してるなら、今のwriteをそのままスレッド化して、write自体はスレッド起動だけにするなりで対応とか…ダメかな
あとCPUは1つ前提でおkっす。
余裕があったら後学のためにもsmp対応も抑えておきたいがw
> ブロック中にアプリBからもwrite自体は呼び出せる?
もちろん呼べる
ブロック処理とは、簡単にいうと処理開始をデバイス(ハードウェア)に
通知したあとスリープ状態に入り、処理完了割込が入ったら
割込ハンドラがスリープ(ブロッキング)しているプロセスを
たたき起こすって流れ。
アプリAがスリープ(ブロッキング)している間に
アプリBからreadなりwriteなりが発行されるのは当然ありうる話。
ちゃんとドライバを書いておけば問題なく動く。
linuxカーネルのソースコードそのものがいいサンプルコードだから
いろいろ読んでみるとよい。
それから、procfs(/procの下に仮想ファイルをつくる)に
状態監視・デバッグ操作用のI/Fを用意しておくと後々楽になるよ。
>>789 凄く参考になった!
ありがとう
>答えてくれた人達
いろいろありがとう
791 :
login:Penguin:2008/03/03(月) 00:13:39 ID:JgGlbVL6
ttp://www.atmarkit.co.jp/fsecurity/rensai/rootkit03/rootkit02.html 上記を参考にシステムコールをフックするプログラムを書きました(そのままでは駄目なので必要に応じて修正しています)。
コンパイルすると、
original_sys_uname = sys_call_table[sys_uname];
sys_call_table[sys_uname] = hook_uname;
のsys_unameで `sys_uname' undeclared (first use in this function) とエラーがでます。
これは arch/i386/kernel/syscall_table.S をインクルードしておく必要があるのでしょうか?
使用しているカーネル:2.6.23
>>791 sys_call_table[NR_uname] = hook_uname;
の様な気がするわけですが。
>>792 それはユーザー空間で乗っ取る方法ですがな。
794 :
791:2008/03/03(月) 07:25:41 ID:zrYDUX8A
796 :
795:2008/03/04(火) 09:39:35 ID:NdRlprld
>>791 パッチを当てるのが嫌ならLSMを使ったらいい。
決まった関数で始めるとか、とかsecurity_operations構造体に登録するあたりとか
デバドラに似ているからsecurity以下を読めば使えると思う。
797 :
791:2008/03/04(火) 19:10:21 ID:iX0t2env
>>791 調べもせずに書いてるけどLinux版のウィルス対策ソフトのお試し版に
運がよければカーネルモジュールのソースが含まれていて、なおかつ、
それがシステムコールのフックしていたりしないか?
799 :
791:2008/03/05(水) 00:39:02 ID:QPFLTsD+
800 :
login:Penguin:2008/03/17(月) 18:46:02 ID:c0UdNwV3
あげ
init中にalloc_chrdev_regionでデバイス番号を動的確保した後で、
そのまま(関数内で)スペシャルファイルを作成する事は可能?
mknodコマンドでなく、あくまでインスコだけで済ませるように出来ないかと…
udevじゃダメなの?
>>801 オレならprocなりsysなりのみで済ます
804 :
801:2008/03/18(火) 21:37:57 ID:z8581E+A
>>802>>803 それだとinsmod以外にも必要になるんじゃないんですか?
関数で無いですかね
(init_moduleから呼び出す)
insmod hoge
だけ実行すればアプリから叩けるような形にしたいんですが…
shell スクリプト作ってその中で insmod、mknod すれば?
rmmod も出来るようにすれば、なお良いでしょ?
>>805 それが良さげですね。
ありがとうございました。
>>801 mknodしたくないってだけなら、device_create(9)か、手を抜きたいなら
misc_register(9)に全部にまかせれば、
>>802が言ってるように、udevが勝手に
スペシャルファイルを作ってくれるんじゃないか?
ブロックデバイスのブロックサイズってどこで決まってるの?
ユーザアプリから見る方法ある?
>>808 mkfsする時に決まると思うが。
ext2/ext3 なら tune2fs -l で見るか、ファイルがあれば stat構造体の st_blksize を見る。
>>808 そのブロックデバイスドライバが制御しているハードの規格によりだね。
SCSI系ならMode Senseコマンドで取れたんじゃないっけ?
>>808 試してないけど、blktool(8)のblock-szコマンドでいけそうかもね?
>>809 フォーマットする前に最適値を知っときたい乙女心です
>>810-811 ありがとう。でもハードの規格というよりブロックデバイスとして
なんかその辺を返してくれるioctlなりなんなりがあったらいいな
とか夢想してた
>>807見て、misc_register調べてちょっと使ってみたんだけど、
これで作ったもんどうやって消すんだ?
関数自体は使い方分かったが、対になるもの無い?
misc_register込みのinsmod→rmmod→再度insmodでハングするんだが
書いた直後に自己解決しちまったorz
misc_deregisterがあるのね…
スレ汚しすまんかった
815 :
791:2008/04/06(日) 15:36:55 ID:n9AD6VHb
ほ?
816 :
login:Penguin:2008/04/10(木) 21:40:14 ID:zop984mC
mmapを利用して物理アドレス0x10000000に存在するデバイス(SRAM)のR/Wを
行うドライバを作成しようと思っています。
馬本の第3版のサンプルソース(simple)を参考にしながらremap_pfn_rangeで
マッピングし、ダンプをとってみたところ、0x10000000エリアのデータでは
なく、全て0のデータが読み取れました。
0x1000等の小さい物理アドレスであれば正常にリード出来ているようです。
0x10000000のように上の方のアドレスは、remap_pfn_rangeではマッピング
されないのでしょうか?
カーネルのバージョンは2.6.11です。
817 :
816:2008/04/10(木) 22:19:28 ID:zop984mC
/dev/mem openして
memmap((void*)0, 0x1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x10000000)
memmap((void*)0, 0x1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x1000)
でも同じ結果でした・・・
818 :
816:2008/04/10(木) 22:20:55 ID:zop984mC
訂正
>>817 >memmap((void*)0, 0x1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x10000000)
>memmap((void*)0, 0x1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x1000)
mmap((void*)0, 0x1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x10000000)
mmap((void*)0, 0x1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x1000)
819 :
816:2008/04/10(木) 22:21:43 ID:zop984mC
訂正
>>817 >memmap((void*)0, 0x1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x10000000)
>memmap((void*)0, 0x1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x1000)
mmap((void*)0, 0x1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x10000000)
mmap((void*)0, 0x1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x1000)
Linux 2.6.11 使ってないしためしてないけど、
/sys/devices/pci*/*/resource? を mmap(2) って出来ないんだっけ?
とりあえず、落ち着けw
man mmap2
822 :
816:2008/04/11(金) 23:01:18 ID:1s5/4DVK
>>821 >man mmap2
↓ですよね?
http://www.pinkdragon.net/doc_lib/contents/ja/linux_man/mmap2.2.html Linux 2.3.31 以降で使用可能とありますが、この環境では定義されていないと言われます。
組込み系だからなんでしょうか・・・
それと馬本第3版のP437 15.2.6 RAMのマッピングを変更する に
「ramap_pfn_rangeがRAMを扱えないことは・・・」ってくだりがあります。
実際いま起きている問題はこれなんでしょうか?
ioremap_nocacheでReadする方法とダンプ比較したところ,mmapだと
0x00000000〜0x00800000 あたりまではちゃんとよめますが、
0x01000000になったとたん、0x00000000の値になってしまいます・・・
ioremap_nocacheでは0x01000000も見れるのに・・・
MTD使えばいいんじゃない?
phram.koとか
slram.koとか
タスクレットの中でsleep_on_timeoutって呼べないんですか?
なぜかカーネルパニックになってしまいます…
タスクレットからkill_fasync()呼びたいんですけど、
第一引数ってどこから持ってくればいいんでしょうか?
826 :
login:Penguin:2008/06/13(金) 19:47:44 ID:ngpRzev4
フリーオのデバイスドライバー書ける人が居たら神!
玄箱用のは、あるだろ
828 :
login:Penguin:2008/07/05(土) 05:09:39 ID:+CtKxXwh
あげあげ
やっぱり情報公開されてない物のドライバ造るのって無理がある?
Willcomスマートフォン端末でLinuxを動かすプロジェクト?があるのですが、
WS003SH、WSはPrismチップの無線LANを使用。
WS011SHではSharp独自のチップを使用した物のようです。
WS020SHは不明。
当方WS011SHの物の開発に興味があるのですが、難しいどころか情報の公開がされていない限りは
手すら付けられない状態でしょうか?
アドバイスよろしくお願いします。
831 :
login:Penguin:2008/07/27(日) 04:17:46 ID:JGvJfhtT
copy_{to,from}_user()でユーザプロセスのアドレスを与えるところにカーネル空間のアドレスを与えるとどうなります?
やっぱりaccess_ok()で弾かれる?
832 :
login:Penguin:2008/07/27(日) 08:01:26 ID:Nq54nVAZ
833 :
login:Penguin:2008/08/21(木) 06:11:30 ID:5vh0FBcx
あげ
834 :
login:Penguin:2008/09/17(水) 22:50:23 ID:v0hV3n2N
Linuxデバドラ移植の質問です。
雑誌の記事でx86Linuxデバドラを他CPUのLinuxに移植する際に、デバドラのソースが
x86に依存してて移植できないことを知りました。
どうやらx86プログラマが他のCPUへの移植性を考えずに開発したことが原因みたいです。
雑誌によるとデバドラの依存箇所は以下が多いようです。
・バイトオーダ
・アライメント
・I/Oアクセス
・タイミング
皆様に質問ですが、このようなx86に依存したLinuxデバドラが落ちている場所を
ご存じないでしょうか?
また、根本的なことですがx86Linuxデバドラを移植したり、移植しようとしたが
x86に依存してて大変だったという案件は多いのでしょうか?
どうぞよろしくお願いいたします。
>>834 drivers/
直すのはそんなにめんどくないが、どこに地雷があるかわかりにくいのがのう。
>>834 というか、デバイスドライバは基本的にハードに依存して当然
という側面も否定できないと言わざるを得ないこともあるので。
837 :
834:2008/09/18(木) 00:34:38 ID:csSd+QEz
カーネルソース内にあるんですね!
知りませんでした;
私は初心者でよく知らないんですが、てっきりカーネルソール内のコードって
移植性をちゃんと考えてあって(arch/以外)、管理されていると思ってました。
むしろ、カーネルソース外の開発(企業or個人)で公開されているドライバに
あるのかと思ってました。
>>834 ふつー開発者の持ってるCPUでしかテストしないよ。
tg3とかe1000とかはNEC(ia64)とかIBM(powerpc)とかが
頑張って自分とこのハードで動くようにしてるけど、
個人でハックしてるものはたいていx86だけ。
まあ、過去の経験からすると
・USBターゲット - ほとんど手を入れる必要無し
・PCI - そんなに苦労することはない
・CPU直結 - 健闘を祈る
てところですかねえ。
840 :
login:Penguin:2008/11/09(日) 10:59:58 ID:QBZrgAJi
age
USBデバイスでも無線LANとかは
842 :
login:Penguin:2008/12/07(日) 17:23:17 ID:Ht7uJKzk
age
HWからの割込み処理中の、ローカルAPICへのEOI発行タイミングについて質問があります。
レベル・トリガの割込みだった場合は、end関数からEOIを発行しています。
これは、割込み処理の先頭で発行してしまうと、I/O APICへEOIが通知され、デバイスのアサートが
失われてしまうのが不都合だからでしょうか?
カーネルのverは2.6.18 です。
>>843 一般的な話だけど
割り込みに関わるのは3つ。
@割り込み発生の条件と、割り込み要求するデバイス
A割り込みを調停する割り込みコントローラと、割り込み受付のカーネル
B実際の割り込み処理プログラム
@→A→Bの流れは分かるよね
それなら質問の答えも分かるよねw
わんこ蕎麦に例えると
@
>>843のお椀の蓋が開いてる
A
>>843のお椀に蕎麦を放り込むおばちゃん
B蕎麦を食べる
>>843 満腹になった
>>843Bが最初にすべきは、@の処理かAの処理か
>>844 「ご馳走様でした」と言いながら金を払わないで蓋も開けっ放しで逃げる。
ダブルフォルト乙
(1)はおばさんのスピードに勝てないと判断して、(2)のおばさんに話し掛けるよな
もうお腹いっぱいって
848 :
login:Penguin:2009/01/24(土) 00:42:09 ID:UJ+xFTUa
a
ポートIOするサンプルを作ってみようと思ったのですが、
下のコードの時点で、すでにコンパイルが通りません。
sys_ioplを呼ぶのに、何が足りないのか分からないです。
どうしたら良いか、アドバイス頂けたら助かります。
よろしくお願いします。
debian 2.6.24 gcc 4.1.2
make -C /lib/modules/2.6.24/build M=/test module
error: implicit declartion of function 'sys_iopl'
---
#include <linux/init.h>
#include <linux/module.h>
#include <linux/io.h>
#include <linux/ioport.h>
static int __init
hello_init(void){
sys_iopl(3);
return;
}
static void __exit
hello_exit(void){
return;
}
module_init(hello_init);
module_exit(hello_exit);
850 :
login:Penguin:2009/02/17(火) 22:55:48 ID:m2mCukTw
すみません、sageてしまいました。
根本的に間違っているような気がするので、
もう少し具体的にやりたいことを書いた方がいいと思う。
取り合えずドライバでioplはいらねえ。
>>851 もしかして、ドライバ内では、ポートにアクセスするのに、iopl自体が使えないということでしょうか?
そうすると、request_regionしていくしかないということですかね。
それとも、アクセス許可自体が必要ないのでしょうか。
元々、独自PCI-I/Fボードにアクセスするアプリがありまして、
それの、ドライバ版を作ろうと思いました。
そのアプリでは、iopl(3)→outb(),inb()にて値を取得していたので、同じ様に作っていたところでした。
PCIからのポートアドレス取得が上手くでき、そのアドレスにアクセスする段階だったのですが、
ioplでどうしてもコンパイルが通らず、includeの問題なのか、Makefileなのか、
途方に暮れてました。
>>849はそのテストプログラムを抜き出しです。
なんでドライバにする必要があるのかよくわからんが。
そういうレベルでわからんのであれば、まずは馬本で基礎知識を
身につけた方がいいと思う。
ついでに、sys_ioplの呼び方はそうじゃない。
つうかカーネルの中でsys_〜は直接呼ぶもんじゃない。
>>853 ありがとうございます。
ドライバ版の意図は、いずれ割り込みを使うつもりだったからです。
馬本は十分理解できなかったので、とりあえず作ってみるという感じでやってました。
sys_ioplは呼んではいけないんですね。
馬本、もう一度読んでみます。
馬本はカーネルの知識がある程度ある前提で書かれてるので
まずはLinuxカーネルに関する文献を読んでみることをおすすめするよ
デバイスドライバはカーネルの一部でもあることを忘れるな
Kernel 内で IN/OUT アセンブラ命令に相当するのは
何かマクロがあるんじゃなかったっけ?
READ_PORT とかそんなの。
in[bwl]
out[bwl]
とか。
include/asm/io.hに入ってたはず。
シリアルドライバ内の情報で、何バイト受信済みとか、何バイト未送信という情報って
取得することは可能ですか?
859 :
858:2009/07/04(土) 16:35:43 ID:D5yvn6Kc
補足です。
上記の情報をアプリケーションから取得できますか?
>>859 ioctlでTIOCINQとかTIOCOUTQみれば出来そう。
つーかマニュアル嫁よ。せっかくあるんだからよ。
ヌルイぞ。そこは
つーかソース嫁よ。せっかるあるんだからよ。
だろ。ソース以上の資料なんかないんだからOSSってのは質問禁止なんだよ。
・・・ってえらいひとがいってました!
どこでも、えらい人は馬鹿なもんさ。
864 :
login:Penguin:2009/09/19(土) 20:24:56 ID:I29pddJ7
保守上げ
>>861 × だろ。ソース以上の資料なんかないんだからOSSってのは質問禁止なんだよ。
○ だろ。ソース以外の資料なんかないんだからOSSってのは質問禁止なんだよ。
i386BSDカーネルの386BSDカーネルソースコードの秘密
ソース以上の資料なんかないんだから、に対して何か書いてあったな。
>>866 ソースそのものと、ソースにこめられた趣旨は別じゃないかな?
UTSL だな。
869 :
login:Penguin:2010/02/18(木) 10:40:00 ID:hWc/MwlX
linuxmintとウィンドウズ7RCを使っています。WIN7は試用なので来月から起動後一時間で自動で電源が落ちるようです。
リナックスに乗り換えるのは簡単なのですが、今使ってるテレビチューナーのドライバがリナックスには無いのです。
だれかmvp-rx3のドライバを書いてください。
このままではリナックスでテレビが見られず、リナックスをあきらめてウィンドウズのところにお嫁にイかされてしまいます。
テレビを見るためにはリナックスをお慕いもうしあげていますのにウィンドウズを買わなければならない境遇に
どうかどうか同情をしていただけるスーパーハッカーの方はドライバ書いてくださいませんか。
生きていくためには愛をもあきらめゲイツに身をゆだねなければならないのかと震えております。
ちなみにあたし女子中学生です。生娘です。似ている芸能人は17歳のころの広末涼子です。
デバイスクラスがCDCでバルクでデータ転送するUSBドライバを作りたいんですけど、usb-skeltonドライバのベンダーIDとプロダクトIDを変更すれば使えるのでしょうか?
ioctlについて教えてください。
ioctlのパラメーターで指定するIDはlinux/ioctl.hで定義されているIOWやIORを使います。
しかし、アプリ開発者に渡すヘッダにIOWなどを使ってしまうと、ioctl.hはカーネルヘッダなので
アプリ開発者に渡せません。
ioctl.hごと渡すという手もありますが、ioctl.hの実態はarchの下を辿っていったものなので、
ずばりIOWなどが定義されているioctl.hを渡してしまっては、アーキテクチャを隠蔽している意味が
薄れてしまいます。
かと言って、別にヘッダを作っては無駄です。
これは、本来はどのように解決することを想定されているのでしょうか?
ビルド環境に入っているものを素直に使う。
>>873 ビルド環境?
すみません、Linuxはドライバの開発とOSの移植しかやったことがないので、
ビルド環境がよくわかりません。
ドライバを開発するうえで、アプリ屋さんにどのようにドライバのヘッダファイルを
渡すのが正しいやり方なのかを知りたいです。
分かりました。
ioctl.hはわざわざ渡さなくても、アプリ開発で使用するカーネルヘッダに入っているので
大丈夫ということですね。
ありがとうございました。
ドライバコンパイル時に静的ライブラリをリンクさせることって出来ますか?
はい
どうやったら出来ますか?
2.6系のカーネルですが、-lでライブラリを指定しても
WARNING: "hoge" [/home/hoge.ko] undefined!
と言われてリンクできないんですよ。
.koってライブラリじゃないよ
そもそもgccやbinutilsはWARNINGとか大文字は出さないだろう
何かすごい勘違いしてそう
>>879 そもそも -l のかわりにソース直指定ならリンクできるのか?
883 :
login:Penguin:2010/12/29(水) 17:20:29 ID:4yM0+SZ6
webcam(UVC)を接続すると、/dev/video0にデバイスが作成されますが、
ここから流れてくるフォーマットについて知りたいのですが、どこか
参照するところってありますでしょうか?
おめおめ!
Cライブラリのassert()のドライバ版みたいなのないですかね?
勉強用にドライバを書いているのだけど、エラーチェックにいちいち if文を書くのが面倒くさい。
普通のアプリの場合は、assert()で一行でエラーチェックを終わらせるのだけど。
無いなら、どうやってエラーチェックしてるか教えて貰えるとありがたい。
BUG_ON
タイプ数減らしたいだけなら自分でマクロ書けばいいじゃん
#define assert(x) なんとかかんとか
888 :
885:2011/05/28(土) 21:55:24.09 ID:DZ/zAfXL
>886
どうもありがとう。良い情報を頂きました。
>887
最悪その方法を取るけれど、既存の洗練された方法があるならそっちを使うべきでしょう?
889 :
login:Penguin:2011/07/28(木) 17:08:37.75 ID:fa8I36t3
PCIの自作用穴あき基板ってあるんですかね?
自作基板をスロットに差してデバドラも自分で書いて使ってる人います?
890 :
login:Penguin:2011/07/28(木) 21:19:13.92 ID:9X016Sem
FPGAでプログラムする人とかいるんじゃないかな
892 :
電板住人:2011/09/08(木) 22:50:33.11 ID:5S22Lom/
汎用のPCIプロトコルICがあればいいのにね
プロトコルが複雑なせいで使いにくいよ、PCIは
PCIってバスマスタ機能ついてないと強烈に遅いからなぁ
ターゲットアクセスONLYだったらUSBの方が全然マシ
USBはターゲット側から割り込みかけられんのがなあ
3.0が一般的になれば解決しそうだが
>>898 一瞬安いと思ってしまったが、いまさら使い道ないよなぁ
create_workqueueでカーネルスレッドいっぱい作るドライバが多いな
core-i7とか12個もできたりする
NICレジスタのとあるフィールドを、MMIOを使って書き換えようとしています。
1.pci_get_device()でデバイス情報取得
2.pci_resource_start()で物理アドレス取得
3.ここで、一応request_mem_region()をコールしますが、既にベンダー提供の
デバイスドライバでrequest_mem_region()されているので、0が返ってきます。
が、構わず続けて、
4.ioremap_nocache()でマッピングされたアドレスを取得
4.の結果を以ってレジスタのREADはできた(ethtool -dとの比較結果が一致)のですが、
writeb()を使って書き込んでも反映されていません(ethtool -dで確認)。
そこで質問なのですが、既にrequest_mem_region()されているレジスタについては、
READはできてもWRITEは不可といったことなんでしょうか?
それとも、他にフラグ操作等足らない操作があるのでしょうか?
同じリソースに2ヶ所(個別の管理している?)からアクセス(書き込み)したら、どうなるかわかってる?
>>902 実際にはある条件を満たすパケットを捨てる/捨てないを担う1bitの書き換えなのですが、
それでも横から弄られたら破綻するかなと思います。
そもそも、ベンダー側ドライバがこのbitを操作するioctl()なりEXPORT関数なりを用意
してないので、サポート外動作というのは理解しています。
一応、この辺はベンダー側にNDAでもいいんで提供してもらえるように依頼しています。
今回は、それまでに時間がかかるのでとりあえずでも弄ることができないかとあれこれ
やっています。
最悪は、このbitをドライバロード時に設定しているドライバソースを弄ればなんとか
なりそうなんですが、ソースを弄ることなく外から設定できるといいな、と。
904 :
login:Penguin:2012/04/11(水) 07:42:58.51 ID:k8CqWmKf
>実際にはある条件を満たすパケットを捨てる/捨てないを担う1bitの書き換えなのですが、
スレタイに通りに、NDAドライバをハックして
バイナリパッチのほうが早くね
>>904 今回、MMIO使って書き換えてみようと考えたのが、そこのページを見たためでした。
結局まだうまくいってませんが…
>>905 とりあえず、ドライバソースを弄る方で先にやってみようと思います。
907 :
906:2012/04/12(木) 20:02:46.16 ID:lbSIQeJF
結局、ドライバソースを弄って無事目的を果たせました。
kernel技術者の需要ってどんなもんでしょう?
技術者が不足している分野と、
待遇の目安など教えてもらえると嬉しいです。
今それが見えてない時点でアウトだと思うよ
いや、なら他を当たるまでなので別によいです
webなりDBなり頑張ります
ジャンルには関係ないとは思うが、まあいいか
>>910 まだ選択の余地があるなら他に進んだ方がいいと思う。プログラム業なんて、
>>909みたいなカスしかいないから。
プログラム業
914 :
login:Penguin:2013/03/26(火) 08:51:30.75 ID:CLzKF3Up
age
915 :
login:Penguin:2014/02/13(木) 19:42:26.30 ID:StvXlIag
/dev/input で
type=EV_MSC code=MSC_SCAN って
なにを意味してんの?
916 :
login:Penguin:2014/02/23(日) 12:43:47.37 ID:ytOaVGS4
ecb ってなにドライバー?
917 :
login:Penguin:2014/02/26(水) 10:47:34.06 ID:w6lQvC2s
キン肉ドライバー!
ドバイスデライバァ!
奇跡、神秘、真実、夢
書籍読みながらサンプル動かしてるけど楽しい!
もっと早くから勉強しとくんだった・・・
921 :
login:Penguin:2014/10/30(木) 21:21:48.26 ID:xfEc1Jae
ユーザーランドで動作するデバイスドライバ
って作れる?
>>921 User Space I/O (uio)のこと?