操作系统实验-添加一个内核模块

这篇具有很好参考价值的文章主要介绍了操作系统实验-添加一个内核模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考用书:《操作系统实践:基于Linux的应用与内核编程》

一.添加一个内核模块

1.1需求分析

对于一个应用程序而言,源代码经编译后与标准运行库链接,通过系统调用执行操作系统内核中的特权指令,指令返回的结果通过系统调用返回给用户,完成程序。

由于Linux是单内核多模块的操作系统,整个操作系统只包含一个由多个不同功能模块组成的内核,通过Linux系统的这种特性,可以动态添加自己编写的内核模块,并由系统每次启动时进行加载。

通过内核模块的动态添加和删除,可以直观的感受到内核模块的编写以及动态添加和删除的过程。可以通过此次实验理解用户态(User Model)和内核态(Kernel Model)的关系。并掌握内核模块代码中的一些常见宏和参数以及内核模块程序和应用程序的差异。

实验流程为:编写kello.c文件和Makefile文件,并使用insmod和rmmmod命令对内核模块进行安装和卸载。观察终端输出的不同信息。同时编写代码时应注意安全问题,不要对内核进行不当访问从而使系统出现错误。

输入:使用insmod安装所编写的内核模块。

输出:通过dmesg命令观察安装内核模块和卸载内核模块所输出的信息。

1.2概要设计

本次实验包含两个文件:kello.c和编译所需的Makefile文件,kello.c文件包含模块初始化函数hello_init,在模块初始化时被调用,以及模块回收函数hello_exit,在模块被撤销时使用。

在该文件的最后,需要添加两行声明module_init(hello_init)和module_exit(hello_exit),使模块被更高效的加载执行和撤销,加快内存的分配和回收

对于Makefile文件内容,KERNELRELEASE定义在linux内核源代码中的顶层makefile,boj-m表示所安装内核模块的名称,需要和c文件名字相同。

KDIR和PWD目录分别代表内核的源代码目录和当前的工作路径,defult中为编译命令以及一些文件的删除命令。

1.3详细设计

Kello.c的hello_init调用printk输出一段初始化信息,hello_exit调用printk输出模块回收时打印的信息。

对于Makefile文件,KERNELRELEASE是在Linux内核源代码顶层Makelile中定义的一个变量,在第一次读取执行此 Makefile文件时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。

如果make的目标是clean. 直接执行clean操作,然后结束。

当没有声明make的目标时,make执行默认操作,即default 后的指令,此时-C$ (KDIR)指明跳转到内核源代码目录下读取那里的Makefiles SUBDIRS $ (PWD) 表明需要返回到当前目录继续读入并执行当前的Makefile.当从内核源代码目录返回时, KERNELRELEASE已被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。

实验过程:

在当前文件夹下执行make命令

linux添加内核模块,操作系统课程实验,linux

观察当前文件夹是否生成所需文件

linux添加内核模块,操作系统课程实验,linux

sudo insmod 安装LKM

linux添加内核模块,操作系统课程实验,linux

观察安装LKM后dmesg输出的内核初始化信息

linux添加内核模块,操作系统课程实验,linux

sudo rmmod 卸载LKM

linux添加内核模块,操作系统课程实验,linux

观察卸载LKM后dmesg输出的内核初始化和撤销信息

linux添加内核模块,操作系统课程实验,linux

1.4调试分析

分析一:make命令提示空变量名错误

linux添加内核模块,操作系统课程实验,linux

首先遇到的错误为,make命令报告空变量名。是make文件的格式问题,注意在$(MAKE) -C $(KDIR) SUBDIRS =$(shell pwd) modules,SUBDIRS的后没有空格,去掉空格后问题解决。

分析二:mkdir创建目录权限不够

linux添加内核模块,操作系统课程实验,linux
linux添加内核模块,操作系统课程实验,linux

mkdir创建目录权限不够,错误定位在fixdep.c文件的404行,fatal error打开依赖文件的权限不够,并显示compilation terminated(编译结束)。

fixdep.c文件是make的一个工具,由make在编译时调用。问题出在make -C SUBDIRS=处,应修改为make -C M=。二者的区别在于,$(MAKE)相当于make,-C 选项的作用是指将当前工作目录转移到所指定的位置。“M=”表示当用户需要以某个内核为基础编译一个外部模块的话,需要在make modules 命令中加入“M=dir”,程序会到所指定的dir目录中查找模块源码,将其编译,生成.ko文件。

M并非随意命名,在新的内核模块编程中的make命令中有个M选项,是makefile脚本中的一个变量,$(MAKE) -C $(KDIR) M=$(PWD)与$(MAKE) -C $(KDIR) SUBDIRS =$(PWD)的作用是一样的,不过SUBDIRS是过时的使用方法,修改后问题得以解决。

linux添加内核模块,操作系统课程实验,linux

make文件和c文件如下:文章来源地址https://www.toymoban.com/news/detail-744832.html

ifneq ($(KERNELRELEASE),)
obj-m := kello.o
else 
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
    $(MAKE) -C $(KDIR) M=$(shell pwd) modules
    rm -r -f .tmp_versions *.mod.c .*.cmd *.o *.symvers
endif

到了这里,关于操作系统实验-添加一个内核模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux操作系统(二):操作系统结构与内核设计

     在(一)详解CPU中介绍了操作系统所基于的硬件CPU后,本部分学习操作系统的架构。在计算机系统中,操作系统的架构通常包括以下几个主要组件: 内核(Kernel) 进程管理(Process Management) 内存管理(Memory Management) 文件系统管理(File System Management) 设备管理(Device

    2024年02月13日
    浏览(44)
  • linux内核:笔记1-内核和操作系统的关系

    参考鸣谢: 1.操作系统内核就是在开机的时候直接加载到内存中的第一道程序 2.是硬件和用户程序的桥梁纽带,向上管理用户程序,向下调度硬件设备 3.进程调度:调度cpu,分配时间片给进程,同时也负责销毁进程 4.内存管理:生成和销毁内存 5.文件管理: 使用文件系统组织

    2024年02月04日
    浏览(50)
  • 探索操作系统:内核、启动和系统调用的奥秘

    首先,对于有科班背景的读者,可以跳过本系列文章。这些文章的主要目的是通过简单易懂的汇总,帮助非科班出身的读者理解底层知识,进一步了解为什么在面试中会涉及这些底层问题。否则,某些概念将始终无法理解。这些计算机基础文章将为你打通知识的任督二脉,祝

    2024年02月11日
    浏览(56)
  • linux查看系统版本、内核信息、操作系统类型版本

    1. 使用 `uname` 命令:这将显示完整的内核版本信息,包括内核版本号、主机名、操作系统类型等。 2. 使用 `lsb_release` 命令(仅适用于支持 LSB(Linux Standard Base)的发行版):这将显示包含发行版名称、版本号和其他详细信息的 Linux 发行版信息。  3. 使用 `/etc/os-release` 文件:

    2024年02月08日
    浏览(70)
  • 操作系统的体系结构、内核、虚拟机

    🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 内核是操作系统最基本、最核心的部分 实现操作系统内核功能的那些程序就是 内核程序 与硬件关系较紧密的模块: 时钟管理:实现计时功能 中断处理:负

    2024年02月12日
    浏览(42)
  • 操作系统权限提升(三)之Windows系统内核溢出漏洞提权

    系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 注:阅读本编文章前,请先阅读系列文章,以免造成看不懂的情况!!! 溢出提权是指攻击者利用系统本身或系统中软件的漏洞来获取 Windows操作系统System权限,其中溢出,提权

    2024年02月14日
    浏览(37)
  • 【项目分析】仿linux0.11的操作系统内核

    系列综述: 💞目的:本系列是个人整理为了 秋招面试 的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于 《操作系统 真象还原》及各大佬博客 进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验

    2024年02月09日
    浏览(42)
  • 操作系统权限提升(十八)之Linux提权-内核提权

    内核提权是利用Linux内核的漏洞进行提权的,内核漏洞进行提权一般包括三个环节: 1、对目标系统进行信息收集,获取到系统内核信息及版本信息; 2、根据内核版本获取其对应的漏洞以及EXP 3、使用找到的EXP对目标系统发起攻击,完成提权操作 查看Linux操作系统的内核版本

    2024年01月16日
    浏览(46)
  • 简易操作系统:使用Python 做的图形界面 C 做的内核

    目录 实验要求 一、文件管理和用户接口 ⑴文件的逻辑结构 ⑵磁盘模拟 ⑶目录结构 ⑷磁盘分配 ⑸磁盘空闲存储空间管理 ⑹用户接口 ⑺屏幕显示  代码部分         python调用c的方法: ​编辑 c语言部分,文件名 Operating_System_C.c python语言部分 运行实例:    文件管理和用户

    2024年02月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包