嵌入式Linux驱动开发(一)一个简单的Linux内核模块框架
来源:互联网 发布:java中线程之间的通信 编辑:程序博客网 时间:2024/04/30 03:15
#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>static int __init mod_init(void){ return 0;}static void __exit mod_exit(void){ printk("cleanup module\n");}module_init(mod_init);module_exit(mod_exit);
一、头文件
- linux/init.h
在init.h头文件中包含了模块的初始化的宏定义 以及一些其他函数的初始化函数
参考:http://blog.csdn.net/kokodudu/article/details/17361161 - linux/kernel.h
kernel.h中包含了内核打印函数 printk函数 等
参考:http://blog.csdn.net/kokodudu/article/details/17371103 - linux/module.h
参考:http://blog.csdn.net/kokodudu/article/details/17358001
- linux/init.h
二、函数
- static int __init mod_init(void)
这个函数是函数的入口,也就是说内核在加载这个模块的时候会去调用这个函数。 - static void __exit mod_exit(void)
模块被卸载的时候会调用这个函数 - module_init(mod_init);
这个函数的作用是为内核模块指定一个入口,在加载内核模块的时候就会调用这个函数的参数对应的函数,也就说第一个函数并不是默认的函数入口,它是我们自己定义的函数的入口,使用 module_init() 这个函数来指定我们自定义的内核模块加载入口 - module_exit
作用同上,指定内核模块被卸载的时候调用的函数
- static int __init mod_init(void)
- 三、关键字
- static
在内核中的函数非常多,我们为我们自己的函数命名很可能就会和Linux其他牛人的重名,这就会导致在编译的时候会报重定义,所以我们就在这加上 staitc 关键字来修饰,来避免和其他函数重名的情况,从ANSI C的角度出发,这就会导致这个函数不能被外部文件调用,而我们知道,Linux 其实是一个宏内核,也就是说内核中的所有函数之间都是直接调用的,而我们这里这样定义会导致其他文件不能调用这个函数,那怎么办呢?其实不用担心,因为版本比较新一点的编译器已经为我们解决了这个问题,编译器在编译的时候就会帮我们处理这个问题,使得被 static 关键字修饰的函数能被外部文件调用。 - __init
这个修饰词是两个下划线加上init( _ _ init),Linux效率非常高,其中一个原因就来与它对内存的管理可以说是十分”吝啬”,static int __init mod_init(void)这个函数其实只是在加载的时候需要,在加载完成之后就没有必要让它继续占用内存了,我们可以使用 __init来修饰它,使得它在完成自己的使命后不再占用内存
- static
0 0
- 嵌入式Linux驱动开发(一)一个简单的Linux内核模块框架
- 嵌入式开发第61日(linux内核模块之设备驱动:怎么写一个简单的驱动)
- linux 设备驱动开发学习笔记(一):最简单的内核模块
- 一个最简单的Linux 2.6内核驱动模块
- 嵌入式开发第62日(linux内核模块之设备驱动:修改内核的默认输出级别)
- 嵌入式开发第63日(linux内核模块之设备驱动:模块传参)
- Linux 驱动开发之内核模块开发 (一)—— 内核模块机制基础
- Linux 驱动开发内核模块的添加
- Linux驱动部分-(一)内核模块的编写
- linux 内核模块的编译(用于驱动开发)
- 一个简单的Linux内核模块实现
- 一个简单的Linux内核模块
- 编写一个简单的linux内核模块
- linux内核驱动模块编程框架---(hello world模块)
- 嵌入式Linux设备驱动开发(一)
- 简单linux内核模块的开发
- Linux驱动开发一:简单的驱动
- linux驱动模块开发(一)
- FPDLINK中I2C通信的巧妙设计以及I2C Stretch
- php删除文件夹
- 从零开始的RxJava2.0教程(三)响应式的好处
- VM搭建nginx+tomcat负载均衡
- linux 下tomcat日志控制台乱码
- 嵌入式Linux驱动开发(一)一个简单的Linux内核模块框架
- Java学习笔记--输入/输出
- JDK8新特性:重复注解Repeating Annotations
- 为通过 ATS 检测 Tomcat 完全 TLS v1.2、完全正向加密及其结果检验
- Retrofit 2.0 超能实践(三),轻松实现多文件/图片上传/Json字符串/表单
- Fragment预加载+数据初始化
- SpringAOP的CGLIB动态代理的底层原理实现
- controller中多用户并发时候,每个用户使用完参数化中的数据不在重复使用且每个用户不使用相同参数化数据的方法
- mybatis mapper遇到问题