1、单位转换
bit 位(指的是 0 or 1)
byte 字节 1byte = 8 bit
word 字 1 word = 2 byte
dword (double word)
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
2、字节序
大端序(Big endain) :内存地址低位储存数据的高位,
小端序(Little endain):内存地址高位储存数据的高位(x86是基于Intel8086处理器的小端体系结构)
3、ASCII码
4、Win API
API全名(Application Programming Interface 应用程序编程接口)
用于16位Windows的API(Windows1.0-Windows3.1)称作“Win16”,用于32位Windows的API(Windows 9x/NT/2000/XP/7/10)叫作“Win32”。64位WindowsAPI的名称和功能基本没有变化,还是使用Win32的函数名,只不过是用64位代码实现的。API函数调用从Win16到Win32的转变中保持兼容,并且数量和功能上不断增强——Windows10 1.0只支持不到450个函数调用,现在已有几千个函数了。
Windows运转的核心是动态链接。Windows提供了丰富的应用程序可利用的函数调用,这些函数采用动态链接库(DLL)实现。在Windows 9x 中,DLL通常位于\WINDOWS\SYSTEM子目录中。在Windows NT/2000/XP/7中,DLL通常位于系统安装目录的\SYSTEM和\SYSTEM32子目录中。
在早期,Windows的主要部分只需要在3个动态链接库中实现,它们分别代表Windows的三个主要子系统,叫做Kernel、User和GDI。
Kernel (由16位的KRNL386.EXE和32位KERNEL32.DLL实现):操作系统核心功能服务,包括进程与线程控制、内存管理、文件访问等;
User (由16位的KRNL386.EXE和32位KERNEL32.DLL实现):负责处理用户接口,包括键盘和鼠标输入、窗口和菜单管理等;
GUI (由16位的KRNL386.EXE和32位KERNEL32.DLL实现):图形设备接口,允许程序在屏幕和打印机上显示文本和图形。
除了上述模块,Windows提供了其他DLL以支持更多功能,包括对象安全性、注册表操作(ADVAPI32.DLL)、通用控件(COMCTL32.DLL)、公共对话框(COMDLG32.DLL)、用户界面外壳(SHELL32.DLL)和网络(NETAPTI32.DLL)。
5、WOW64
WOW64(Windows-on-Windows64-bit)是64位Windows操作系统的子系统,可以使大多数32位应用程序在不进行修改的情况下运行在64位操作系统上。
64位的Windows,除了带有64位操作系统应有的系统文件,还带有32位操作系统应有的系统文件。Windows的64位系统应有的系统文件,还带有32位操作系统应有的系统文件。Windows的64位系统文件都放在一个叫做“System32“的文件夹中,\Windows\System32文件夹中包含原生的64位映像文件。为了兼容32位操作系统,还增加了\Windows\SysWOW64文件夹,其中存储了32位的操作系统。
64位应用程序会加载System32目录下64位的kernel32.dll、user32.dll和ntdll.dll。当32位应用程序加载时,WOW64建立32位ntdll.dll所要求的启动环境,将CPU模式切换至32位,并开始执行32位加载器,就如同该进程在原生32位系统上一样。WOW64会对32位ntdll.dll的调用重定向ntdll.dll(64位),而不是发出原生的32位系统调用指令。WOW64转换到原生的64位模式,捕获于系统调用有关的参数,发出对应的原生64位系统调用。当原生的系统调用返回时,WOW64在返回32位模式之前将所有输出参数从64位转换成32位。
WOW64既不支持16位应用程序的执行(32位Windows支持16位应用程序的执行),也不支持加载32位内核模式的设备驱动。WOW64进程只能加载32位的DLL,不能加载原生的64位DLL。类似的,原生的64位进程不能加载32位的DLL。
6、Windows消息机制
Windows是一个消息(Message)驱动式系统。Windows消息提供在应用程序于应用程序之间、应用程序于Windows系统之间进行通信的手段。应用程序想要实现的功能由消息触发,通过对消息的相应和处理完成。
Windows系统中有两种消息队列:一种是系统消息队列;另一种是应用程序消息队列。计算机的所有输入设备由Windows监控。当一个事件发生时,WIindows先将输入的消息放入系统消息队列,再将输入的消息复制到相应的应用程序队列中,应用程序中的消息循环在它的消息队列中检索每个消息并发送给相应的函数窗口。
(1)SendMessage函数
(2)WM_COMMANFD消息
(3)WM_COMMAND消息
(4)WM_GETTEXT消息
(5)WM_QUIT消息
(6)WM_LBUTTONDOWN消息
7、虚拟内存
在默认情况下,32位Windows操作系统的地址空间是在4GB以内。Win32的平坦内存模式使每个进程都拥有自己的虚拟空间。对32位进程来说,这个地址空间是4GB,因为32位指针拥有00000000h-FFFFFFFFh的任何值。此时,进程的代码和数据都放在同一地址空间中,不必区分代码段和数据段。
虚拟内存(Virtual Memory)不是真正的内存,它通过映射(Map)的方法使可用的虚拟地址(Virtual Address)达到4GB,每个应用程序可以获得2GB的虚拟地址,剩下的2GB留给操作系统自用。在Windows NT中,应用程序甚至可以获得3GB的虚拟地址。
Windows是一个分时的多任务操作系统,CPU时间在被分成一个个时间片后分配给不同的应用程序。在一个时间片里,与这个程序的执行无关的内容不会映射到线性地址中。因此,每个程序都有自己的4GB寻址空间,互不干扰。在物理内存中,操作系统和系统DLL代码需要供每个应用程序调用,所以他们在任意时刻必须被映射。用户的exe程序只在自己所属的时间片内被映射,用户dll则有选择地被映射。
实现方法和过程如下:
1、当一个应用程序启动时,操作系统就创建一个进程,并给该进程分配2GB的虚拟地址(不是内存,只是地址)。
2、虚拟内存管理器将应用程序的代码映射到那个应用程序的虚拟地址中的某个位置,并把当前需要的代码读入物理地址(注意:虚拟地址与应用程序代码在物理内存中的位置是没有关系的)。
3、如果使用DLL,DLL也会被映射到进程的虚拟地址空间中。然后,虚拟内存管理器把每次内存访问映射到物理地址。