前言

  • 本博文的相关操作均是我亲为的来,你萌在跟着做的时候,如果遇到问题可以随时留言,一起探讨。

今天主要写一写Linux内核模块编程,是我的操作系统实验课内容,如果想要看看内核系统调用编程的,看这个
https://blog.csdn.net/babybabyup/article/details/79839734

模块编程

模块编程不同于添加系统调用,不需要重新编译内核,进行起来就十分快捷啦!
模块是一个目标文件,可以完成某种独立的功能,但是自身不是一个独立的进程,不能单独运行,可以动态的载入模块,使其成为内核代码的一部分,与内核其他代码的地位完全相同,当不需要某个模块功能时,还可以卸载模块。

例:打印到日志文件的hello word

编写模块代码

我的工作路径是/helloword , 用户为root
编写helloword.c ,其内容为

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int helloword_init(void) {printk(KERN_ALERT"hello word!");//打印hello wordreturn 0;}static void helloword_exit(void)
{printk(KERN_ALERT "hello world exit\n");//清理时打印hello word exit
}module_init(helloword_init);//初始化
module_exit(helloword_exit);//清理函数
MODULE_LICENSE("GPL");//许可声明

代码讲解

  • 头文件

    1. module.h 包含了加载模块需要的函数以及符号
    2. init.h 初始化以及清理时的定义
    3. kernel.h printk等函数

前两个头文件是每个模块都必须包含的,另外,如果编写带参数的模块,还必须包含moduleparam.h .

  • 许可声明

    1. MODULE_LICENSE 声明此模块的许可证,我习惯写在最后。如果不进行声明,则会收到内核被污染kernel tainted 警告。
    2. 常见的有意义的声明:GPL, GPL v2 ,proprietary 等。
  • 初始化与清理

    1. 初始化主要完成资源申请以及模块注册。返回0表示一切OK,可以进行下一步。
    2. 清理函数没有返回值。
    3. 这两个函数必须在module_init, module_exit 定义并完成。

编译模块

编写Makefile

在与helloword.c 同一个目录下,编写Makefile,其内容为:

obj-m :=hello.o
hello-objs:=helloword.o
KDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:make -C $(KDIR) M=$(PWD) modulesclean:make -C $(KDIR) M=$(PWD) clean
  • 编译过程是:首先到内核源码目录下读取顶层的Makefile,然后返回模块源码所在目录
  • 编译得到的模块名为hello.ko
  • obj-m :=hello.o 格式必须是obj-m :=模块名
  • hello-objs:=helloword.o 格式必须是:模块名-objs:=目标文件
  • make -C $(KDIR) M=$(PWD) modules ,make -C $(KDIR) M=$(PWD) clean 两句之前为tab 键。

问题总结

  • 遇到了gcc:command not found 需要安装gcc

    截图如下

    执行命令:

    yum install gcc 

    等待完成即可

  • 重新编译时一定要

    make clean

    不然出现奇奇怪怪得问题。

最后make 成功的截图:

加载模块

执行命令

insmod hello.ko

执行成功不会有任何提示的。
如果要加载带参数的模块则

insmod 模块名 参数=value


dmesg 查看打印消息:

dmesg

已经可以看到

卸载模块

执行命令

rammed hello.ko

再次 dmesg

到这一步就OK啦,操作系统课程实验还有两个模块编程。。。写在这篇博文啦。

Linux模块编程-Linux(17)相关推荐

  1. linux高性能网络编程,Linux高性能网络编程的介绍

    Linux高性能网络编程 一.课程目标 本次课程深入讲解Linux下的socket编程,并以此为基础,着重讨论如何提高网络服务端应用的性能,通过本次课程的学习,学员将收获以下方面的成果: 熟练使用so ...

  2. 实验六 Linux进程编程,Linux系统编程实验六:进程间通信

    <Linux系统编程实验六:进程间通信>由会员分享,可在线阅读,更多相关<Linux系统编程实验六:进程间通信(10页珍藏版)>请在人人文库网上搜索. 1.实验六:进程间通信l ...

  3. Linux Linux开发 Linux高级编程 Linux文档

    今天上传了一本课本.是我们班的同学共同书写完成.还是很不错的.希望大家多多支持啊. 下载地址:http://download.csdn.net/detail/ta893115871/4368933 1 ...

  4. LINUX系统编程 LINUX 虚拟内存

    LINUX 虚拟内存 以32位操作系统为例子,因为64位系统虚拟地址过大为2^64,32位仅仅为2^32=4G更利于描述,但是原理东西都一样 这首先要从程序和进程之间的关系开始,我们一般写好一段C\C ...

  5. 红帽linux怎么编程,linux (红帽)如何安装?

    用户提问 在xp系统存在条件下如何安装linux?(装完linux后 xp linux 两个系统了,)哪位能提供 linux 安装包和安装方法? 若能成功安装linux 追加50分 ps 嵌入式为什么 ...

  6. 国嵌linux内核编程,linux内核--那些年看国嵌视频学习

    1.linux系统构成 由用户空间和内核空间构成.其中用户空间由应用程序和C库:内核空间由系统调用接口.kernel.架构代码.硬件设备平台 为什么linux系统会被划分为用户空间和内核空间?处于安全 ...

  7. [Linux C编程]Linux文件锁

    Linux C 文件锁 Linux系统中,文件上锁的函数有两个flock和fcntl ,前者主要是加建议性锁,后者既可以加建议性锁(默认)也可以加强制性锁,而且它还可以给某一记录进行上锁,即所谓的记录 ...

  8. linux图形编程,linux图形界面编程基本知识

    以前看过这篇文章,不过当时没有博客,现在又一次看到了,记下来: http://hi.baidu.com/skychen1900/blog/item/9c7b94350a5fae1290ef39fb.h ...

  9. Linux环境编程--linux中的perror、exit、_exit、wait 和 waitpid

    perror: #include<stdio.h>        #include<stdlib.h> 定义函数 void perror(const char *s);  pe ...

最新文章

  1. Visual C#弹出窗口杀手
  2. BCH两周年独立日已至,世界各地爱好者纷纷举办Meetup庆祝
  3. ping: sendto: Network is unreachable
  4. SDOI2020游记
  5. 从Oracle9i中发送电子邮件
  6. linux 环境下配置ftp服务器
  7. django模板系统(下)
  8. linux的常用操作——基于ftp的windows10和腾讯云centos操作系统之间的文件上传和下载
  9. java装箱_Java 装箱 拆箱
  10. ACM数论【乘法逆元】
  11. git无法上传大文件
  12. Python的包(Packages)
  13. 企业***网的规划及组建
  14. 舞台音效控制软件_音效精灵下载
  15. 游戏使用html签名,利用HTML5实现电子签名板文字涂鸦代码
  16. Win10—VMware15虚拟机安装教程
  17. 人脸关键点检测 face keypoint detect
  18. 403高校毕业设计选题
  19. 【论文翻译】Learning from Few Samples: A Survey 小样本学习综述
  20. 程序人生:黑帽seo新手入门基础教程

热门文章

  1. html5有关的英文文章,有关励志的英语文章
  2. 怎么选择一台优质的服务器?
  3. python发送qq消息linux_使用Python发送QQ消息
  4. 20N60-ASEMI高压N沟道MOS管20N60
  5. 汇编语言学习:精华问题解答
  6. 微信与开发者们的利益博弈:该怎样开放?
  7. react-native基本介绍
  8. SRS4 对接海康威视GB28181协议推流 RTMP、webRTC拉流
  9. JavaScript基础面试题总结01
  10. 青龙面板2.2扫码JDC更新与添加扫码弹窗公告