Linux中page cache 和 buffer的关系

在遥远的年代,Linux中只有buffer作为块设备缓存,之后的某个版本将块设备缓存全面的转用page cache这种机制来实现,而目前的内核中的buffer只是块设备上面薄薄的一层,用来减少当pagecache 中的脏页回刷时的回刷量,即只需要回刷修改过的部分而不用回刷整个页面。

动态修改进程代码段(二)

简介

上一次我们的文章讲述了一些如何动态修改进程代码段的基础内容,包括

  • 如何定位要修改的代码段的地址
  • 如何准备要修改的代码
  • 修改代码段的方式

并且用一个简单的例子说明如何在程序中进行代码段的自修改。

我们在上文的结尾处说过,自修改其实用处不大,我们举那个例子主要是为了说明原理,另外,上文使用的直接覆盖函数代码段的方式也有缺陷,具体原因我们已经在上文描述过,那么在本文中,我们将讲解更为有用的动态修改其他程序代码段的原理,并且使用跳转的方式来安置新的程序数据,最后给出一个例子, 说明它的用处和用法。

在本文中,我们主要讲解如下的点:

  • 如何使用ptrace(2)系统调用来修改其他进程代码段
  • 如何使用跳转指令来安置新的程序数据
继续阅读“动态修改进程代码段(二)”

动态修改程序代码段(一)

简介

从本篇文章开始,将陆续讲解一些关于动态修改进程的代码的话题。其中牵扯到

  • 如何定位要修改的代码地址

我们以函数为单位进行代码的修改

  • 如何准备要修改之后的代码数据
  • 修改代码段的方式

等等一系列问题。本篇文章我们先只考虑如何进程进行代码的的自修改,此时要修改的代码地址就是函数指针所指向的地址,因此不用额外叙述。我们先来讨论一下为什么要动态修改进程的代码段。

继续阅读“动态修改程序代码段(一)”

Hello Kernel Module

Linux的宏内核架构使得内核的体积越来越大,为了解决这个问题,内核使用了一种模块机制。模块作为内核的可以被动态装入与卸出的组成部分,可以在需要时动态的链接到运行中的内核中,而在不需要时又从内核中卸出。因此模块的使用大大减少了Linux内核的体积。

正因为内核模块在运行时是动态链接到当前运行的内核中的,因此模块是内核的一部分,而不是一个独立的程序,模块开发在一定意义上来说就是内核开发。

本文不就Linux内核模块的实现机制做介绍,而只是给出内核模块的完整模型描述,然后以一个具体的helloworkd模块来使读者实际感受内核模块的编写,编译和运行。

继续阅读“Hello Kernel Module”

pbuilder & cowbuilder

简介

cowbuilder 是 debian 官方提供的一个软件打包工具,它的作用是创建出一个独立的环境,
然后将 Debian 软件源码包导入这个环境中打包。这样做有很多好处,首先这将软件打包环境独立出来,
使得软件打包不会弄乱你的机器实际的运行环境,其次,这样做有助于检查软件包的依赖关系是否正确,
因为 cowbuilder 创建出的独立环境通常是一个最小化环境,此时如果写错了依赖,在 cowbuilder 打包时就立刻能发现。

cowbuilder和pbuilder的使用方式差不多,很多参数也都通用,实际上,可以把cowbuilder看成一个cow版的pbuilder

继续阅读“pbuilder & cowbuilder”