Linux的模块驱动

  1. 接下来写个最简单的驱动程序,就像程序语言的hello world程序。
  2. 首先是:hello.c的代码:

    这是个最简单的驱动程序。就是打印hello的信息。驱动程序和我们的程序语言结果有点不大一样。驱动模块的入口是倒数第二行的module_init()的函数。驱动模块的出口是module_exit()的函数。

3.接着是makfile文件:

这也是一个很简单的Makefile文件了。Obj-m后面跟的是我们的最终目标依赖的文件hello.o。第三行的KDIR是我们编译进的内核的路径。All是执行make得到的目标,$(KDIR)指定内核的路径,就是第三行的路径。M=$(PWD)是模块存放的路径。接着就是清除生成的文件的命令。

4.make的执行过程:

从上面的执行的过程,我们可以看到makefile的执行的过程。

如果在一个工程里,当有两个.c文件的时候的编写:

Hello.c:

Function.c:

Makefile修改为:

最后编译的结果如下图:

内核模块的安装和卸载:

insmod hello.ko

卸载内核模块:

rmmod hello(卸载的时候不用加.ko)

查看模块:

lsmod

执行的结果:

注意:内核模块只有当没有用户用时才可以卸载,如上图:我们的test是没有被使用,而fuse有两个用户在使用。我们试着卸载这两个内核模块的截图:

内核模块的可选的信息:模块申明、模块参数、符号信息。

模块的申明:

MODULE_LICENSE("遵守的协议")

申明该模块遵守的许可证协议,如:"GPL"、"GPL v2"等。

MODULE_AUTHOR("作者")

申明模块的作者

MODULE_DESCRIPTION("该模块的功能描述")

MODULE_VERSION("v1.0")

申明模块的版本

模块申明可以让读者知道该模块所遵守的协议,增加模块代码的可读性。

只是一个提示,增加可读性的作用。

模块参数的传递:

在我们的应用程序中:int main(int argc,char** argv):argc表示命令行输入的参数个数,argv中保存输入端的参数。

那么我们的内核模块中是怎么传入参数的呢?:

模块参数跟我们程序语言的参数有点不大一样,除了用一般的数据类型来申明变量参数,我们还得用module_param()这个宏来指定它是模块参数:

Module_param(name,type,perm):

Name:变量的名称

Type:变量的类型,bool,int,charp。

Perm:访问权限。S_IRUGO:读权限。S_IWUSR:写权限。

例如:

Int a=33;

Char *st;

Module_param(a,int ,S_IRUGO);

Module_param(st,charp,S_IRUGO);

下面是执行的实例:

我们定义了一个a=99;然后在14行打印出来。运行的结果:

上面是执行的过程,我们也可以在执行的时候给它加参数:

字符串也是一样:

运行的结果:

最后是符号导出:

符号导出的实例:

修改Makefile:

修改function.c为:

执行的过程:

同时产生了两个.ko模块。

当我们去安装hello.ko的时候,出现了这个错误:未定义的符号:

这是因为我们程序中的extern int function();现在的系统中不存在这个函数。那是不是得先insmod function.ko呢!?

虽然系统已经出现了function函数,可是系统还是找不到。可以看出错误依然存在。

这就是模块导出的问题:当我们要去使用一个模块里面的变量,函数的时候,必须使用符号导出。也就是把变量和函数输出到我们的系统当中,使整个系统都可以使用。

修改function.c为:

用EXPORT_SYMBOL()来申明,我的function是可以被系统的其他模块使用的。不过,我们应该先编译function.ko,在编译hello.ko。结果:

这就是符号输出的使用。

总结与应用程序的区别:

内核的打印:

Printf和printk都是打印信息的。但是printk还有级别打印:

Hello.c:

输出结果:

结果只有KERN_EMERG级别的才在屏幕打印出来。这样的打印级别,我们可以控制在那些地方可以打印什么。当然,我们也可以用输入来代替级别。例如上面的"<0>",就是KERN_EMER。

转载于:https://www.cnblogs.com/FORFISH/p/5188421.html

5、Linux内核模块开发相关推荐

  1. linux 内核模块开发,Linux内核模块开发(笔记)

    Linux内核模块开发(笔记) 作者:扶凯 来源: 扶凯 时间:2011-11-21 00:21:11 人气:249 评论:0 标签: 内核 个人笔记..在不放过来都快找不到了.有空还得好好整理一下了 ...

  2. Linux内核模块开发 Slab高速缓存接口与用例

    在内核模块开发或者驱动开发中经常会使用到内存分配,常见的方式是调用 kmalloc 接口分配内存. static __always_inline void *kmalloc(size_t size, ...

  3. linux内核模块开发

    一,内核模块功能: 让内核文件(zImage或bzImage)本身并不包含某组件,而是在该  组件需要被使用的时候,动态地添加到正在运行的内核中 二,内核模块安装和卸载 加载:insmod (insm ...

  4. linux内核模块配置,如何为linux内核模块开发配置clang_complete?

    我试图让 gcc到 dump the include paths,我的 .clang_complete文件现在看起来像: -std=gnu89 -nostdinc -I/usr/src/linux-h ...

  5. linux 内核模块开发,linux内核模块开发(示例代码)

    一,内核模块功能: 让内核文件(zImage或bzImage)本身并不包含某组件,而是在该 组件需要被使用的时候,动态地添加到正在运行的内核中 二,内核模块安装和卸载 加载:insmod (insmo ...

  6. linux内核模块开发(笔记),Linux内核模块学习笔记

    ########## Makefile ########## obj-m := modname.o 编译完会有modname.ko 当前目录下必须有modname.[c/s/S]文件 obj-m的值有 ...

  7. Linux内核模块开发常用内核接口

    http://pan.baidu.com/s/1sjCqohv 转载于:https://www.cnblogs.com/pengdonglin137/p/3623827.html

  8. 国嵌linux内核编程,国嵌视频学习笔记---linux内核开发1

    一.linux内核简介 1.linux系统由两部分组成:内核空间和用户空间. 2.用户空间包括:用户应用程序和C库 3.内核空间包括:系统调用接口.内核和体系结构相关代码. 4.ARM处理器7种工作模 ...

  9. Linux内核开发_内核模块

    内核模块是什么? Linux下的内核模块类似于Windows下的DLL动态链接库技术,和我们平常所使用的一些动态链接的SDK库一样,只是调用者是内核而已,不是用户态的程序. 内核模块拥有的的权限是和用 ...

最新文章

  1. Linux 运维常用命令 find、awk、sed、grep、vi、ps、lsof、rpm
  2. 《疯狂Java讲义》11
  3. ​​​​​​​Git学习笔记与IntelliJ IDEA整合
  4. SpringBoot项目启动提示:An attempt was made to call the method org.apache.coyote.AbstractProtocol.setAccept
  5. 多源信息融合_华测导航王超:基于RTK的GNSS与多源融合定位技术和挑战
  6. 每日一题:leetcode989.数组形式的整数加法
  7. 一个简单的 js 时间对象创建
  8. mysql s.`name`_MySQL的基础操作命令
  9. 拒绝访问(Access Denied)错误的快捷诊断方法
  10. win10修改服务器IP,Win10系统更改本地连接ip地址的方法
  11. 74LS138设计一位二进制全减器
  12. Elascicsearch集群搭建
  13. 半导体随机存储器(random access memory)
  14. [09-Dec-2012] 《少年pi的奇幻之旅》 -推荐
  15. 2017CS231n李飞飞深度视觉识别笔记(二)——图像分类
  16. 华为重度渗透的欧洲,美国如何清剿?
  17. 【墙裂推荐】二维码生成器哪个好?
  18. python操作sqlite数据库
  19. MPSK通信系统的Monte Carl仿真(matlab实现,附源码)
  20. Jetson TX2零基础学习(一)——连线、刷机

热门文章

  1. netty依赖_高性能:《一遍文章带你看懂 Netty世界》
  2. 不规则图形数格子的方法_小学数学,怎么数平面图形中长方形与正方形个数
  3. vim 格式化json
  4. python使用json实现树结构_js怎样将获取json转换为树形结构
  5. python代码_自学Python之后不想去公司上班,教你如何月入10000+,听过来人说
  6. python学习详解_Python学习入门到精通:Python列表讲解
  7. html冷门标签,html 冷门
  8. matlab 若当标准型,若当标准型求解.pdf
  9. python字典的遍历方法_遍历python字典几种方法
  10. python中列表的sort方法_python中列表的sort方法使用详解