忍者ブログ

2024
05
03

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2024/05/03 (Fri.)

2012
02
26

カーネルモジュールのコンパイル環境を整える(Scientific Linux 6.2)

カーネルモジュールをコンパイルするためには、Linuxのソースコードが必要&適切なパスの場所に
ソースコードを展開しなければいけない。
書きだしてみると結構面倒。。

注意

HDD15GB程度だとカーネルコンパイル時に容量が足りなくなりました

手順

#1 再構築に必要なパッケージをインストール (rpmdev-setuptreeのため)
yum install rpmdevtools yum-utils 

#2 パッケージ再構築の準備 (rpmbuildディレクトリを正しく作るため)
#  ホームディレクトリの中にrpmbuildディレクトリが作成される。
#  BUILD RPMS SOURCES SPECS SRPMS
rpmdev-setuptree
ls ~/rpmbuild/  # 確認

#3 カーネルソースのダウンロード
yumdownloader --source kernel
ls ./ # 確認 kernel-****.src.rpmファイルができているはず

#4 カーネルソースの再構築に必要となるパッケージをインストール
yum-builddep kernel-****.src.rpm

#5 カーネルソースのインストール
#  これにより、rpmdev-setuptreeコマンドによって作成された
#  ~/rpmbuildディレクトリ下にカーネルソースが展開される
rpm -Uhv kernel-****.src.rpm

#6 カーネルソースのツリーを準備
#  ツリーは~/rpmbuild/BUILD/kernel-<バージョン>/
#  linux-<バージョン>.<アーキテクチャ>ディレクトリに作成される
cd ~/rpmbuild/SPECS
rpmbuild -bp --target=`uname -m` kernel.spec

#7 いろいろ足りないと言われる なので必要なものを入れる
#  筆者実行時エラー
#************************************************************************
#[root@sl62-64bit SPECS]# rpmbuild -bp --target=`uname -m` kernel.spec
#Building target platforms: x86_64
#Building for target x86_64
#error: Failed build dependencies:
#	elfutils-libelf-devel is needed by kernel-2.6.32-220.4.2.el6.x86_64
#	zlib-devel is needed by kernel-2.6.32-220.4.2.el6.x86_64
#	binutils-devel is needed by kernel-2.6.32-220.4.2.el6.x86_64
#	newt-devel is needed by kernel-2.6.32-220.4.2.el6.x86_64
#	python-devel is needed by kernel-2.6.32-220.4.2.el6.x86_64
#	perl(ExtUtils::Embed) is needed by kernel-2.6.32-220.4.2.el6.x86_64
#************************************************************************
yum install elfutils-libelf-devel
yum install zlib-devel
yum install binutils-devel
yum install newt-devel
yum install python-devel
yum install perl-ExtUtils-Embed # 名前そのままじゃないから、ちょっと引っかかった

#8 改めてカーネルソースのツリーを準備
#  ### Now generating a PGP key pair to be used for signing modules.
#  のところで時間かかるのですが、バッググラウンドで
#  rngd -r /dev/urandomするとすぐ終わります
cd ~/rpmbuild/SPECS
rpmbuild -bp --target=`uname -m` kernel.spec

#9 現在使っているカーネルの.configファイルを使うために
#  ファイルをコピーしてくる
cp /boot/config***** ~/rpmbuild/BUILD/kernel-****/linux-**++/.config

#10 現行の設定をそのまま使う (この作業いらない?)
cd ~/rpmbuild/BUILD/kernel-****/linux-**++/
make oldconfig

#11 先の.configを元にカーネルソースのコンパイルをする
#   -j オプションを使うとMakefileに従った処理のうち依存関係が無く
#   直列に処理しなくても済む部分を,複数のプロセスを生成し並行処理する
make -j8

#12 カーネルソースへのリンクを適切に設定する
cd /lib/module/(kernel)/
ln -s ~/rpmbuild/BUILD/kernel-****/linux-**++/ ./build
ls -l # 確認

#13 hello.cとMakefileがあるフォルダへ移動
cd helloフォルダ
上記の手順で、makeもinsmodでカーネルにモジュールを組み込むこともできるようになると思います。

その他注意

上記の手順で、最も面倒な設定は済んでいますが、それでも失敗する場合は、
以下のところを気にしてください。
・Makefileのタブがスペースになっている
・リンクの設定が正しいか
・権限がないか
など

検索用タグ Linuxドライバ デバイスドライバ Linuxカーネル

拍手[0回]

PR

2012/02/26 (Sun.) Comment(0) Linuxデバイスドライバ

2012
02
25

複数のデバイスドライバソースをコンパイルする

main.c

/* main.c */
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

extern void sub(void);

static int hello_init(void)
{
    printk(KERN_ALERT "[%s] driver loaded.\n", __func__);

    sub();

    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT "[%s] driver unloaded.\n", __func__);
}

module_init(hello_init);
module_exit(hello_exit);

sub.c

/* sub.c */
#include <linux/module.h>

void sub(void)
{
    printk("[%s] sub() called\n", __func__);
}

Makefile

CFILES = main.c sub.c

obj-m += hello.o
hello-objs := $(CFILES:.c=.o)

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
※タブ注意

コマンド

以下コピペ用
make
insmod hello.ko
lsmod | grep hello
dmesg | tail -5
rmmod hello
dmesg | tail -5
※ su じゃないとダメかも

(sudo付き版)
make
sudo insmod hello.ko
lsmod | grep hello
dmesg | tail -5
sudo rmmod hello
dmesg | tail -5

実行環境 Ubuntu10.04 64bit
Linux 2.6.32-33-generic #70-Ubuntu SMP x86_64 GNU/Linux
(uname -aで確認)

makeで失敗する or insmodで失敗する

前者:Linuxのソースコードが入っていなかったり、パスが間違っている
後者:起動したLinuxカーネルとコンパイル時のソースでconfigが異なっていてモジュールを組み   込めない sudo付け忘れ insmodする権限がない
などの原因が考えられます。
そんなときはこちらのページへ

検索用タグ C言語 Linuxドライバ デバイスドライバ

拍手[0回]

2012/02/25 (Sat.) Comment(0) Linuxデバイスドライバ

2012
02
24

LinuxドライバでHello worldを表示

ソースコード

/* hello.c */
#include <linux/module.h> // absolutely necessary

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
    printk(KERN_INFO "[%s] Hello world\n", __func__);
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_INFO "[%s] driver unloaded.\n", __func__);
}

module_init(hello_init);
module_exit(hello_exit);

Makefile

obj-m := hello.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
※タブ注意

コマンド

以下コピペ用
make
insmod hello.ko
lsmod | grep hello
dmesg | tail -5
rmmod hello
dmesg | tail -5
※ su じゃないとダメかも

(sudo付き版)
make
sudo insmod hello.ko
lsmod | grep hello
dmesg | tail -5
sudo rmmod hello
dmesg | tail -5

実行環境 Ubuntu10.04 64bit
Linux 2.6.32-33-generic #70-Ubuntu SMP x86_64 GNU/Linux
(uname -aで確認)

makeで失敗する or insmodで失敗する

前者:Linuxのソースコードが入っていなかったり、パスが間違っている
後者:起動したLinuxカーネルとコンパイル時のソースでconfigが異なっていてモジュールを組み   込めない sudo付け忘れ insmodする権限がない
などの原因が考えられます。
そんなときはこちら(Scientific Linux用)かこちら(Ubuntu用)のページへ

検索用タグ C言語 Linuxドライバ デバイスドライバ

拍手[0回]

2012/02/24 (Fri.) Comment(0) Linuxデバイスドライバ

ブログ内検索

最新記事

カテゴリー

アーカイブ

フリーエリア





プロフィール

HN:
nex2t
年齢:
8
性別:
男性
誕生日:
2016/01/01
職業:
開発エンジニア(ソフト)
趣味:
ラグビー 犬 将棋 ラーメン サーフィン(ネット)
自己紹介:
入社2年目の組込みエンジニア
好きな言語:C言語
エディタ:emacs
シェル:zsh
ディストリ:Scientific Linux, Ubuntu
略歴
お仕事のほう
2011/3 調布にある大学卒業
2011/4~6月 研修
2011/7~12月? 10GのLANドライバをがんばる
2012/1~2012/4月? VDCPデーモンを作る
2012/5~2012/10月? genlockデーモンを作る
~(現在) 装置テストなど

趣味などのほう
~2012年4月 自由気ままに。仕事の勉強など。歯医者に時間を取られる。
2012年4月~2012年6月 機動力が増す(バイクの免許&バイク(125ccの原付をゲットする)
2012年6月~2012年8月 将棋のネットゲームを作る(引きこもる)((こころざし半ば)
2012年7月~2012年8月 通勤途中にバイクでこけて('自損)、1か月チャリ通の刑になる
2012年9月~現在(2013年3月) DDRばかりする(主にDP)

(↑2013/3/10更新)

DDRのほう
------------------------------------------
・199?年 小学校高学年。
よく遊ぶ友達内でDDRが流行る。
3rdが家にあり、家庭用マットもあったが、ゲーセンでプレイすることは皆無。
(コロコロコミックとガブリチュウを買うと小遣いがなくなるぐらいしかお金がない)
Burtyfly、DAM DARIRAMとかの誰でも聞いたことあるような曲、DEAD END、Paranoia Rebirth、AFRONOVAとかちょっと難しい曲、
BUMBLE BEE、End of the Centuryとかいい感じで印象に残っている。
GRADIUSIC CYBERが当時意味不明で難しいなと思っていた。
ハンドクラップの他にもメトロノームとかついてた気がする。
スコアとかを気にしたことはなかった。
------------------------------------------
・199?年 中学。
4thを中古で購入。半年に1回ぐらいプレイしてた?(手でやるだけ)。
ワンダ・古畑・HERO・ピンクダイナソー・オリオン・DROP OUT(当時とても速かった)とかが印象に残っている。
---------------------------------------------
・200?年 高校。
MAXを中古で買って、たまにやっていた。ゲーセンに1クレだけ踏みに行ったりしてた。
SO DEEP、天ヒー、象さん、ウィッチドクター、トワイライトゾーン、MAX300が印象に残っている。
この頃、MAX300 SPのリズム(ダンダン ダダンダ(ry)が体に染みついた模様笑。
なおMAXは友人に貸したままの模様。
------------------------------------------
・200?年 大学。
数か月に1回、ストレス発散がてら踏んでいた。確かXとかX2だった気がする。
踏むのは決まって8分でけっこう踏んだ気になる、AFRONOVA、天ヒー、象さん。
Aランクとか出せたことがなかった。
---------------------------------------------
・2012年9月 社会人 X3
コミケ準備のため引きこもっていた反動で、外出ばかりする。
ゲーセンで久々にプレイするととても楽しい(画面もきれいでパネルの反応も良い)。
今まで適当にやってきたが、少しシステムとかスコアを気にし始める。
自分のお金ということもあり、ゲーセンで千円単位でお金を使うことが自然になり、
真面目にDDRをするようになる。
------------------------------------------
・2012年12月 X3
SPしかやったことがなかったが、当時よく通ったゲーセンがDPする人が多く、
楽しそうだったので、DPをやり始める、足の裏の皮がむける。
---------------------------------------------
・2013年4月? X3終了。 DDR2013へ
X3はSP足鳳凰、DP足龍で終了。DPは足12以下の好きな曲のみフルコンができるような具合だった。
------------------------------------------
・2013年7月 ついったーで記録をつけるようになる。
8月4日 足10以下の激譜面AA埋め達成。鬼鯖初クリア
8月10日 足11以下の激譜面AA埋め達成。
8月24日 DDR2013 1000クレ行く。
9月8日 足12以下の激譜面AA埋め達成。
10月   (私用でドタバタする。)
11月2日 Skill pointが1000行く。
11月3日 岐阜のDDR大会 DPノンバー部門参加(予選通過ならず)
11月16日 DP足鳳凰。(エレクリDDPフルコン)
11月22日 足13以下の激譜面AA埋め達成。
11月24日 DP足紙さま?。(苺プリンDDPフルコン、鬼鯖810k同時だった)
Double AA Line 14になる。
現在~  足14のAA埋め、足15のA取得、足13の鳥取りを頑張り中。
------------------------------------------
(↑2013/11/28追加)

最新CM

[06/01 履歴書の書き方]

カウンター