linux驱动模块编写规范以及Makefiel文件的编写规范

内核驱动模块的编写规范

驱动模块一般涉及的必用的头文件:

<linux/init.h>
<linux/module.h>
<linux/kernel.h>

驱动模块的入口函数的规范:

int __init entry_name(void)
{
/*xxx*/

return 0;
}

module_init(entry_name);

驱动模块的出口函数规范:

void __exit exit_name(void)
{

}

module_exit(exit_name);

模块的信息的声明:

MODULE_LICENSE("GPL"); //模块当中此行必须要写,下面三行可选
MODULE_VERSION("版本");
MODULE_AUTHOR("作者");
MODULE_DESCRIPTION("对模块的描述");

===========================================================
一个模块对应一个test.c那么,Makefile如下编写

obj-m := test.o //

KERNLE := /lib/modules/2.6.32-358.el6.i686/build/

all:
make -C $(KERNLE) M=$(shell pwd) modules
clean:
make -C $(KERNLE) M=`pwd` clean;
rm -f *.order
mymove:
mv *.ko /nfsroot/

===========================================================
一个模块对应对个.c,比如test1.c test2.c test3.c,Makefile如下

obj-m := name.o
name-objs := test1.o test2.o test3.o

KERNLE := /lib/modules/2.6.32-358.el6.i686/build/

all:
make -C $(KERNLE) M=$(shell pwd) modules
clean:
make -C $(KERNLE) M=`pwd` clean;
rm -f *.order
mymove:
mv *.ko /nfsroot/

==========================================================
如果在一个单独的目录当中,一次用一个Makefile管理编译对个.c
对应多个模块对应的.ko文件,比如,test1.c test2.c要编译生成
两个单独的模块,那么Makefile如下编写:

obj-m := test1.o test2.o

KERNLE := /lib/modules/2.6.32-358.el6.i686/build/

all:
make -C $(KERNLE) M=$(shell pwd) modules
clean:
make -C $(KERNLE) M=`pwd` clean;
rm -f *.order
mymove:
mv *.ko /nfsroot/

=========================================================
如果要在任意位置或者想智能的在插入某个模块时需要自动先插入
被依赖的模块,就是说如果想用modprobe 命令插入模块,那么
Makefile必须如下写:

obj-m := test1.o test2.o

KERNEL := /linux-millet-driver
DEST_DIR := /nfsroot/
PWD := $(shell pwd)

all:

make -C $(KERNEL) M=$(PWD) modules
install:
make -C $(KERNEL) M=$(PWD) INSTALL_MOD_PATH=$(DEST_DIR) modules_install
depmod -A

clean:

make -C $(KERNEL) M=$(PWD) clean
rm -f *.order

mycopy:
cp *.ko /nfsroot/

*************************************************************************************
与驱动模块操作有关的命令:

将当前目录下的xx.ko模块插入内核:
insmod xx.ko

将内核当中正在运行的模块xx移除:
rmmod xx

查看当前目录下的xx.ko模块的详细信息:
modinfo xx.ko

在模块已经成功安装的前提下利用此命令智能
安装驱动模块(分析依赖关系,先安装被依赖的
驱动模块):
modprobe xx

智能移除模块驱动,会将依赖的模块也移除:
modprobe -r xx

查看当前内核当中插入的驱动列表:
lsmod

时间: 2024-08-07 04:10:01

linux驱动模块编写规范以及Makefiel文件的编写规范的相关文章

linux 下C语言编程库文件处理与Makefile编写

做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一定要好好学习下如何在linux下纯手工gcc编译c项目.今天学了2点,一个是库文件处理,另一个是makefile编写. 学习的系统是centos6.6,编译升级的gcc4.8.2,明天写个博客总结下这回gcc安装的过程,每次都能学到些东西. gcc的编译过程 首先需要清楚gcc编译做了些什么 源文件

编写linux驱动所用到的头文件(转)

转自:http://blog.csdn.net/lufeiop02/article/details/6448497 关于linux驱动(应用)程序头文件使用 收藏 驱动程序: #include <linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件.#include <asm/***.h> 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件.#include <mach/***.h> 是在li

linux 驱动模块开发初体验

2020-02-09 关键字: 在嵌入式 Linux 开发中,驱动程序通常都是用 C语言 来编写的,并经编译后生成为目标文件,即 '.o' 文件.随后又可在编译系统时以两种形式打包成系统镜像文件: 1.uImage 即内核的二进制文件.这种形式是直接将内核驱动程序打包进系统文件中.这种形式的驱动程序将会在内核加载时运行,即随系统启动而运行.这种形式的驱动预置在一定程度上会影响系统的开机耗时. 2.ko 文件 即 kernel object,这种形式是将驱动程序以独立的模块文件存在于系统中.这种形

我的第一个Linux 驱动模块编程实验

2014.04.28 module 首测 1)环境:Centos release 6.5 (Final) kernel: 2.6.32-358.23.2.e16.centos.plus.i686 2)源文件及Makefile 源文件:是一个入门的Hello.c文件,网上到处可以找得到. Makefile 第一版本内容如下: obj-m := hello.o 3)make 时的命令 make -C /lib/modules/$(uname -r)/build  SUBDIRS=$PWD modul

简单的Linux 驱动模块编译,加载过程

简单的Linux 驱动模块编译,加载过程 2010-03-14 14:48:24|  分类: Driver |  标签: |字号大中小 订阅 本文记录我的第一个Linux设备驱动程序的编译过程.遇到问题的解决方法. 环境:2.4.18-14的内核,Linux内核源码:2.4.18.       Linux内核源码路径:/usr/src/linux(这个源码是从kernel.org网站download的2.4.18版本)        按照<linux设备驱动开发详解>一书中的步骤实现经典例子&

Linux中.a,.la,.o,.so文件的意义和编程实现

Linux中.a,.la,.o,.so文件的意义和编程实现    Linux下文件的类型是不依赖于其后缀名的,但一般来讲:        .o,是目标文件,相当于windows中的.obj文件        .so 为共享库,是shared object,用于动态连接的,和dll差不多        .a为静态库,是好多个.o合在一起,用于静态连接        .la为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息.可以用如下命令查看*.la文件的格式   $file

[Linux实用工具]munin-node插件配置和插件编写

前面介绍了2篇munin使用的相关文章: [Linux实用工具]Linux监控工具munin的安装和配置 [Linux实用工具]Linux监控工具munin的展示(Nginx) 这次介绍一下munin-node的插件的安装配置和插件的编写. 插件配置 munin-node本身就集成了很多的插件,只需要直接建个软链就可以了.像Nginx.Apach.mysql都是有现成的插件可以使用的. munin的插件默认保存在/etc/munin/plugins里面.进去查看会发现很多软链,软链到/usr/s

使用requireJS加载不符合AMD规范的js文件:shim的使用方式和实现原理

我们知道在javascript中定义全局变量有2种方式,本质上是等价的,都是向window对象注入属性或者方法. // global.js var g_name = "aty"; window.g_age = 25; 当global.js加载的时候,浏览器的全局对象window就会多出2个属性:g_name和g_age. 我们编写一个js工具类或者是js框架,通常有2种方式: 方式1:dateUtil.js (function(window) { var DateUtils = {};

诠释Linux中『一切都是文件』概念和相应的文件类型

在 Unix 和它衍生的比如 Linux 系统中,一切都可以看做文件.虽然它仅仅只是一个泛泛的概念,但这是事实.如果有不是文件的,那它一定是正运行的进程. 要理解这点,可以举个例子,您的根目录(/)的空间充斥着不同类型的 Linux 文件.当您创建一个文件或向系统传输一个文件时,它会在物理磁盘上占据的一些空间,而且是一个特定的格式(文件类型). 虽然 Linux 系统中文件和目录没有什么不同,但目录还有一个重要的功能,那就是有结构性的分组存储其它文件,以方便查找访问.所有的硬件组件都表示为文件,