《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命令查看详细信息的结果如下图所示。

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

下面尝试新的做法。

未完待续。。。。。。

《linux内核设计与实现》实践之模块及深入的更多相关文章

  1. linux内核设计与实现学习笔记-模块

    模块 1.概念:  如果让LINUX Kernel单独运行在一个保护区域,那么LINUX Kernel就成为了“单内核”.    LINUX Kernel是组件模式的,所谓组件模式是指:LINUX K ...

  2. 《Linux内核设计与实现》读书笔记(十七)- 设备与模块

    本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...

  3. 《Linux内核设计与实现》 第一二章学习笔记

    <Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...

  4. 《Linux内核设计与实现》学习记录一

    chapter1 Linux内核简介 前言:Unix是一个具有相似应用程序编程接口(API)并且基于相似设计理念的操作系统家族. 1.1 Unix的历史 1.Unix演化版实现了任务管理.换页机制.T ...

  5. 初探内核之《Linux内核设计与实现》笔记下

    定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...

  6. 《Linux内核设计与实现》CHAPTER17阅读梳理

    <Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...

  7. 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...

  8. 《Linux内核设计与实现》课本第十八章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第十八章自学笔记 By20135203齐岳 通过打印来调试 printk()是内核提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一 ...

  9. 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳

    <Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...

随机推荐

  1. 个人Win10 +archlinux安装笔记

    win10+archlinux 1.查看磁盘并分区并挂载1.1 分区/dev/sda1 WIN10 保留分区/dev/sda2 WIN10 ESP分区(EFI)/dev/sda3 WIN10 MSR分 ...

  2. [MongoDB]安装MongoDB

    汇总: 1. [MongoDB]安装MongoDB2. [MongoDB]Mongo基本使用:3. [MongoDB]MongoDB的优缺点及与关系型数据库的比较4. [MongoDB]MongoDB ...

  3. IOS真机测试

    学习了两天的Android开发,我感觉Android开发跟IOS开发和.NET平台下的开发有点不同,Android开发我更觉得跟web(Html)倒是有类似的地方,都是节点标签显示的,当然个人理解,感 ...

  4. sql表和字段的别名

    1. sql表和字段的别名通过关键字 AS 来指定. 2.通常,定义字段别名的 AS 关键字可以省略,但我们建议不要省略 AS 关键字.别名(alias)是 SQL 的标准语法,几乎所有的数据库系统都 ...

  5. Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)

    来源:http://www.tot.name/html/20150530/20150530102930.htm Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚 ...

  6. IOC装配Bean(注解方式)

    Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component 描述Spring框架中Bean Spring的框架中提供了与@Component注解等效的三个注解 ...

  7. SPSS回归分析结果解读【来自百度知道】

    R平方就是拟合优度指标,代表了回归平方和(方差分析表中的0.244)占总平方和(方差分析表中的0.256)的比例,也称为决定系数.你的R平方值为0.951,表示X可以解释95.1%的Y值,拟合优度很高 ...

  8. [工作中的设计模式]组合模式compnent

    一.模式解析 将对象组合成树形结构以表示“部分整体”的层次结构.组合模式使得用户对单个对象和使用具有一致性. 组合模式的要点是: 1.对象整体以树形层次结构进行展示 2.树的根节点和子节点均可以添加删 ...

  9. nginx 直接在配置文章中设置日志分割

    直接在nginx配置文件中,配置日志循环,而不需使用logrotate或配置cron任务.需要使用到$time_iso8601 内嵌变量来获取时间.$time_iso8601格式如下:2015-08- ...

  10. 【DP】HDU 1176

    HDU 1176 免费馅饼 题意:中文题目不解释. 思路:因为是从中间出发所以思路卡了许久,还在之前做了道HIHO入门的题.能想到的点,从时间思考,然后初始化1s的时候,4,5,6,的数值要特别赋值. ...