Chinaunix首页 | 论坛 | 博客
  • 博客访问: 380476
  • 博文数量: 94
  • 博客积分: 3421
  • 博客等级: 中校
  • 技术积分: 919
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-18 16:27
文章分类

全部博文(94)

文章存档

2015年(8)

2013年(6)

2012年(26)

2011年(8)

2010年(26)

2009年(20)

我的朋友

分类: C/C++

2011-10-10 08:54:01

一个程序编译连接后形成的地址空间是一个虚拟地址空间,但是程序最终还是要运行在物理内存中。因此,应用程序所给出的任何虚地址最终必须被转化为物理地址,所以,虚拟地址空间必须被映射到物理内存空间中,这个映射关系需要通过硬件体系结构所规定的数据结构来建立。这就是我们所说的段描述符表和页表,Linux主要通过页表来进行映射。

  于是,我们得出一个结论,如果给出的页表不同,那么CPU将某一虚拟地址空间中的地址转化成的物理地址就会不同。所以我们为每一个进程都建立其页表,将每个进程的虚拟地址空间根据自己的需要映射到物理地址空间上。既然某一时刻在某一CPU上只能有一个进程在运行,那么当进程发生切换的时候,将页表也更换为相应进程的页表,这就可以实现每个进程都有自己的虚拟地址空间而互不影响。所以,在任意时刻,对于一个CPU来说,只需要有当前进程的页表,就可以实现其虚拟地址到物理地址的转化。

  内核空间到物理内存的映射

  内核空间对所有的进程都是共享的,其中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据,不管是内核程序还是用户程序,它们被编译和连接以后,所形成的指令和符号地址都是虚地址(参见2.5节中的例子),而不是物理内存中的物理地址

  虽然内核空间占据了每个虚拟空间中的最高1GB字节,但映射到物理内存却总是从最低地址(0x00000000)开始的

如果要想运行比较高级的一些汇编调用,需要转到实模式下.
介绍一下nasmx的基本书写格式

%include '头文件地址'

entry 入口点

[section 段名]  

[section 段名]

[section 段名]

    %include是nasm里的标准宏,用来引用外部文件。entry是在nasmx里定义的一个宏,用来指定程序的入口点,提高了程序的可读 性。nasm在编译的时候提供了多种输出目标文件格式,包括微软OMF格式和win32格式。在使用“nasm -fwin32 源程 序.asm -o 目标程序.obj”命令进行编译时,nasm提供了标准的段 名:“.text”,“code”“.data”,“.bss”,“rdata”,“align”,“”段名的类型和属性是由nasm自动产生的。 “.text”或“code”把一个段定义为代码段,这个段可读并可执行,但是不能写。“.data”和“.bss”定义数据段,数据段可读可写,但不可 执行,“.data”定义为一个被初始化的数据段,“.bss”定义为一个未初始化的数据段。“align”跟上一个数字,给出段的对齐长度。最大可以指 定为64。在缺省情况下nasm设定的各段属性为:
section .text  code  align=16
section .data  data  align=4
section .bss   bss   align=4
阅读(1529) | 评论(0) | 转发(0) |
0

上一篇:虚拟地址与物理地址

下一篇:数据段

给主人留下些什么吧!~~