1.什么是内核模块

这对于初学者无非是个非常难以理解的概念。内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。
总之,模块是一个为内核(从某种意义上来说,内核也是一个模块)或其他内核模块提供使用功能的代码块。

2.编写一个简单的内核模块

2.1程序清单

#include #include #include static int lkp_init(void)
{
printk("<1>Hello,WOrld! from the kernel space...\n");
return 0;
}
static void lkp_cleanup(void)
{
printk("<1>Goodbye,World! leaving kernel space...\n");
}
module_init(lkp_init);
module_exit(lkp_cleanup);
MODULE_LICENSE("GPL");

2.2详细说明
2.3编译模块

#Makefile
obj-m := hellomod.o
CURRENT_PATH := $(shell pwd)
LINUX_KERNEL := $(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

用make命令运行Makefile,结果如下:

2.4运行代码

编译好模块之后,就可以把新的模块插入到内核中,具体命令
insmod hellomod.ko
注意:这句命令需要在超级用户模式下运行
此时可以使用 lsmod 命令,查看模块是否正确插入到内核
另外,在源代码清单中,我们使用了 printk()来进行内核模块的输出,printk()函数默认打印系统文件 /var/log/message的内容,要打印日志文件的最后10行,采用以下命令
tail /var/log/meaasge
可以看到,最后一行是printk()函数的内容
移除内核模块的命令为
rmmod hellomod
利用上文所提到的命令查看日志文件,得到退出内核模块所显示的信息

3.出错及解决方案

在此次编译过程中,主要遇到了以下几个问题

问题一

按照课本上的Makefile编写,运行出错,错误信息如图所示,课本原有Makefile代码中有这样一行
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
此处是Linux内核源代码的绝对路径,不同版本号,路径有所不同,所以我们对代码进行修正,只需要把自己的内核源码绝对路径写进去即可
LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL)
这样进行编译就不会出错

问题二

内核模块无法正确插入
检查Makefile文件
注意  Makefile的格式要求非常严格
obj-m := hellomod.o 这句 obj和-m之间没有空格,并且:和=之间也没有空格
修改后即可完成整个流程操作

编写简单的内核模块——Linux操作系统原理与应用(陈莉君第2版13页)相关推荐

  1. Linux 操作系统原理 — 内存 — 内存分配算法

    目录 文章目录 目录 前文列表 内存碎片 伙伴(Buddy)分配算法 Slab 算法 虚拟内存的分配 内核态内存分配 vmalloc 函数 kmalloc 用户态内存分配 malloc 申请内存 用户 ...

  2. Linux 操作系统原理 — 内存 — 页式管理、段式管理与段页式管理

    目录 文章目录 目录 前文列表 页式管理 快表 多级页表 基于页表的虚实地址转换原理 应用 TLB 快表提升虚实地址转换速度 页式虚拟存储器工作的全过程 缺页中断 为什么 Linux 默认页大小是 4 ...

  3. Linux 操作系统原理 — 内存 — 基于 MMU 硬件单元的虚/实地址映射技术

    目录 文章目录 目录 前文列表 物理地址与虚拟地址 内存空间的组织方式 虚拟地址空间的编址 内核态地址空间 用户态地址空间 内-外存空间的交换与虚拟存储空间之间的映射关系 缺页异常 前文列表 < ...

  4. Linux 操作系统原理 — 系统结构

    目录 文章目录 目录 Linux 系统架构 Linux 内核 内存管理 进程管理 文件系统 设备驱动程序 网络接口 Shell Linux 系统架构 Linux 系统一般有 4 个主要部分:内核.Sh ...

  5. Linux 操作系统原理 — 内存 — 基于局部性原理实现的内/外存交换技术

    目录 文章目录 目录 前文列表 基于局部性原理实现的内-外存交换技术 局部性原理 Swap 交换分区 前文列表 <Linux 操作系统原理 - 内存 - 物理存储器与虚拟存储器> < ...

  6. linux的原理和运用,Linux操作系统原理与应用_内存寻址

    原标题:Linux操作系统原理与应用_内存寻址 第五讲今天上线啦. 在本次课程中,陈老师详细的讲解了有关于内存寻址的演变的相关知识. 第一部分中,介绍了关于内存寻址的相关背景知识.内存寻址-操作系统设 ...

  7. linux操作系统原理_Linux系统从新手到运维老鸟学习指南

    Linux是在1990年底到1991年由芬兰大学的学生LinusTorvalds利用Minix操作系统作为开发平台编写了内核,目前由世界各地的爱好者共同开发和维护的与UNIX兼容的操作系统,也是自由和 ...

  8. Linux操作系统原理与应用03:进程

    目录 1. 进程简介 1.1 程序和进程 1.2 进程的定义 1.2.1 正文段 1.2.2 用户数据段 1.2.3 系统数据段 1.3 进程的层次结构 1.3.1 进程的亲缘关系 1.3.2 进程树 ...

  9. Linux操作系统原理与应用01:概述

    目录 1. Linux内核的技术特点 1.1 单内核结构 1.1.1 单内核特性 1.1.2 微内核特性 1.2 抢占式内核 1.2.1 非抢占式内核特性 1.2.2 抢占式内核特性 1.3 支持动态 ...

  10. Linux 操作系统原理 — 内核态与用户态

    目录 文章目录 目录 Linux 的内核态与用户态 系统调用(System Call) Shell 用户态和内核态的切换 进程的用户空间和内核空间的内存布局 内核空间 用户空间 Linux 的内核态与 ...

最新文章

  1. 后香农时代,华为提出10大数学挑战问题
  2. java如何绘制图表_java绘制excel图表(jxcell)
  3. 游戏服务器的架构演进
  4. Java Streams,第 4 部分: 从并发到并行
  5. #189 stat(动态规划)
  6. 数据库SQL语句学习笔记(6)-使用函数处理数据
  7. Oracle ——如何确定性能差的 SQL
  8. vs编译python好还是pycharm的好_Python学习 第3天 VS与PyCharm使用对比
  9. Yii2 理解Validator
  10. ie6+7+8等对background-color:rgba(),background-img渐变的兼容
  11. java数据校验博客_springmvc教程:利用Validation进行参数校验
  12. Android Multimedia框架总结(二十二)MediaCodec中C++中创建到start过程及状态变换
  13. Atitit .c#的未来新特性计划草案
  14. .Net Core 使用swagger UI
  15. 重装系统后小喇叭显示未安装音频输出设备
  16. vue 使用 vue-awesome-swiper(swiper)解决方法
  17. 【路径规划】基于粒子群算法实现机器人栅格地图路径规划matlab源码
  18. Snaker工作流学习(二)
  19. android模拟器不玩游戏,安卓模拟器哪个玩游戏最流畅?
  20. 计算10光年是多少米java_1光年是多少米,9.46×10^15米(最快的火箭需飞108000年)...

热门文章

  1. HttpClient请求https类型的网站接口碰到ssl证书不受信任问题处理
  2. 我承认我不曾历经沧桑 (蒋方舟)
  3. 年轻人逃离算法?更懂你的时尚推荐算法,你会拒绝吗?| FashionHack 专栏
  4. Github Actions生成 secrets
  5. Android 源码编译详解【一】:服务器硬件配置及机型推荐-2016/06
  6. D3.入门教程——简介和安装
  7. dedecms5.7(织梦)源码解析之程序安装补全篇
  8. 7-11 电话聊天狂人 (25分)
  9. HTML5 新特性: Web Worker 的创建与使用(webpack + TS 环境)
  10. 计算机中URL是指什么 ?