Intro

坐标成都电讯大专, 某操作系统课老师在PPT上草草写下3个内核线程API后就要求编程, 感受一下:

include/linux/kthread.h,你就看到了它全部的API,一共三个函数。

这里是代码声明,略
kthread_run()负责内核线程的创建, kthread_stop()负责结束创建的线程,参数是创建时返回的task_struct指针。 kthread_should_stop()返回should_stop标志。它用于创建的线程检查结束标志,并决定是否退出。

利用上面提到的系统调用,在Linux系统中实现一个可加载的内核模块,里面至少包含一个内核线程


我看完之后的感受

编程准备

准备一个CentOS 6.10的虚拟机, 下面是可能用得到的链接

CentOS 6.10
换源

安装完毕后给自己的账户添加root权限或者直接用root账户(并不推荐这么做)

然后更新yum源(不会的见前面的链接)

由于CentOS 6年久失修, 需要先更换yum的软件源才能使用yum来安装必要的组件

我使用的源如下

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
[base]
name=CentOS-6.10 - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos-vault/6.10/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-6#released updates
[updates]
name=CentOS-6.10 - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos-vault/6.10/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-6#additional packages that may be useful
[extras]
name=CentOS-6.10 - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos-vault/6.10/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-6#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-6.10 - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos-vault/6.10/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-6#contrib - packages by Centos Users
[contrib]
name=CentOS-6.10 - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos-vault/6.10/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-6

换源后清除缓存, 刷新缓存

sudo yum clean all
sudo yum makecache

安装一些必须品

sudo yum install gcc make
sudo yum install kernel-devel-2.6.32-754.el6.x86_64

注: 这里安装内核头文件包(也就是第二条命令)中的版本号需要使用uname -r命令来确定

开始编程

叫来ChatGPT, 生成下面的代码

my_module.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/kthread.h>static struct task_struct *my_thread;static int thread_function(void *data)
{while (!kthread_should_stop()){printk(KERN_INFO "My kernel thread is running\n");msleep(1000);  // sleep for 1 second}return 0;
}static int __init my_module_init(void)
{printk(KERN_INFO "My kernel module is loaded\n");my_thread = kthread_create(thread_function, NULL, "my_thread");if (my_thread)wake_up_process(my_thread);return 0;
}static void __exit my_module_exit(void)
{printk(KERN_INFO "My kernel module is unloaded\n");if (my_thread)kthread_stop(my_thread);
}module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple kernel module with a kernel thread");

Makefile

注意: 此处的文件名首字母一定要大写, 即一定要写成Makefile而不是makefile

# 下面一行的"my_module"需要与上面的C源文件的名字部分保持一致
obj-m += my_module.oall:make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modulesclean:make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

写完保存, 然后在项目目录下打开终端, 输入

make

使用模块

编译出来的模块文件名应该是[_a-zA-Z]\w*\.ko形式的, 比如说本教程的my_module.ko
以本教程为例, 在项目目录下打开终端并输入

sudo insmod my_module.ko

没有信息输出即为加载模块成功

然后在终端中输入

dmesg

查看加载的模块的输出, 教程中的模块开启的线程每秒钟输出一行字
同时由于教程中的模块在__init()函数中添加了输出, 第一行输出为其中设置的内容

当你不想要这个模块了的时候, 使用命令

sudo rmmod my_module.ko

没有输出即为成功
本教程中的实例由于在__exit()函数中添加了一行输出, 所以在卸载模块之后使用dmesg命令后, 最后一行输出会是该函数中设置的内容

Outro

任务乍一看很简单, 然而实际操作一堆坑. 把学生当踩雷王了

focnal 祝你: 离这种事逼越远越好

在Linux系统中实现一个可加载的内核模块相关推荐

  1. 中动态路径加载_GOT段在linux系统中实现代码动态加载的作用和其他段的说明

    上一节我们看到,当程序想调用系统函数时,在编译阶段无法确认被调用函数所在的虚拟地址.因此必须有机制让程序在运行过程中,在调用系统API的时候有办法去确定所调用的系统函数对应的入口地址,这就是代码运行时 ...

  2. linux系统中扩展一个逻辑卷,Linux 创建及扩展逻辑卷

    标签:系统 实验01    创建逻辑卷 实验目标 从两块磁盘上各取10GB组成20GB的卷组 从卷组中划分一个16GB的逻辑卷 将此逻辑卷格式化并挂载到/mbox 实验步骤 一.为新添加的两块硬盘分区 ...

  3. Linux系统下实现开机自动加载驱动模块

    在使用模块化加载驱动时,若系统内部存在同类别设备驱动,可能会出现无法加载我们添加的动态模块,比如Linux系统内置了CDC驱动,当我们使用兼容CDC和VCP驱动USB转串口芯片时,就会出现上电出现的是 ...

  4. 64位win7系统中vb工程显示加载MSCOMCTL.OCX失败

    MSCOMCTL.OCX明明已经注册成功,但还是提示加载失败,对象未注册 尝试过的方法:system32中注册,syswow64中注册,vb打sp6补丁, 修改工程文件:用记事本打开VBP文件 找到这 ...

  5. 假设Linux系统中不存在文件newfile,现要创建一个新文件newfile,以下哪个命令无法实现该功能。...

    要创建一个新文件newfile,可以使用Linux系统中的touch命令.例如: touchnewfile 这样就可以在Linux系统中创建一个名为newfile的空文件了. 如果使用的是cp命令,那 ...

  6. Linux系统中的权限详解

    我们linux服务器上有严格的权限等级,如果权限过高导致误操作会增加服务器的风险.所以对于了解linux系统中的各种权限及要给用户,服务等分配合理的权限十分重要. 一.文件基本权限 首先看下linux ...

  7. Linux系统中编译、链接的基石-ELF文件:扒开它的层层外衣,从字节码的粒度来探索

    初次见面 大家好,我是 ELF 文件,大名叫 Executable and Linkable Format. 经常在 Linux 系统中开发的小伙伴们,对于我肯定是再熟悉不过了,特别是那些需要了解编译 ...

  8. Linux系统中编译、链接的基石-ELF文件:扒开它的层层外衣,从字节码的粒度来探索...

    初次见面 大家好,我是 ELF 文件,大名叫 Executable and Linkable Format. 经常在 Linux 系统中开发的小伙伴们,对于我肯定是再熟悉不过了,特别是那些需要了解编译 ...

  9. linux给目录赋访问权限_【Linux】Linux系统中的权限详解

    我们linux服务器上有严格的权限等级,如果权限过高导致误操作会增加服务器的风险.所以对于了解linux系统中的各种权限及要给用户,服务等分配合理的权限十分重要. 一.文件基本权限 首先看下linux ...

最新文章

  1. 问题解决:错误:unable to connect to node rabbit@localhost: nodedown
  2. struts基本概念(2)
  3. 前端如何做极致的首屏渲染速度优化
  4. Git 查看帮助命令
  5. 【SPSS】软件介绍
  6. Java的System.out.println并不等于C的printf
  7. 中国移动计算机类行测题目,中国移动笔试题:行测巧用十字交叉法解题
  8. 【C语言】百行代码实现—俄罗斯方块
  9. C/C++静态代码检查工具CodeChecker(一)简介
  10. 大数据培训课(体验) Day02
  11. 最优化理论与方法1--理论基础
  12. intel edison 设置wifi自动连接
  13. CH9121串口转以太网配置调试
  14. 华为mate30是不是鸿蒙系统,这个意味着是不是鸿蒙系统?
  15. 大数据入门之分布式计算框架Spark(3) -- Spark Streaming
  16. 按某一列统计重复数据,并获取对应行数据
  17. 厨神之路八--煎炸类
  18. java基础语法试题_请问有没有java基础语法的练习题?发个链接吧!?
  19. shell-批量裁剪各个尺寸的图教程一(ImageMagick安装配置)
  20. 分享渴垂栋懈沁心烟帆新上线的网站如何在几天内优化至首页

热门文章

  1. uniapp页面显示服务器图片,uniapp实现加载图片失败显示占位图
  2. C语言俄罗斯方块(旧版本)
  3. 冯诺依曼计算机的运行原理
  4. 什么是python中的惰性评估
  5. 超简单的数据分析模板
  6. php 排行_2021热门php开发框架排行
  7. Centos7校正Linux系统时间(超详细)
  8. 同步点击/实时投屏操控IOS群控软件安装操作入门
  9. 计算机软件著作权落户加分吗,软件著作权评职称加分吗
  10. 可以把管理系统软件放到云服务器,erp软件可以放在云服务器上吗