最近、仕事でLinuxを使っているので、ハマったりしたことについて残しておこうと思います。Linux経験1ヶ月なので、誰でも知っているようなアホな内容も含まれるかもしれません。早速ですが、DMAコントローラがちゃんと使えるか試すために、既存のDMAドライバを使用し、RAM→RAMとDMA転送するドライバ(モジュール)を作ってみたのですが、insmodしたら「unresolved symbol なんちゃら」という感じのがいくつか出ました。どうやらモジュールから呼び出している関数が見当たらないとのことです。dma.cには該当の関数はちゃんと定義されているし、dma.cもコンパイルされてdma.oが作成されているし…。Makefileも間違っていない…。(DMAドライバは、モジュールではなくカーネル組み込み型です)散々悩んだところ、dma.cと一緒にコンパイルされて正常にシンボル参照ができるっぽいio.cとの違いを調べてみたら、dma.cはlinux/module.hがincludeされていません。また、EXPORT_SYMBOLもio.cにはあるのにdma.cにはありませんでした。これらから推測すると…ドライバでlinux/module.hをincludeしないと、カーネル組み込み型ドライバからは呼び出せるがモジュールからは呼び出せない。モジュールからも呼び出せるようにするには、linux/module.hをインクルードしなくてはならない。かなと思いました。やることは3つ。1.linux/module.hを参照できないシンボルを定義しているソースにincludeする。2.参照したいシンボルをEXPORT_SYMBOLでexportする。3.そのソースのMakefileのexport(詳細忘れました)のところに.o(ここではdma.o)を追加する。となります。
かず (2006/06/26(Mon) 23:35:26)
名前: 題名: コメント パスワード:
トップへ
(c)FLEUGELz