[Suzaku:00593] Re: キャラクタデバイスのドライバーの作成

Abe email@hidden
2006年 7月 14日 (金) 14:05:14 JST


abe と言います。

直接アドレスに書いてみましたら

Oops: kernel access of bad area, sig: 11
NIP: C38011BC XER: 00000000 LR: C0034424 SP: C1ECDF20 REGS: c1ecde70 TRAP: 
0800dMSR: 00008030 EE: 1 PR: 0 FP: 0 ME: 0 IR/DR: 11
DEAR: F0F00004, ESR: 00800000
TASK = c1ecc000[44] 'suzaku_read' Last syscall: 4
last math 00000000 last altivec 00000000
GPR00: 00000040 C1ECDF20 C1ECC000 00000001 7FFFF818 00000001 C03DA5C0 
00000000
GPR08: 00000000 F0F00004 0000000C 00000002 30000600 00000000 7FFFFED0 
30005000
GPR16: 30005140 00000002 300050A0 000000E4 00008030 01ECDF40 00000000 
C0002948
GPR24: C00026A0 30000CEC 30000240 300152DC 7FFFF818 FFFFFFEA C03DA5A0 
00000001
Call backtrace:
C001A228 C00026FC 100005B0 10000AF8 30025CB4 30025CD0 10000480
Memory fault

と言う結果になってしまいました。

出来ましたら、どなたかアドバイスをお願いします。

----- Original Message ----- 
From: "Abe" <email@hidden>
To: "SUZAKU general discussion list" <email@hidden>
Sent: Thursday, July 13, 2006 5:59 PM
Subject: [Suzaku:00592] Re: キャラクタデバイスのドライバーの作成


> yashi 様。
>
> ご丁寧なご教示、ありがとうございます。
> おかげさまで、ほぼ理解できました。 特に
>
>> *(unsigned long *)0xffffd000 = 0x5a;
>
> が、そもそもやりたかったことです。
>
> 早速手直しして、デバッグを始めたいと思います。
>
> ありがとうございました。
>
>
> ----- Original Message ----- 
> From: "Yasushi SHOJI" <email@hidden>
> To: "SUZAKU general discussion list" <email@hidden>
> Sent: Thursday, July 13, 2006 5:41 PM
> Subject: [Suzaku:00591] Re: キャラクタデバイスのドライバーの作成
>
>
>> At Thu, 13 Jul 2006 17:11:19 +0900,
>> Abe wrote:
>> [...]
>>> f_posは「・・ユーザーがアクセスしているファイルの位置を示す・・」と
>>> ありましたので、seekで設定した値が反映されると思っていました。
>>> ではseekは意味が無いと言う事なんでしょうか。
>>
>> カーネルの世界へようこそ。:-)
>>
>> ユーザランドでは
>>
>>    fd = open("/path/to/file", ...);
>>    lseek(fd, offset, SEEK_SET);
>>    write(fd, buf, c);
>>
>> とすることで、/path/to/fileの offset目からデータを書くことができます。
>> これは kernelが見せている虚像にすぎません。
>>
>> kernel側から上記の挙動を見ると openではファイル名が渡され、lseekではシー
>> クするための値が渡され、writeではデータの入ったメモリ領域のアドレスと
>> バイト数が渡されるだけです。
>>
>> kernelはそれぞれ渡されたデータをある場所に書いたり、読んだりという実際
>> の処理を行なわなければなりません。kernelには虚像を見せてくれる人はいな
>> いのです。
>>
>> ですから「seekは意味が無い」ということではなく、「(必要であれば) seek
>> に意味を持たせなくてはならない」のです。
>>
>>> それと、
>>> >    *(volatile unsigned long *)ADDRESS = VALUE;
>>> >
>>> > と書くと ADDRESSで指定した値で address busがドライブされ、data busでは
>>> > VALUEの値がドライブされると思います。
>>> ですが、
>>> どのように関数の中に書けばよいのか分かりません。
>>
>> 仮に opb_emcがマップされているアドレスが 0xffffd000、書きたい値を 0x5a
>> としたとき
>>
>> ssize_t s_write(struct file *filp, const char *buf, ssize_t count, loff_t
>> *f_pos)
>> {
>> *(unsigned long *)0xffffd000 = 0x5a;
>>
>> return 0;
>> }
>>
>> としてはどうでしょうか?与えられるデータや、seekの有無に関わらず
>> 0xffffd000に 0x5aが書かれるはずです。しかもユーザランドから見ると
>> write()システムコールは、なにも書かれなかったことを示す 0を返すはずで
>> す。
>> --
>>          yashi
>> _______________________________________________
>> suzaku mailing list
>> email@hidden
>> http://lists.atmark-techno.com/mailman/listinfo/suzaku
>>
>
> _______________________________________________
> suzaku mailing list
> email@hidden
> http://lists.atmark-techno.com/mailman/listinfo/suzaku
> 




suzaku メーリングリストの案内