Armadilloフォーラム

linux-headersの取得

kawamura_alsys

2019年8月16日 14時23分

はじめまして、川村と申します。

あるデバイス用にドライバーのビルド環境の構築を行いたく、
Armadillo-X1の実機上にて、以下のコマンドを実行しました。

sudo apt-get install build-essential linux-headers-$(uname -r)

その結果、以下のエラーメッセージが表示され先に進むことができません。

Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package linux-headers-4.9.133-at11
E: Couldn't find any package by glob 'linux-headers-4.9.133-at11'
E: Couldn't find any package by regex 'linux-headers-4.9.133-at11'

もし、何らかの情報をお持ちの方がおりましたらご教授をお願いしたく存じます。

コメント

中村です。

> あるデバイス用にドライバーのビルド環境の構築を行いたく、
> Armadillo-X1の実機上にて、以下のコマンドを実行しました。

X1実機上ではなくて、Armdilloの開発環境であるATDE上で
ドライバをビルド(クロスコンパイル)するのでは
だめなのでしょうか?

--
なかむら

中村です。

先ほど「ATDE上でクロスコンパイルしては?」と書きましたが、

> Armadillo-X1の実機上にて、以下のコマンドを実行しました。
> sudo apt-get install build-essential linux-headers-$(uname -r)
...
> E: Unable to locate package linux-headers-4.9.133-at11
...

こちらの方も書いておきます。

unameでのバージョンは"-at11"が付きますので、
まずはこれを除外する必要があります。

それから、4.9.133の"133"の部分も一致するパッケージは
存在しないと思いますので、存在するパッケージの中で
最新のものをインストールすればいいのではないでしょうか。

# apt-cache search linux-headers-4.9
とやると、4.9.0-3 ~ 4.9.0-9 があるようなので、
# apt-get install linux-headers-4.9.0.9
ではどうでしょうか?

参考:
https://codeday.me/jp/qa/20190504/774293.html

// 4.9.0-9を入れてみたら4.9.168-1+deb9u5と表示されました。
// 4.9.0-8は4.9.110-3+deb9u6のようです。

--
なかむら

中村様

お世話になっております。川村です。
早速のアドバイス誠にありがとうございました。

> # apt-get install linux-headers-4.9.0.9
> ではどうでしょうか?

"$(uname -r)"を"4.9.0.9"に置き換えたところ、
エラー表示も無く正常にインストールされました。

> ATDE上でクロスコンパイルしては?

以前、Atmark様の資料を参考に、クロス環境(コンパイラ・ライブラリ)の環境構築を
試みたのですがうまくいかず、作成するプログラムも小規模なため、今のところは、
Telnet経由の実機上にて間に合っているような状況です。

おかげさまで、ドライバーのビルドに取り掛かれそうです。
ありがとうございました。

中村です。

> "$(uname -r)"を"4.9.0.9"に置き換えたところ、
> エラー表示も無く正常にインストールされました。

うまくいってよかったです。

> > ATDE上でクロスコンパイルしては?
>
> 以前、Atmark様の資料を参考に、クロス環境(コンパイラ・ライブラリ)の環境構築を
> 試みたのですがうまくいかず、作成するプログラムも小規模なため、今のところは、

Armadillo-640でドライバを書いたときのMakefileを
張り付けておきます。
G3/G3L/X1でもこれと同じで大丈夫だと思います。
// ソース(.c)が1個の場合の例です。
// カーネルがあるディレクトリ(KDIR)は適切なに変更してください。

obj-m = hello.o
 
KDIR := <どこか>/kernel/linux-XXXXX
PWD  := $(shell pwd)
 
all:
    make -C $(KDIR) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- \
    SUBDIRS=$(PWD) modules
 
clean:
    make -C $(KDIR) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- \
    SUBDIRS=$(PWD) clean

昔はガイドにout-of-treeでドライバをクロスで
ビルドする例も書いてあったのですけど、
最近のには書いてないみたいですね。

昔のはこれです。
https://manual.atmark-techno.com/dist/atmark-dist_developers_guide_ja-1…

--
なかむら

中村です。

> // ソース(.c)が1個の場合の例です。

今回は必要ないかもしれませんが、
あとで誰かがこれを見たときのために、
複数のソースファイルがある場合も書いておきます。
ソースが1つの場合もこっちでOKです。
//投稿前に試してないですけど、たぶん大丈夫でしょう。

SRCS = file1.c file2.c file3.c
 
obj-m = hello.o
hello-objs := $(SRCS:.c=.o)
 
KDIR := <どこか>/kernel/linux-XXXXX
PWD  := $(shell pwd)
 
all:
    make -C $(KDIR) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- \
    SUBDIRS=$(PWD) modules
 
clean:
    make -C $(KDIR) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- \
    SUBDIRS=$(PWD) clean

--
なかむら

中村様

お世話になっております。川村です。
アドバイスとサンプルコードありがとうございます。

ちなみに、現在ビルドを試みているドライバは、機器メーカーから配布
されているソースパッケージを、Armadillo X1で使用できるように改造
している状況でして、Makeで生成された.koモジュールを、insmodコマンド
で動的ロードするスタイルとなっています。

ですが、現状はinsmodでロードする際に、
「Error inserting 'driver.ko': -1 Invalid module format」
と表示されエラー終了となってしまいます。

このエラーの原因として推測しているのは、今回、nmame -r で取得される
カーネルバージョン<4.9.133-at11>を、強制的に<4.9.0.9>に変更してビルド
しておる訳ですが、.koモジュールに、その情報がvermagicとして埋め込まれ
るため、insmod内部で、カーネルに対してバージョン不一致と判断している
ためではないかと考えております。

(ただ、insmodに[-f]オプションを付加してもエラーとなるため、違う原因の
可能性も否定できません)

こうなってくると、カーネルそのものを<4.9.0.9>にバージョンダウンして
再構築するしかないのではないかと半分、あきらめているような状態です。

まずは、現状のご報告としましてお伝えさせていただきます。

また、後ほど、スレッドをかえて別件の質問もさせて頂きますので、
引き続きご対応頂けますと幸いでございます。

中村です。

> ですが、現状はinsmodでロードする際に、
> 「Error inserting 'driver.ko': -1 Invalid module format」
> と表示されエラー終了となってしまいます。

vermagic問題がありましたね。
すっかり忘れてました。

> (ただ、insmodに[-f]オプションを付加してもエラーとなるため、違う原因の
> 可能性も否定できません)

modprobeとinsmodの"-f"オプションは同じではないようです。

> こうなってくると、カーネルそのものを<4.9.0.9>にバージョンダウンして
> 再構築するしかないのではないかと半分、あきらめているような状態です。

ATDE上でやるのがいいと思います。

--
なかむら