《linux内核设计与实现》实践之模块及深入

写在前面的话。

基础模块部分我已经做完了,设计到的知识点无非就是,编写模块代码,编写Makefile文件,加载模块和卸载模块部分。由于大家都写了这部分的博客,我也就不再赘述,我重点想写一下,页表模块的深入和改进。

一、编写代码

 《linux内核设计与实现》实践之模块及深入

《linux内核设计与实现》实践之模块及深入《linux内核设计与实现》实践之模块及深入

 

二、编写Makefile文件

《linux内核设计与实现》实践之模块及深入

 

三、加载模块,尝试运行

查看gedit进程号可知为pid = 18968

《linux内核设计与实现》实践之模块及深入

 

查看gedit的起始地址0x0804880c 

《linux内核设计与实现》实践之模块及深入

 

转化为10进制数为134514700,即va = 134514700

《linux内核设计与实现》实践之模块及深入

 

《linux内核设计与实现》实践之模块及深入

出现问题

《linux内核设计与实现》实践之模块及深入

原因是没有在root权限下加载。

解决:

首先要写在之前的加载失败的模块scn(虽然失败,但是已经加载)

接着在root权限下重新加载。

《linux内核设计与实现》实践之模块及深入

检查是否加载成功

《linux内核设计与实现》实践之模块及深入

Tail查看相关信息,出现错误

《linux内核设计与实现》实践之模块及深入

错误原因是,我在解决第一个问题的时候,把gedit scn.c进程关闭了,所以pid号发生了改变。

解决方法:重新做一遍,先卸载scn模块。

为了方便起见,我之后的实验都在root权限下做。

《linux内核设计与实现》实践之模块及深入

Pid = 20101

《linux内核设计与实现》实践之模块及深入

edit的起始地址0x0804880c ,发现没有改变,即va = 134514700

结果还是失败了,所以我准备换一个进程看看是什么情况,这次用firefox

《linux内核设计与实现》实践之模块及深入

 

但是,我发现firefox并不是一个可执行文件,并不能反汇编,所以我还是回到了最初的起点。。。。。。。

《linux内核设计与实现》实践之模块及深入

这一次成功加载。

查看模块运行信息。

《linux内核设计与实现》实践之模块及深入

可以看到上一次失败的运行信息。

这一次的失败原因是

Va的值找的不对,应该看得是init处的起始地址,我找的是init@@Base处的起始地址。

 

 

在尝试多种修改后,还是不能解决问题。我又重新看了一遍原理。

由于一直失败,我猜测可能是我参考的学姐的代码并不适用于我的虚拟机,我仔细研究了一下原理后,发现可能是我的虚拟机虽然是32位,但是是可以进行地址扩展的。所以,不能只用页全局目录(Page Global Directory)、 页表(Page Table)两种页表就可以,还要加上页上级目录(Page Upper Directory)、页中间目录(Page Middle Directory)。所以修改后的源代码如下图所示。

《linux内核设计与实现》实践之模块及深入


因为makefile文件,已经写好了,就不需要更改了,直接make就可以了。可以成功生成5315.ko文件。

接下来就是加载模块了,我们需要获得pid的信息。

《linux内核设计与实现》实践之模块及深入

由上图知Pid = 24268

接着查看va的值,发现va的值不变,所以可以直接加载模块。成功加载后,查看相关信息。

《linux内核设计与实现》实践之模块及深入

使用dmesg命令查看详细信息的结果如下图所示。

《linux内核设计与实现》实践之模块及深入

发现结果是一致的,所以说明我们编写的模块功能可以正常实现。

 

下面尝试新的做法。

未完待续。。。。。。

 

相关文章:

  • 2022-01-02
  • 2021-06-11
  • 2021-07-11
  • 2021-05-03
  • 2021-06-29
  • 2021-08-27
  • 2022-01-20
  • 2021-05-31
猜你喜欢
  • 2022-03-09
  • 2021-08-01
  • 2021-07-21
  • 2021-12-04
  • 2022-02-10
  • 2021-11-23
相关资源
相似解决方案