zoukankan      html  css  js  c++  java
  • 《linux内核设计与实现》实践之模块及深入

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

    写在前面的话。

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

    一、编写代码

     

    二、编写Makefile文件

    三、加载模块,尝试运行

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

    查看gedit的起始地址0x0804880c 

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

    出现问题

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

    解决:

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

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

    检查是否加载成功

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

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

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

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

    Pid = 20101

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

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

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

    这一次成功加载。

    查看模块运行信息。

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

    这一次的失败原因是

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

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

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


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

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

    由上图知Pid = 24268

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

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

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

    下面尝试新的做法。

    未完待续。。。。。。

  • 相关阅读:
    配置Kickstart无人值守安装centos5.9 天高地厚
    数据库是什么,它是做什么用的? 天高地厚
    Mysql主从复制 天高地厚
    android开发中eclipse里xml的自动提示
    "error: device not found" and "error:device offline"
    gentoo中emerge失效:File "/usr/bin/emerge", line 43
    android:修改preference中view属性
    gerrit上利用sshkeygen公钥
    git 基本命令介绍
    prebuilt/linuxx86/toolchain/armeabi4.4.3/bin/armeabigcc: /lib/libc.so.6: version `GLIBC_2.11' not found:解决办法
  • 原文地址:https://www.cnblogs.com/java-stx/p/5523028.html
Copyright © 2011-2022 走看看