(这个学期做助教,说来好惭愧啊,虽然我也是考研进来的,但是就在两年前复习的资料居然全部都忘光了。对大二的孩子们提问的问题多半都解决不了!!!越来越觉得自己的学习方法有问题了,总是想着一些知识能够根据自己多看几遍印象就深刻了,或者说每次记忆知识时总是想下次再记在脑海里吧!这样导致很多东西必须看资料才能想起来:啊原来是这样的,我看过啊,我知道的啊!这样的陋习一定要赶紧改正了,每次学习一个新的知识,都要记在脑海里,深刻地理解一下!!!)
1. CPU位数:一个时钟周期内处理器处理的二进制位数。
CPU位数 = CPU中寄存器的位数 = CPU一次并行处理的数据宽度
CPU为了实现其功能一般设计了指令集,即是CPU的全部指令,这就是机器语言。计算机的所有功能都是基于CPU的指令集。
如Intel 8086 CPU 是16位,其指令集也是16位。如Intel 80386DX CPU 是32位,其指令集也是32位,但它也保持原16位指令集,这是为了向上兼容。
2. 操作系统位数
操作系统位数 = 其所依赖的指令集位数 <= CPU位数
操作系统位数对CPU位数有向上兼容,如32位CPU上运行16操作系统,64位CPU上运行32位操作系统等情况。
3. 内存容量与操作系统位数的关系。(有种说法是:32位操作系统最大只能支持4G内存)
在使用计算机时,其支持的最大内存是由操作系统和硬件两方面决定的。
在早期的PC机中,采用的是三总线结构:数据总线,地址总线和控制总线。分别来实现不同的功能:数据总线用来传输数据,地址总线用来传输地址,控制总线用来传输一些控制信号。但在现在的PC机中,一般使用了总线复用功能。如在PCI总线中,地址总线和数据总线总是分时复用的(也就是说假如PCI总线有32为数据总线,这32位数据总线在某个时刻传输数据,在下一个时刻却用来充当地址总线的作用)。
回顾了关于总线的一点知识后,先来说硬件方面对内存容量的控制作用。
在计算机中地址总线的数目决定了CPU的寻址范围,这种由地址总线对应的地址称为 物理地址。
先说一下硬件方面的因素,在上面已经提到了地址总线,在计算机中 CPU的地址总线数目 决定了CPU 的寻址范围,这种由地址总线对应的地址称作为物理地址。假如CPU有32根地址总线(一般情况下32位的CPU的地址总线是32位,也有部分32位的CPU地址总线是36位的,比如用做服务器的CPU),那么提供的可寻址物理地址范围 为 232=4GB(在这里要注意一点,我们平常所说的32位CPU和64位CPU指的是CPU一次能够处理的数据宽度,即位宽,不是地址总线的数目)。自从64位CPU出现之后,一次便能够处理64位的数据了,其地址总线一般采用的是36位或者40位(即CPU能够寻址的物理地址空间为64GB或者1T)。CPU访问任何存储单元必须知道其物理地址。
再说说物理地址,线性地址,逻辑地址的关系:
1) 物理地址(Physical Address): 刚刚讲过了,由CPU地址总线的位数决定。
2) 线性地址(Linear Address): 如果没有开启分页机制,线性地址就等于物理地址。如果开启了分页机制,线性地址到物理地址需要经过二级地址转换。线性地址可以很大,但最终要运行在物理地址上,而缺页机制和进程挂起等,就是为了让远比物理内存大的程序,运行在如此小的物理内存中。在网上看到一个例子,生动又形象:好比公交车上让座,假设座位是内存,其他站立空间是硬盘,刚上车的时候你很高兴,你和你女朋友(进程A,B)都有座位(进入内存),如果此时,有个孕妇上车了,售票员大姐(操作系统)发现了,"孕妇优先",于是开始问"谁给孕妇让个座啊"(进程调度),不过很不幸,这个系统是非抢占式的,孕妇(进程S)只好等待,作为一个有理想有道德的程序猿(优先级低),当仁不让,自己站了起来了(进程挂起),操作系统一看,有个家伙把座椅(内存)释放出来了,于是排队等候的孕妇就坐到了你原来的位置,你切换到公交地板上(硬盘)。车到某站,孕妇下车了,于是你重新坐上座位(内存占有),在公家车的整个运营过程中,座位(内存)是有限的,而人不不断上下,所以人上来首先站在车厢内,然后根据各种成文的,不成文的规矩,占有或者释放内存(座位)。座位是有限的,而人相对来说是无限的,怎么利用有限的资源,服务更多的进程,这或许是操作系统应该考虑的。
3) 逻辑地址(Logical Address): 指分段机制提供的地址,由段部分和一个便宜部分构成。段机制是虚拟地址到线性地址的基础。线性地址 = 段基址 + 偏移地址。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。
这三种地址关系为,逻辑地址经过段式映射(Segmentation Translation)到线性地址。线性地址经过页面映射(Page Translation)后,得到物理地址。
言归正传,再说说操作系统对内存容量的控制作用。
在上面中有提到,用户使用计算机时,直接操纵的只能是逻辑地址,要经过操作系统的转换后才能变换为物理地址。如对于32位的操作系统而言,其逻辑地址编码采用的地址位数是32位,那么操作系统所提供的逻辑地址寻址范围为:232 = 22 * 230 = 4GB(所以在32位CPU和32位的操作系统中,最大支持的内存为4G)。但是理论上是4G的内存,在我们真正使用时并不到4G,大约只有3.2G左右。这是因为在intel x86架构下,采用的是内存映射技术(Memory-Mapped I/O, MMIO),也就说将4GB逻辑地址中一部分要划分出来与BIOS ROM、CPU寄存器、I/O设备这些部件的物理地址进行映射,那么逻辑地址中能够与内存条的物理地址进行映射的空间肯定没有4GB了。
参考文献:
【1】http://blog.csdn.net/ray_zhang_3/article/details/5447140
【2】http://www.cnblogs.com/dolphin0520/archive/2013/05/31/3110555.html
【3】http://bbs.51cto.com/thread-1089741-1.html
【4】http://blog.csdn.net/macrossdzh/article/details/5954763
【5】http://laoxu.blog.51cto.com/4120547/1166661
【6】http://ilinuxkernel.com/?p=414
【7】http://blog.csdn.net/linpeng12358/article/details/41450805