Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1047687
  • 博文数量: 297
  • 博客积分: 11721
  • 博客等级: 上将
  • 技术积分: 3431
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-25 10:21
文章分类

全部博文(297)

文章存档

2016年(9)

2011年(71)

2010年(137)

2009年(80)

分类: LINUX

2011-07-05 17:58:13

 编译pause.s汇编程序

  [root@test1 ~]# gcc -nostdlib -o pause pause.s

  [root@test1 ~]# ./pause &

  [1] 30203

  查看PID为30203的进程映射

  [root@test1 ~]# pmap -x 30203

  30203:   ./pause

  Address   Kbytes     RSS    Anon  Locked Mode   Mapping

  00fc6000       4       -       -       - r-x--    [ anon ]

  08048000       4       -       -       - r-x--  pause

  bf860000      84       -       -       - rwx--    [ stack ]

  -------- ------- ------- ------- -------

  total kB      92       -       -       -

  这里我们看到了映射了三个段.

  pause是exec的系统调用,exec将代码映射到一个只读的页内,页地址为0x08048000.

  [ stack ]是这个进程分配最大的一块,为84KB,它是exec建立的一个栈.

  [ anon ]是anonymous映射Linux2.6中新的部分,用于在IA32上更有效地进行系统调用.

  通过pmap -d PID可以查看映射文件所处的device信息,如下

  [root@test1 ~]# pmap -d 2965

  2965:   ./pause

  Address   Kbytes Mode  Offset           Device    Mapping

  00110000       4 r-x-- 0000000000110000 000:00000   [ anon ]

  00b51000     100 r-x-- 0000000000000000 008:00001 ld-2.5.so

  00b6a000       4 r-x-- 0000000000018000 008:00001 ld-2.5.so

  00b6b000       4 rwx-- 0000000000019000 008:00001 ld-2.5.so

  00b6e000    1244 r-x-- 0000000000000000 008:00001 libc-2.5.so

  00ca5000       8 r-x-- 0000000000137000 008:00001 libc-2.5.so

  00ca7000       4 rwx-- 0000000000139000 008:00001 libc-2.5.so

  00ca8000      12 rwx-- 0000000000ca8000 000:00000   [ anon ]

  08048000       4 r-x-- 0000000000000000 008:00001 pause

  08049000       4 rw--- 0000000000000000 008:00001 pause

  b7ef9000       4 rw--- 00000000b7ef9000 000:00000   [ anon ]

  b7f0e000       4 rw--- 00000000b7f0e000 000:00000   [ anon ]

  bfb0c000      88 rw--- 00000000bfb0c000 000:00000   [ stack ]

  mapped: 1484K    writeable/private: 120K    shared: 0K

  分析

  008:00001是指主设备节点8,从设备节点1,也就是sda1设备.

  [ anon ]和[ stack ]没有设备节点.

  同样的,我们查看/proc/PID/maps也可以看到相关的进程信息.

  cat /proc/2965/maps

  00110000-00111000 r-xp 00110000 00:00 0          [vdso]

  00b51000-00b6a000 r-xp 00000000 08:01 3704501    /lib/ld-2.5.so

  00b6a000-00b6b000 r-xp 00018000 08:01 3704501    /lib/ld-2.5.so

  00b6b000-00b6c000 rwxp 00019000 08:01 3704501    /lib/ld-2.5.so

  00b6e000-00ca5000 r-xp 00000000 08:01 3704502    /lib/libc-2.5.so

  00ca5000-00ca7000 r-xp 00137000 08:01 3704502    /lib/libc-2.5.so

  00ca7000-00ca8000 rwxp 00139000 08:01 3704502    /lib/libc-2.5.so

  00ca8000-00cab000 rwxp 00ca8000 00:00 0

  08048000-08049000 r-xp 00000000 08:01 327684     /root/pause

  08049000-0804a000 rw-p 00000000 08:01 327684     /root/pause
b7ef9000-b7efa000 rw-p b7ef9000 00:00 0

  b7f0e000-b7f0f000 rw-p b7f0e000 00:00 0

  bfb0c000-bfb22000 rw-p bfb0c000 00:00 0          [stack]

  三)PAE技术

  最后我们说下PAE技术,PAE技术是Intel公司推出的,全称是Physical Address Extensions,也就是物理地址扩展.

  它有以下的特点:

  1)页面地址从20bit扩大到24bit,偏移量仍然是12bit,有效物理地址是36bit

  2)总的寻址为64GB(2的36次方)的RAM.

  3)CR3在非PAE系统上指向页目录表在PAE系统中,它指向目录指针表的基地址(目录指针表是新的页表级别,简称PDPT).

  4)在启用PAE系统时,一个物理地址映射要经过页目录指针表/页目录/页表/页表项,最后找到其物理地址.

  5)在启用PAE寻址时,虚拟地址/线性地址还是32位,物理地址为36位,虚拟地址的格式为:

  位31和30:指向PDPT中4项中的一项.

  位29-21:指向页目录中512个项中的一个.

  位20-12:指向页表中512项中的一个.

  位11-0:4KB页中的偏移量.


阅读(1272) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~