首先需要编译一份linux内核并使之运行起来,然后开始第一个驱动程序Hello World的实践。
1、新建一个目录并新建hello.c文件
参考LLD3上的代码。
注意代码中的tab键位置不要用空格代替,会出问题,具体原因还不了解。
并且tab键要调成4个空格大小,ubuntu的gedit编辑器默认是8个。
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk(KERN_ALERT "Hello, World\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, World\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
2、在同一个目录下新建Makefile
新建Makefile文件,文件名不要随意改动,据说会有问题。例如:makefile是不行的。
注意KERNELDIR := 后的路径要写自己modules目录里的相应位置。
同样需要注意tab
ifeq ($(KERNELRELEASE),)
KERNELDIR := /lib/modules/4.14.6/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
else
obj-m := hello.o
endif
3、编译测试
在hello.c这个目录中打开终端,切换到root模式,依次执行以下三条命令
make
insmod ./hello.ko
rmmod hello
如果在insmod命令后终端打印了“Hello World”,并且rmmod命令后打印了“Goodbye World”,那么这部分就结束了。如果很不幸的没有打印出来就到/var/log/kern.org里看一下。这是由于系统传递消息机制的不同,输出到了系统日志文件中。据说不同的系统文件名可能略有不同。