01-第一个内核模块程序

从内核中最简单的驱动程序入手,描述Linux驱动开发,主要文章目录如下(持续更新中):
01 - 第一个内核模块程序
02 - 注册字符设备驱动
03 - open & close 函数的应用
04 - read & write 函数的应用
05 - ioctl 的应用
06 - ioctl LED灯硬件分析
07 - ioctl 控制LED软件实现(寄存器操作)
08 - ioctl 控制LED软件实现(库函数操作)
09 - 注册字符设备的另一种方法(常用)
10 - 一个cdev实现对多个设备的支持
11 - 四个cdev控制四个LED设备
12 - 虚拟串口驱动
13 - I2C驱动
14 - SPI协议及驱动讲解
15 - SPI Linux驱动代码实现
16 - 非阻塞型I/O
17 - 阻塞型I/O
18 - I/O多路复用之 select
19 - I/O多路复用之 poll
20 - I/O多路复用之 epoll
21 - 异步通知

代码实现

demo.c

#include <linux/module.h>

/*
	    函数名可以任意指定又带来了一个新的问题,那就是有可能和内核中的已有函数重
	名,为了避免重名而带来的重复定义问题,在函数名前加static关键字修饰,经static
	修饰的函数链接属性为内部,从而解决了上述问题。这就是几乎所有的驱动函数都要
	加static修饰的原因。
	    模块的初始化函数会且仅会被调用一次,在调用完成后,该函数不应该被再次调用,
	所以该函数的内存应该被释放掉,在函数前加__init可以达到此目的。
	    __init是把标记的函数放在ELF文件(可执行文件)的特定代码段,在模块加载这些时
	将会单独分配内存,这些函数调用成功后,模块的加载程序会释放这部分的内存空间。
	    __exit用来修饰清除函数,和__init的作用类似,但用于模块的卸载,如果模块不允
	许卸载,那么这段代码完全就不用加载。
*/
static int __init demo_init(void)
{
	printk("%s -- %s -- %d\n", __FILE__, __FUNCTION__, __LINE__);

	return 0;
}

/*
	打印文件名,函数名和行号
*/
static void __exit demo_exit(void)
{
	printk("%s -- %s -- %d\n", __FILE__, __FUNCTION__, __LINE__);
}

/* 
	模块的入口函数 
	    module_init 是一个宏,用于指定 init_module 的函数别名是 demo_init,这样在
	模块的初始化时就可用别名来定义了,module_exit同样。
*/
module_init(demo_init);

/* 模块的出口函数 */
module_exit(demo_exit);

/* 
	    GPL协议。Linux是一个开源的项目,为了使Linux在发展的过程中不成为一个闭源
	的项目,这就要求任何使用Linux源码的个人或组织在免费获得源码并可针对源码做
	任何修改和再发布的同时,必须将修改后的源码发布,这就是GPL许可证协议。
*/
MODULE_LICENSE("GPL");

Makefile

KERNELDIR ?= /home/linux/ti-processor-sdk-linux-am335x-evm-05.02.00.10/board-support/linux-4.14.79
PWD := $(shell pwd)

all:
	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERNELDIR) M=$(PWD) modules
install:
	sudo cp *.ko /tftpboot
clean:
	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERNELDIR) M=$(PWD) clean

obj-m += demo.o

解释
make -C ( K E R N E L D I R ) M = (KERNELDIR) M= (KERNELDIR)M=(PWD) modules 意思是进入到内核源码目录(由-C ( K E R N E L D I R ) 指 定 ) , 编 译 在 内 核 源 码 树 之 外 的 一 个 目 录 ( 由 M = (KERNELDIR)指定),编译在内核源码树之外的一个目录(由M= (KERNELDIR)M=(PWD)指定)中的模块(由最后的modules指定)。

测试结果

root@am335x-evm:~# insmod demo.ko 
[ 1528.365037] /mnt/share/project/01_module/demo.c -- demo_init -- 17
root@am335x-evm:~# rmmod demo.ko 
[ 1535.247237] /mnt/share/project/01_module/demo.c -- demo_exit -- 27
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值