Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 代码发布 › 「Linux操作系统实验」模块编程

「Linux操作系统实验」模块编程

Eswlnk的头像
Eswlnk
2023-01-01 14:41:40
「Linux操作系统实验」模块编程-Eswlnk Blog
智能摘要 AI
本文介绍了编写、编译、加载和卸载Linux内核模块的过程。实验目标包括编写一个简单的内核模块,并掌握相关命令(如lsmod、insmod、rmmod、dmesg)。模块代码实现了基本的读写功能,支持字符设备注册和注销。实验中遇到的问题主要是模块与内核版本不匹配,通过检查版本并重新编译解决。编译过程中使用了Makefile来管理模块的构建和测试。最终成功编译并加载卸载模块,验证了其功能。

实验目的

  • 编写一个内核模块;
  • 编译该模块;
  • 加载、卸载该模块;(相关命令: lsmod,insmod,rmmod,dmesg)

实验过程

编写内核模块代码

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Robert W. Oliver II");
MODULE_DESCRIPTION("A simple example Linux module.");
MODULE_VERSION("0.01");
 #define DEVICE_NAME "lkm_example"#define EXAMPLE_MSG "Hello, World!\n"#define MSG_BUFFER_LEN 15
 /* Prototypes for device functions */static int device_open(struct inode *, struct file *);static int device_release(struct inode *, struct file *);static ssize_t device_read(struct file *, char *, size_t, loff_t *);static ssize_t device_write(struct file *, const char *, size_t, loff_t *);
 static int major_num;static int device_open_count = 0;static char msg_buffer[MSG_BUFFER_LEN];static char *msg_ptr;
 /* This structure points to all of the device functions */static struct file_operations file_ops = {
 .read = device_read,
 .write = device_write,
 .open = device_open,
 .release = device_release};
 /* When a process reads from our device, this gets called. */static ssize_t device_read(struct file *flip, char *buffer, size_t len, loff_t *offset) {
 int bytes_read = 0;
  /* If we’re at the end, loop back to the beginning */
  if (*msg_ptr == 0) {
   msg_ptr = msg_buffer;
  }
  /* Put data in the buffer */
  while (len && *msg_ptr) {
    /* Buffer is in user data, not kernel, so you can’t just reference
     * with a pointer. The function put_user handles this for us */
    put_user(*(msg_ptr++), buffer++);
    len--;
    bytes_read++;
 }
  return bytes_read;}
 /* Called when a process tries to write to our device */static ssize_t device_write(struct file *flip, const char *buffer, size_t len, loff_t *offset) {
 /* This is a read-only device */
  printk(KERN_ALERT "This operation is not supported.\n");
  return -EINVAL;}
 /* Called when a process opens our device */static int device_open(struct inode *inode, struct file *file) {
  /* If device is open, return busy */
  if (device_open_count) {
   return -EBUSY;
  }
  device_open_count++;
  try_module_get(THIS_MODULE);
  return 0;}
 /* Called when a process closes our device */static int device_release(struct inode *inode, struct file *file) {
  /* Decrement the open counter and usage count. Without this, the module would not unload. */
  device_open_count--;
  module_put(THIS_MODULE);
  return 0;}
 static int __init lkm_example_init(void) {
  /* Fill buffer with our message */
  strncpy(msg_buffer, EXAMPLE_MSG, MSG_BUFFER_LEN);
  /* Set the msg_ptr to the buffer */
  msg_ptr = msg_buffer;
  /* Try to register character device */
  major_num = register_chrdev(0, "lkm_example", &file_ops);
  if (major_num < 0) {
   printk(KERN_ALERT "Could not register device: %d\n", major_num);
   return major_num;
  } else {
   printk(KERN_INFO "lkm_example module loaded with device major number %d\n", major_num);
   return 0;
  }}
 static void __exit lkm_example_exit(void) {
  /* Remember — we have to clean up after ourselves. Unregister the character device. */
  unregister_chrdev(major_num, DEVICE_NAME);
  printk(KERN_INFO "Goodbye, World!\n");}
 /* Register module functions */
module_init(lkm_example_init);
module_exit(lkm_example_exit);

问题与解决办法

Disagrees about version of symbol symbol_name after insmod

此处问题出现原因是linux模块与内核版本不同,通过modinfo和uname -a 比对后选择相同的linux模块,重新编译即可

「Linux操作系统实验」模块编程-Eswlnk Blog

编译

安装开发工具集合:

sudo apt-get install build-essential linux-headers-`uname -r`

编写Makefile

obj-m += lkm_example.o
all:
	make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean
test:
  # We put a — in front of the rmmod command to tell make to ignore
  # an error in case the module isn’t loaded.
	sudo rmmod lkm_example
  # Clear the kernel log without echo
	sudo dmesg -C
  # Insert the module
	sudo insmod lkm_example.ko
	dmesg

编译模块

Sudo make
Sudo make test

执行成功后回显:

「Linux操作系统实验」模块编程-Eswlnk Blog

成功加载卸载模块

Lsmod | grep “lkm_example”

列出加载模块

「Linux操作系统实验」模块编程-Eswlnk Blog
本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
声明:本站原创文章文字版权归本站所有,转载务必注明作者和出处;本站转载文章仅仅代表原作者观点,不代表本站立场,图文版权归原作者所有。如有侵权,请联系我们删除。
inodelinux系统static
0
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
「教程分享」如何通过预加载 (Preload) 关键资源以提高网站加载速度
上一篇
「原创代码」Python获取酷狗音乐直链
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「日志记录」逆向必应翻译网页版API实现免费调用
  • 「代码分享」第三方平台VIP视频解析API接口
  • 「至臻原创」某系统网站登录功能监测
  • 「开发日志」在Vue3中如何为路由Query参数标注类型
  • 「其他分享」分享一个在Tun模式下可用的脚本
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

「代码分享」第三方平台VIP视频解析API接口
2025-01-23 2:56:34
Go语言错误处理为什么更推荐使用pkg/errors 三方库?
2022-06-27 13:39:45
通用网盘下载链接检测_Serverless云函数应用
2022-05-08 16:16:39

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.461 秒   |  SQL查询 45 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈