linux駆動開発プロセスと方法
4492 ワード
方法1:駆動をカーネルに組み込む方法.最初のLinuxドライバを書くようにハンドルを教えますhttps://blog.csdn.net/morixinguan/article/details/54620088方法2:linuxのmoduleモジュールのコンパイル手順を簡単な例で説明するhttps://blog.csdn.net/yu132563/article/details/51227804
Linuxドライバは一般的にモジュールmoduleの形式でロードされ、まずドライバをモジュールの形式にコンパイルする必要がある.簡単な例だc file [cpp] view plain copy
Over of hello.c file Makefileは、
testでcとMakefileが存在するディレクトリの下でmakeを実行し、類似の出力が表示された場合
普通は次のMakefileで、
KERNELLRELEASEは、カーネルソースの最上位のMakefileで定義された変数であり、このMakefileを最初に読み込んで実行したときにKERNELLRELEASEは定義されていないため、makeはelseを実行した後の内容を読み込む.makeのターゲットがallである場合、−C(KDIR)は、カーネルソースディレクトリの下でそこのMakefileを読み出すことを示す.M=(KDI R)は、カーネルソースディレクトリの下にジャンプしてそこのM a k e f i l eを読み取ることを示す.M=(PWD)は、現在のディレクトリに戻って現在のMakefileを読み込み、実行することを示す.カーネルソースディレクトリから戻ると、KERNELLRELEASEが定義され、kbuildもkbuild構文を解析する文を起動し、makeはelseの前の内容を読み取り続けます.elseの前の内容はkbuild構文の文で、モジュールソースコード内の各ファイルの依存関係と、生成するターゲットモジュール名を示します.各カーネルの名前には、uname-rコマンドに表示される値であるバージョン番号が含まれています.以下のエラーの解決方法について:Makefile:1:*セパレータを漏らすこれは多種の情況があります:1、命令の前にtabキー2をプラスして、句読点が中国語の形の3に負けたかもしれません.例えば、上のファイル:ifneqの後ろにスペースを追加します
Linuxドライバは一般的にモジュールmoduleの形式でロードされ、まずドライバをモジュールの形式にコンパイルする必要がある.簡単な例だc file [cpp] view plain copy
#include
#include
#include
static int __init test_init(void)
{
printk("init module/n");
return 0;
}
static void __exit test_exit(void)
{
printk("exit modules/n");
}
module_init(test_init);
module_exit(test_exit);
Over of hello.c file Makefileは、
PWD = $(shell pwd)
KERNEL_SRC = /usr/src/linux-source-2.6.15/
obj-m := test.o
module-objs := test.o
all:
$(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules
clean:
rm *.ko
rm *.o
testでcとMakefileが存在するディレクトリの下でmakeを実行し、類似の出力が表示された場合
make -C /usr/src/linux-source-2.6.15/ M=/home/vmeth modules
make[1]: Entering directory `/usr/src/linux-source-2.6.15'
CC [M] /home/vmeth/hello.o
Building modules, stage 2.
MODPOST
CC /home/vmeth/hello.mod.o
LD [M] /home/vmeth/hello.ko
make[1]: Leaving directory `/usr/src/linux-source-2.6.15'
普通は次のMakefileで、
# Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are listed here.
mymodule-objs := hello.o
obj-m := hello.o
else
PWD := $(shell pwd)
KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build #KDIR Makefile
/usr/src/linux-source-2.6.15/*
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif
KERNELLRELEASEは、カーネルソースの最上位のMakefileで定義された変数であり、このMakefileを最初に読み込んで実行したときにKERNELLRELEASEは定義されていないため、makeはelseを実行した後の内容を読み込む.makeのターゲットがallである場合、−C(KDIR)は、カーネルソースディレクトリの下でそこのMakefileを読み出すことを示す.M=(KDI R)は、カーネルソースディレクトリの下にジャンプしてそこのM a k e f i l eを読み取ることを示す.M=(PWD)は、現在のディレクトリに戻って現在のMakefileを読み込み、実行することを示す.カーネルソースディレクトリから戻ると、KERNELLRELEASEが定義され、kbuildもkbuild構文を解析する文を起動し、makeはelseの前の内容を読み取り続けます.elseの前の内容はkbuild構文の文で、モジュールソースコード内の各ファイルの依存関係と、生成するターゲットモジュール名を示します.各カーネルの名前には、uname-rコマンドに表示される値であるバージョン番号が含まれています.以下のエラーの解決方法について:Makefile:1:*セパレータを漏らすこれは多種の情況があります:1、命令の前にtabキー2をプラスして、句読点が中国語の形の3に負けたかもしれません.例えば、上のファイル:ifneqの後ろにスペースを追加します