专栏首页光城(guangcity)linux驱动开发之Hello程序

linux驱动开发之Hello程序

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中,而不是终端直接输出,得查看信息,通过下面图片中命令查看!

本文分享自微信公众号 - 光城(guangcity)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何切入 Linux 内核源代码

      从前在学校,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉。毕业的时候,人家跟我说Makefile我完全不知,但是一说Make Love我就来...

    RainMark
  • Linux Makefile 生成 *.d 依赖文件及 gcc -M -MF -MP 等相关选项说明【转】

    转自:https://blog.csdn.net/qq1452008/article/details/50855810

    用户3033338
  • 浅谈 Make 命令

      代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。

    RainMark
  • make 命令【转】

    转自:https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_71/com.ibm.aix.cmds3/m...

    用户3033338
  • Writing device drivers in Linux: A brief tutorial

    “Do you pine for the nice days of Minix-1.1, when men were men and wrote their o...

    RainMark
  • Linux中的configure,make,make install到底在做些什么

    在Linux下经常要安装部署一些软件包或者工具,拿到安装包之后一看,简单,configure,make, make install即可搞定。

    二狗不要跑
  • Linux 系统下用源码包安装软件

    下载源码安装包,解压或者直接双击打开(如果有安装zip或rar等压缩/解压缩软件的话),查找相关的安装说明文件,一般是README,INSTALL这两个文件,...

    授客
  • Linux Makefile 中的陷阱【转】

    转自:https://blog.csdn.net/QQ1452008/article/details/52247944

    用户3033338
  • autoscan、aclocal、automake和autoconf区别

    扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形;

    daniulive

扫码关注云+社区

领取腾讯云代金券