热门关键字:  ubuntu  分区  linux系统进程  Fedora  函数
当前位置 :| 主页>Linux教程>内核研究>

Linux系统可卸载内核模块完全指南

来源: 作者: 时间:2007-06-13 Tag: 点击:

 

 

  加载一个模块(常常只限于root能够使用)的命令是:

  # insmod module.o

  这个命令让系统进行了如下工作:

  加载可执行的目标文件(在这儿是module.o)

  调用 create_module这个系统调用(至于什么叫系统调用,见1.2)来分配内存.

  不能解决的引用由系统调用get_kernel_syms进行查找引用.

  在此之后系统调用init_module将会被调用用来初始化LKM->执行 int inti_module(void) 等等

  (内核符号将会在1.3节中内核符号表中解释)

  OK,到目前为止,我想我们可以写出我们第一个小的LKM来演示一下这些基本的功能是如何工作的了.

 

  #define MODULE
  #include
  int init_module(void)
  {
  printk("<1>Hello World\n");
  return 0;
  }
  void cleanup_module(void)
  {
  printk("<1>Bye, Bye");
  }

 

 

  你可能会奇怪为什么在这里我用printk(....)而不是printf(.....).在这里你要明白内核编程是完全不同于普通的用户环境下的编程的.你只能使用很有限的一些函数(见1.6)仅使用这些函数你是干不了什么的.因此,你将会学会如何使用你在用户级别中用的那么多函数来帮助你入侵内核. 耐心一些,在此之前我们必须做一点其他的.....

  上面的那个例子可以很容易的被编译:

 

  # gcc -c -O3 helloworld.c
  # insmod helloworld.o

 

 

  OK,现在我们的模块已经被加载了并且给我们打印出了那句很经典的话.现在你可以通过下面这个命令来确认你的LKM确实运行在内核级别中:

 

  # lsmod
  Module     Pages  Used by
  helloworld     1    0

 

 

  这个命令读取在 /proc/modules 的信息来告诉你当前那个模块正被加载.'Pages'

  显示的是内存的信息(这个模块占了多少内存页面).'Used by'显示了这个模块被系统

  使用的次数(引用计数).这个模块只有当这个计数为0时才可以被除去.在检查过这个以后,你可以用下面的命令卸载这个模块

  

# rmmod helloworld

 

  OK,这不过是我们朝LKMs迈出的很小的一步.我常常把这些LKMs于老的DOS TSR程序做比较,(是的,我知道他们之间有很多地方不一样),那些TSR能够常驻在内存并且截获到我们想要的中断.Microsoft's Win9x有一些类似的东西叫做VxD.关于这些程序的最有意思的一点在于他们都能够挂在一些系统的功能上,在Linux中我们称这些功能为系统调用。

 

 

  每个系统调用都有一个预定义的数字(见上表),那实际上是用来进行这些调用的.内核通过中断0x80来控制每一个系统调用.这些系统调用的数字以及任何参数都将被放入某些寄存器(eax用来放那些代表系统调用的数字,比如说)

最新评论共有 4 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册