ldd_hello_world

笔记

linux2.6之后将模块的后缀改为.ko,与.o相区分。同时在.ko中增加了.modinfo段,可以使用modinfo命令查看;

modinfo hello_world.ko

关于makefile,建议先阅读文档:linux/Documentation/kbuild/makefiles.txt

makefile:
#目标obj-m,将目标编译为模块
obj-m := hello_world.o

#定位kernel source目录
KDIR := /lib/modules/$(shell uname -r)/build

#当前目录
PWD := $(shell pwd)

#default
default:
	$(MAKE) -C $(KDIR) M=$(PWD) modules

insmod与rmmod其实调用了内核中的module_initmodule_exit

linux中对设备的操作等同于对文件的操作,所有的设备文件在/dev/目录下

为了将文件与驱动链接起来,使用major number和minor number,major number用于linux kernel将驱动与驱动文件相连。 minor number 供驱动程序内部使用。

设备文件创建: mknod /dev/memory c 60 0
c:字符设备
60: major number
0: minor number

在驱动程序中,使用register_chrdev注册设备。
result = register_chrdev(memory_major, "memory", &memory_fops);

注销
result = unregister_chrdev(memory_major, "memory", &memory_fops);

modules 可以使用module_param()宏将参数声明为全局变量,可以通过命令行可这个变量赋值,达到命令行传参的目的。

如果内核模块由多个源文件组成,目标文件的编译与之前相同:
obj-m := modules.o

但是需要使用$(<module_name>-y)指出其他所需文件:
modules-y := 1.o 2.o 3.o

make -C <linux_kernel_src_path> M=$PWD [target]

kbuild 通过 M=$PWD 了解这是在编译一个外部模块。 默认将要编译的模块存在于当前目录,因此[target]不必特别指出,同时所有的输出文件也都会在当前目录中创建。不要尝试更新内核源码,使用make成功编译内核是成功编译模块的前提。

posted @ 2017-05-26 14:39  tanggc  阅读(185)  评论(0编辑  收藏  举报