Win32基础知识5 - Win32汇编语言006
Win32基础知识5
让编程改变世界
Change the world by program
Windows的内存安排
这节课我们需要理解三个概念:
每个应用程序都有自己的4 GB的寻址空间,就算这个程序只暂 1KB的内存;
不同应用程序的线性地址空间是隔离的,尽管他们在内存中是搞在一起;
时刻要记住,DLL程序是“小三”,因此它们没有自己“私有”的空间。
本节课我们将图文并茂地来进行原理层面的分析!
虚拟内存安排:
Windows 系统一般在硬盘上建立大小为物理内存两倍左右的交换文件用作虚拟内存。 利用 80386处理器的内存分页机制,交换文件的寻址上可以很方便地作为物理内存使用。 (只需要在真正调用的时候将其读入物理内存并同时修改线性地址映射到这块内存即可)。 同样道理,反正是映射一个地址而已,所以被执行的程序也可以不必装入内存,只需要在页表中建立映射关系,真正运行到这段代码才调入内存。 众所周知,Windows 是一个分时的多任务操作系统,CPU时间(就是CPU运行的过程)被分成一个个的时间片后分配给不同程序轮流使用。 在A程序的时间片中,和这个程序执行无关的部分(B和C等其他程序的代码和数据)并不需要映射到线性地址中。 附加解析: 内存中,所有的程序都搞在一起,关系十分混乱; CPU只能看到线性地址(假的),每个程序拥有自己的线性地址(小三除外)。 [caption id="attachment_665" align="aligncenter" width="679"] 虚拟内存安排[/caption]
总结:WIN32编程中几个很重要的概念
第一点:
每个应用程序都有自己的4 GB的寻址空间。 该空间可存放操作系统、系统DLL和用户DLL的代码,它们之中有各种函数供应用程序调用。 再除去其他的一些空间,余下的是应用程序的代码、数据和可以分配的地址空间。
第二点:
不同应用程序的线性地址空间是隔离的。 虽然它们在物理内存中同时存在,但在某个程序所属的时间片中,其他应用程序的代码和数据没有被映射到可寻址的线性地址中,所以是不可访问的。 从编程的角度看,程序可以使用4 GB的寻址空间,而且这个空间是“私有”的。
第三点:
DLL程序没有自己“私有”的空间。 它们总是被映射到其他应用程序的地址空间中,当做其他应用程序的一部分运行。 原因很简单,如果它不和其他程序同属一个地址空间,应用程序该如何调用它呢?
从WIN32汇编的角度看内存寻址
如果坚持不到这句话出现的同学就因为前边Windows原理太复杂而放弃的童鞋,小甲鱼觉得很可惜…… Win32汇编中的内存访问远比DOS下的分段寻址方式简单,这是为什么呢? 因为Windows是一个多任务的操作系统,最首要的宗旨就是“稳定压倒一切”。 如果把描述符表以及页表等内容交给用户程序管理是很不安全的。 任何权限上开放引发的安全问题都是很严重的,如Windows 9x中的中断描述符表是可写的,CIH病毒可利用它将自己的权限提高到优先级0; 而Windows NT下的中断描述符表是不可写的,CIH病毒在Windows NT下就无法使用同样的方法进驻内存。 关于CIH病毒可以到鱼C论坛“资源分享”版块下载^_^ 正因为如此,Windows操作系统干脆为用户程序“安排好了一切”。 具体表现在为用户程序的代码段、数据段和堆栈段全部预定义好了段描述符。这些段的起始地址为0,限长为ffffffff,所以用它们可以直接寻址全部的4 GB地址空间。 程序开始执行的时候,CS,DS,ES和SS都已经指向了正确的描述符,在整个程序的生命周期内,程序员不必改动这些段寄存器,也不必关心它们的值究竟是多少(实际上是想改也改不了)。 所以对Win32汇编程序来说,整个源程序中竟然可以不用出现段寄存器的身影。 这在DOS汇编编程中是不可想像的。
回顾之前提出的问题:
“为什么在WIN32汇编源代码中看不到CS,DS,ES,SS等段寄存器的使用?” 答案是:并不是Win32汇编源代码用不到段寄存器,而是用户在使用中不必去关心段寄存器! [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://urlxf.qq.com/?Jfyeqe3']视频下载[/Downlink]
转载于:https://www.cnblogs.com/LoveFishC/archive/2011/08/11/3847114.html
Win32基础知识5 - Win32汇编语言006相关推荐
- Win32编程基础知识
Win32编程基础知识 尽管Windows应用程序千变万化,令人眼花缭乱,但,消息机制和窗口过程却始终它们的基础,掌握了这两项技术,也就相当于把握住了问题的关键. 如果你以前是C程序员或是MFC的忠实 ...
- [转]win32基础编程知识
一个最简单的Win32程序 在以前的C语言编程中,一个最简单的程序可以只有两行. void main(void) { printf "Hello World!"; } 而要实现同样 ...
- Win32编程基础知识(包括对程序的分析)
管Windows应用程序千变万化,令人眼花缭乱,但,消息机制和窗口过程却始终它们的基础,掌握了这两项技术,也就相当于把握住了问题的关键. 如果你以前是C程序员或是MFC的忠实用户,只要你学习过C语言的 ...
- 串口基础类库(WIN32)异步通信 _COM_H 源代码
/* 串口基础类库(WIN32) ver 0.1编译器 : BC++ 5; C++ BUILDER 4, 5, 6, X; VC++ 5, 6; VC.NET; GCC;class _base_com ...
- 汇编怎么从内存地址写入连续的数字_汇编语言 第一章 基础知识
系列文章见:Neptune 第一章 基础知识 1.1 机器语言 机器语言是机器指令的集合,机器指令展开来讲就是一台机器可以正确执行的命令. 由图可见,机器语言是十分晦涩难懂和不易查错的. 1.2 汇编 ...
- 汇编语言二进制转十进制_汇编语言笔记(一)——基础知识
汇编语言基础知识 汇编语言组成 汇编指令:就是机器指令的助记符 伪指令 其他符号 计算机中数的表示 2^10=1K 2^20=1M 2^30=1G 2^40=1T 进制运算 二进制运算:1+1=0(向 ...
- 汇编语言(一)-基础知识
基础知识 0. 教材版本信息 1. 汇编语言的特点 2. 数制及之间的转换 3. 运算模式及规则 4. 涉及的符号编码 5. 习题 0. 教材版本信息 IBM-PC 汇编语言程序设计(第二版) 沈美明 ...
- 《汇编语言》第1章 基础知识
汇编语言是直接在硬件之上工作的编程语言,我们首先要了解硬件系统的结构,才能有效地应用汇编语言对其编程.在本章中,我们对硬件系统结构的问题进行一部分的探讨,以使后续的课程可在一个好的基础上进行.当课彺进 ...
- 《汇编语言》- 读书笔记 - 第1章-基础知识
<汇编语言>- 读书笔记 - 第1章-基础知识 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 1.4 存储器 1.5 指令和数据 1.6 存储单元 1.7 CPU对存储 ...
最新文章
- VS不能编译指定版本(配置管理错误)
- 还想“躺着挣钱”?这家背靠世界500强的工程机械企业如何做?
- 项目第一天--ElementUI介绍
- python快速处理ppt_人生苦短,我用 Python 之快速遍历 PPT
- 注册登录页面代码用js判断是否填入信息_php实现登录功能
- cocos2dx linux eclipse,如何将cocos2dx移植到eclipse上?
- 如果理解Javascript利用闭包循环绑定事件
- 导出PDF /home/education/font/simsun.ttc not found as file or resource.
- 异步处理Promise
- 苹果蓝牙耳机平替哪个好用?商务通话蓝牙耳机推荐
- 中龙电力什么理财产品预期收益高又安全?介绍四类理财产品
- java中单元测试ut怎么写_UT单元测试总结基础篇
- open3d使用知识拾遗
- 如何让USB-C手机,电脑投屏到VR眼镜方案?还能同时实现充电?乐得瑞LDR6282 转接器方案
- caffe的使用方法
- ICPC训练联盟2021寒假冬令营(5)_2021.01.22_笔记
- java程序无法启动:Unsupported major.minor version 51.0
- 算法系列之十八:用天文方法计算二十四节气(下)
- Java中常见的各种锁-超全面
- sprint2的总结及团队贡献分
热门文章
- 使用ansible批量部署开机启动时为字符界面
- unity调用普通java类_Unity中C#和Java的相互调用实例代码
- 计算机与图像处理论文标题,数字图像处理论文各种题目.doc
- 商品领域ddd_DDD领域驱动实战 - 限界上下文(bounded context)
- HuaWeiCloud_model_arts
- Spring Boot 学习系列(09)—自定义Bean的顺序加载
- 183. Customers Who Never Order
- jquery 前台分页插件总结(1 前台假分页 2 后台分页)
- 构建之法第5词作业(12-15章)
- wdcp系统升级mysql5.7.11