linux驱动开发之Hello程序

  • 2019 年 10 月 5 日
  • 筆記

linux驱动开发之Hello程序

0.说在前面

1.HelloWord

驱动模块组成

驱动模块组成

头文件(必选)

模块参数(可选)

模块功能函数(可选)

其他(可选)

模块加载函数(必选)

模块卸载函数(必选)

模块许可声明(必选)

引入头文件

#include <linux/init.h>    /* 定义了一些相关的宏 */  #include <linux/module.h>    /* 定义了模块需要的 */  

模块许可声明

MODULE_LICENSE("Dual BSD/GPL"); //BSD/GPL双重许可权  MODULE_LICENSE("Dual MPL/GPL"); //MPL/GPL双重许可权  MODULE_LICENSE("GPL"); //任一版本的GNU公共许可权  MODULE_LICENSE("GPL v2"); //GPL版本2许可权  MODULE_LICENSE("GPL and additional rights"); //GPL及其附加许可权  MODULE_LICENSE("Proprietary");  //专有许可权  

helloworld模块编写

#include <linux/init.h>    /* 定义了一些相关的宏 */  #include <linux/module.h>    /* 定义了模块需要的 */  MODULE_LICENSE("Dual BSD/GPL");    /* 指定许可证为 Dual BSD/GPL */  static int hello_init(void)  {      printk(KERN_ALERT "Hello, world!n");    /* 打印 Hello, world! */      return 0;  }  static void hello_exit(void)  {      printk(KERN_ALERT "GoodBye, cruel world!n");    /* 打印 GoodBye, cruel world! */  }  module_init(hello_init);        /* 指定模块加载函数 */  module_exit(hello_exit);        /* 指定模块卸载函数 */  

2.Makefile

编写Makefile

# 利用其内建语句  ifneq ($(KERNELRELEASE), )      KERNELDIR ?= /lib/modules/$(shell uname -r)/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  

核心代码解释

解释下面这行代码:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules  

make的语法是Make -C 内核路径 M=模块路径 modules,该语句会执行内核模块的编译!

else后面语句是将hello.o编译为hello.ko模块!如果要编译为其他名字模块,只需要修改hello名字即可!

3.编译输出

命令执行

由于printk输出直接在message中,而不是终端直接输出,得查看信息,通过下面图片中命令查看!