网络安全参考 | UNIX参考 | GPS参考 | 无线参考 | 在线手册 | OSBUG.ORG | SUNNY-NETWORK.COM
天线制作 GPS 地标
网站地图 RSS订阅
高级搜索 收藏本站
Home | 业界动态 | Open source | GNU | Linux | BSD | Solaris | AIX | HP-UX | IRIX | Mac OS X | Minix | Tru64 | SCO UNIX | Network | Security | X-Window | Database | 应用服务 | Programming | 经典著作 | 永远的纪念 | 杂项
 当前位置: Home > Linux > 内核 > 文章  
利用异常表处理Linux内核态缺页异常
文章来源: 天极博客 文章作者: 发布时间: 2006-10-23   字体: [ ]  
 

  异常表的实现机制

  笔者取include/asm-i386/uaccess.h中的宏定义__copy_user编写了一段程序作为例子加以讲解。

/* hello.c */

#include
#include

#define __copy_user(to,from,size) do
{ int __d0, __d1; __asm__ __volatile__
( "0: rep; movsl\n" " movl %3,%0\n" "1: rep; movsb\n"
 "2:\n" ".section .fixup,\"ax\"\n"
"3: lea 0(%3,%0,4),%0\n" " jmp 2b\n"
".previous\n" ".section __ex_table,\"a\"\n"
 " .align 4\n"
 " .long 0b,3b\n" " .long 1b,2b\n"
 ".previous" : "=&c"(size), "=&D" (__d0),
"=&S" (__d1) : "r"(size & 3), "0"(size / 4), "1"(to),
 "2"(from) : "memory"); } while (0)

int main(void)
{
  const char *string = "Hello, world!";
  char buf[20];
  unsigned long n, m;

  m = n = strlen(string);
  __copy_user(buf, string, n);
  buf[m] = '\0';
  printf("%s\n", buf);
  exit(0);
}

  先看看本程序的执行结果:

$ gcc hello.c -o hello
$ ./hello
Hello, world!

  显然,这就是一个简单的"hello world"程序,那为什么要写得这么复杂呢?程序中的一大段汇编代码在内核中才能体现出其价值,笔者将其加入到上面的程序中,是为了后面的分析而准备的。

  系统在核心态运行的时候,参数是通过寄存器来传递的,由于寄存器所能够传递的信息有限,所以传递的参数大多数是指针。要使用指针所指向的更大块的数据,就需要将用户空间的数据拷贝到系统空间来。上面的__copy_user在内核中正是扮演着这样的一个拷贝数据的角色,当然,内核中这样的宏定义还很多,笔者也只是取其中的一个来讲解,读者如果感兴趣的话可以看完本文以后自行学习。

  如果读者对于简单的嵌入式汇编还不是很了解的话,可以参考《Linux内核源代码情景分析》一书。下面我们将程序编译成汇编程序来加以分析:

 
推荐文章
·浅谈关于Linux系统内核的源代码
·打造适合自己Slackware机器的内
·自己动手做一个最小的Linux kern
·一个Linux爱好者的2.6.11内核编
·定制Linux系统内核,发挥Linux潜
·如何编译一个操作系统内核-Ubunt
·重新编译Linux操作系统的内核指
·快速编译Linux内核需要的模块方
·编译内核以使其支持PS并口改装手
·编译支持NTFS的Linux系统内核模
·配置、编译Linux系统内核的实用
·Linux操作系统的内核编译详细步
·Linux操作系统的内核编译内幕详
·Linux基础知识:内核编译-内核管
 

 
↑返回顶部   打印本页   关闭窗口↓  

Google
 
Web oldhand.org unixreference.net meshmea.org
相关分类
热点文章
·Linux中的Ramdisk与Init
·Linux 初始 RAM 磁盘(i
·一个Linux爱好者的2.6.1
·自己动手做一个最小的Li
·如何在Linux系统中添加
·如何编译一个操作系统内
·udev轻松上路
·Linux2.6内核驱动移植
相关文章
·教你怎样隐藏Linux 2.6
·Linux 2.6新内核的设计
·技术奇迹--Linux内核2.6
·Linux下用明智的账户管
·让arm-linux支持普通USB
·通过Linux系统伪装方法
·分析Linux操作系统内核
·如何在Linux系统中添加
更多...
 
 

Copyright(c) 2001-2009 OLDHAND ORGANIZATION, All Rights reserved.
Power by DedeCms 织梦内容管理系统