9099243

当前课程知识点:Linux 内核分析与应用 >  第1章 概述 >  1.5 动手实践-Linux内核模块的插入和删除 >  Video

返回《Linux 内核分析与应用》慕课在线视频课程列表

Video在线视频

Video

下一节:第1章导学--引领你进入Linux内核的大门

返回《Linux 内核分析与应用》慕课在线视频列表

Video课程教案、知识点、字幕

大家好 我们在之前陈老师的课程中 已经学习了Linux的模块机制

现在我们就来演示一下编写helloworld模块 对它进行插入和删除

在编写Linux内核模块的时候 我们首先要编写自己的.c文件

然后需要编写自己的Makefile文件

之后使用make命令来对自己的.c文件进行编译

生成.ko文件

最后的.ko文件就是我们最后所需要的模块了

我们就是对它进行插入和删除 首先我们来编写自己的.c文件

我们在日常的编程中经常会加入这个(unistd.h)头文件

这个头文件主要是对一些系统调用的

封装

在我们编写Linux内核模块的时候

我们需要添加一个头文件叫做

module.h

这个文件就支持

Linux的模块机制 是我们每次编写内核模块时都要添加的一个头文件

接下来要编写我们的入口函数

我们要加入__init宏

入口函数的名称是我们可以自己指定的

这里我们要在内核的入口函数中打印出helloworld

我们在内核模块的时候不能再使用printf函数

因为内核中并不支持printf函数 要对应的使用printk

printf和printk实际上它们的接口是完全一样的

但是printk可以指定消息的打印级别

一般printk支持八个级别

最低的一个是调试信息 最高的一个是比较重要的信息 可能会使系统崩溃的一些信息

我们可以使用尖括号指定消息打印的级别 我们在这里仅仅使用它的最简单的功能

为了不必要的错误 我们在这里加上一个换行符

接下来编写我们的出口函数

为了能直观地感受到内核模块的删除

我们在这里也打印一行信息

编写完出口函数之后 我们还需要指定一下

入口点用来引导内核写法是这样的

既然是入口点 我们就需要和入口函数保持一致

最后我们还需要声明许可证

在这里使用的是GPL

这就是一个内核模块的大致架构

首先包含module.h头文件用来支持内核的模块机制

接下来要编写入口函数和出口函数

要引导内核入口点 出口点 和许可证的声明

对文件进行保存

接下来我们编写自己的Makefile文件

首先我们需要注意的是Makefile文件

第一个字母一定要大写 这样才能保证在后面的make命令的使用中可以正确的找到Makefile文件进行编译

首先我们写的是

由于刚才的文件定义为helloworld.c

那么对应产生的目标文件就是helloworld.o

这个赋值语句的作用是

要使用目标文件

helloworld.o建立一个模块

那么最后生成的模块对应的名字就是helloworld.ko

接下来为了使我们的Makefile文件有较强的移植性 我们来规定两个路径

和一个内核版本

这里可以采取我们在日常的

shell中使用的方法

wd命令 接下来我们需要

来保存当前内核的代码版本

同样的是在

shell中使用

最后我们要指定内核的路径

我自己系统的内核的路径是在

由于我已经保存了自己的内核版本 那么我这里可以直接使用

接下来是对所有的文件进行编译

那首先要注意的是这里一定是一个Tab键

而不是空格 如果是空格的话是错误的

首先这里要写上内核路径

接下来我们要指定

编译完之后的文件放在哪个目录 在这里就放入当前的目录

最后要写上

modules来表明我们要编译的是内核模块 我们加入clean功能

同样这里也要指定内核的路径

由于我们刚才编译之后的文件都放在了当前目录 那么清空的时候也是要在当前目录来进行的

这就是我们的Makefile文件 这个文件我们可以

放在不同的目录下 只用更改我们的

文件名就可以使用

我们现在已经有了自己的.c文件和Makefile文件

我么直接可以使用make命令来进行编译

我们这里可以看到一个错误就是unistd.h

在内核模块的编写中不能再使用unistd.h这个头文件了

对应的我们要加入一些

init.h头文件

这个头文件主要支持了__init宏和__exit宏

还需要加入

kernel.h

这个就主要包含了一些常用的内核函数

这些.h文件在源代码中都是可以找到的

我自己系统的源代码存在usr文件夹下

这里我需要先使用uname命令

这里就是我自己系统的内核源代码的一些结构

我们所有的Linux中

头文件都包含在include的目录下

我们在这里呢进入include

进入linux

这里就可以看到很多的.h文件 来快速查找一下

是可以找见的 相同的方式我们来找一下kernel.h

这里也是可以找见的

这里也是可以找见的

我们来对文件进行保存

再次使用make命令

我们可以看到编译通过

已经生成了我们需要的.ko文件

但是我们并没有在终端中显示出helloworld

在这里还是要

添加上换行符

在我们编辑错的时候可以使用make clean

之后再次使用make命令来进行编译

之所以这里没有出现helloworld 是因为在内核中

内核模块打交道的方式不再是通过终端 而是要通过

proc目录下

proc是一个虚拟文件系统

它可以用于访问一些有关于内核的状态 进程的信息 我们来进入proc目录来查看一下

我们可以看到有很多的文件

这里每一个数字都代表一个进程所有的信息

而且这里可以找到

meminfo

在这个文件中保存了一些物理内存和交换空间的信息

我们在这里还可以再找到

kmsg

这个就是所有的日志信息了 各种级别的日志信息都包含在这里

那proc文件整体

所有的东西呢他们都可以使用more、less或者是cat命令来进行查看,

那我们这里查看kmsg采用的方式是使用一个命令叫做dmesg

这里我们就可以查看所有的日志信息

好 接下来我们来插入模块

首先插入内核模块需要超级用户权限

使用的命令是insmod

在这里需要加上后缀名.ko

之后可以使用

lsmod命令来查看当前系统中的模块

我们可以看到helloworld模块已经顺利地插入了

接下来就可以使用dmesg命令来打印系统的日志信息

我们可以看到helloworld已经顺利的输出了

接下来对它进行删除 使用时也要超级用户权限

在这里我们只要使用

写上它的模块名称不用再加上后缀名

删除之后来看

已经没有helloworld模块了

那我们现在来再次打印

可以看到正确打印了Goodbye

那这就是一个简单的helloworld模块的插入和删除

谢谢大家

Linux 内核分析与应用课程列表:

第1章 概述

-1.1 Linux操作系统概述

--1.1 Linux 操作系统概述

-1.2 Linux内核结构以及内核模块编程

--Video

-1.3 Linux内核源码中的双链表结构

--Video

-1.4 源码分析-内核中的哈希表

--Video

-1.5 动手实践-Linux内核模块的插入和删除

--Video

-第1章 概述--章节测验

-第1章导学--引领你进入Linux内核的大门

第2章 内存寻址

-2.1 内存管理之内存寻址

--Video

-2.2 段机制

--Video

-2.3分页机制

--Video

-2.4 动手实践-把虚拟地址转换成物理地址

--Video

-第2章 内存寻址--章节测验

-第二章导学-从零打造自己的操作系统

第3章 进程管理

-3.1 进程概述

--Video

-3.2 Linux进程创建

--Video

-3.3 Linux进程调度

--Video

-3.4 动手实践-打印进程描述符task_struct中的字段

--Video

-3.5工程实践-基于内核模块的负载监控

--Video

-第3章 进程管理--章节测验

-第三章导学-进程背后琳琅满目的宝贝到哪里挖?

第4章 内存管理

-4.1 Linux内存管理机制

--Video

-4.2 进程用户空间管理机制

--Video

-4.3 物理内存分配与回收机制(上)

--Video

-4.4 物理内存分配与回收机制(下)

--Video

-4.5 动手实践-Linux内存映射基础(上)

--Video

-4.6 动手实践-Linux内存映射实现(中)

--Video

-4.7 动手实践-Linux内存映射测试(下)

--Video

-4.8 初学者对内存管理的常见疑惑

--初学者对内存管理的常见疑惑(一)

--初学者对内存管理的常见疑惑(二)

--初学者对内存管理的常见疑惑(三)

-第4章 内存管理--章节测验

第5章 中断

-5.1 中断机制概述

--Video

-5.2 中断处理机制

--Video

-5.3 中断下半部处理机制

--Video

-5.4 时钟中断机制

--Video

-5.5 动手实践-中断上半部的代码分析及应用

--Video

-5.6 动手实践-中断下半部的代码分析及应用

--Video

-第5章 中断--章节测验

第6章 系统调用

-6.1 Linux中的各种API

--Video

-6.2 系统调用机制

--Video

-6.3 动手实践-添加系统调用(系统调用日志收集系统)

--Video

-第6章 系统调用--章节测验

第7章 内核同步

-7.1 内核同步概述

--Video

-7.2 内核同步机制

--Video

-7.3 动手实践-内核多任务并发实例(上)

--Video

-7.4 动手实践-内核多任务并发实例(下)

--Video

-第7章 内核同步--章节测验

第8章 文件系统

-8.1 虚拟文件系统的引入

--Video

-8.2 虚拟文件系统的主要数据结构

--Video

-8.3 文件系统中的各种缓存

--Video

-8.4 页高速缓存机制以及读写

--Video

-8.5 动手实践-编写一个文件系统(上)

--Video

-8.6 动手实践-编写一个文件系统(中)

--Video

-8.7 动手实践-编写一个文件系统(下)

--Video

-第8章 文件系统--章节测验

第9章 设备驱动

-9.1 设备驱动概述

--Video

-9.2 I/O空间管理

--Video

-9.3 设备驱动模型

--Video

-9.4 字符设备驱动程序简介

--Video

-9.5 块设备驱动程序简介

--Video

-9.6 动手实践-编写字符设备驱动程序

--Video

-9.7工程实践-编写块设备驱动的基础(上)

--Video

-9.8 工程实践-块设备驱动程序分析(中)

--Video

-9.9 工程实践-块设备驱动程序实现(下)

--Video

-第9章 设备驱动--章节测验

致谢与说明

-致谢与说明

--Video

直播视频:从Linux内核学习到自主操作系统研发

-从Linux内核学习到自主操作系统研发

附录:实验代码、课件以及相关素材

-各章实验代码

-《Linux内核分析与应用》课件

-《Linux操作系统原理与应用》教材课堂视频

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。