找回密码
 立即加入
搜索

查看: 2416|回复: 7

[技术交流] 概念澄清:32位操作系统并不意味着只能使用4GB内存(摘自网络)

[复制链接]
言冰的夏虫 发表于 2009-10-31 00:45:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转闽南师范大学。

您需要 登录 才可以下载或查看,没有账号?立即加入

×
(更多请参见http://www.xici.net/b680445/d93048457.htm
" c1 P/ j/ d# R) r0 C8 E- k" e
8 S' D" I0 J+ }/ l" _5 d  [6 ?6 Y" Y( N7 d& z8 o& ?
$ I4 j0 G" O1 F! S& o
  从硬件上讲,所谓的计算机位数是指处理器指令的长度,对硬件来说就是通用寄存器(GPR,General Purpose Registers)的宽度,它并不意味着地址总线的宽度,虽然有些情况下它们碰巧也会相等。对于当前的从80386开始算起的大多数x86处理器来说,通用寄存器的长度就是32位,支持x86-64(或者按照更常见的说法:x64)的处理器则可以支持64位的通用寄存器。32位的PowerPC(G5之前)使用32位的通用寄存器,指令长度固定为32位,DEC Alpha64则基于64位通用寄存器,指令为64位。
, @: O/ V* O3 P( C7 W4 T; N/ }9 d# ^5 v" D+ T7 D4 ]; p5 [
Intel Pentium PRO运行16/32位混合操作系统Windows 95很慢,性能甚至低于运行纯32位操作系统Windows NT
% N+ m: Z% ]( H/ i3 z* P3 p  32位操作系统指的它的指令们只使用32位宽度的GPR,并不意味着它只能的内存寻址就是32位。实际上,早在Pentium Pro(Pentium Pro是一个纯正的32位处理器)上就采用了36位的地址总线(基于这个原因,PAE有时也被称为PAE-36bit),寻址能力就达到了64GB,这个简单有效的扩展就被称为PAE(Phsical Address Extension,物理地址扩展),可见10多年前,x86处理器就能支持这么多的内存了。一再认为32位系统只能支持4GB内存在硬件上就错了。
8 o+ I7 n; g5 D+ G* K6 R / q/ P( w* U: y: U8 U9 U
32位XP/2003操作系统通过PAE来支持4GB以上的内存,因此具有“物理地址扩展”的字样9 M+ w5 T1 \- r9 N: |! L
0 D5 _, \$ j- k9 I, R1 R
但是32位Vista/2008内部直接使用64位PTE,因此就没有了PAE相关字样
  在现代操作系统上,如32位的Windows Vista/7,为了实现与64位的兼容(如,为了驱动程序编写的方便),系统使用了64位的PTE(Page Table Entry,分页表)来管理内存,因此它们就和64位版本一样,也能管理和使用更大的内存。
, ~0 v9 \% V  }& K" x7 Y0 Y* t既然知道了32位Vista通过ZwQueryLicenseValue函数来决定系统能使用多少内存,而不是通过编写内存管理功能时就加上的限制,那么相对来说,让32位Windows突破(促销产品 主营产品)4GB的限制就比较简单了。
# `8 V* d# t. M5 @. Q* f- E9 Q& M9 d  启动时系统在NTKRNLPA.EXE内核文件中使用了这样的代码:! |% h# I* w$ t9 }) g# W2 n9 P& C  w
3 R) C. m. d4 Z9 Y$ k( p
Opcode Bytes! G* ?$ I2 O% E( b
操作码
Instruction
* P5 c& a2 I: A, K% v9 R1 `* p6 D汇编指令
[pre]7C xx[/pre][pre]jl      default[/pre]
[pre]8B 45 FC[/pre][pre]mov     eax,dword ptr [ebp-4][/pre]
[pre]85 C0[/pre][pre]test    eax,eax[/pre]
[pre]74 yy[/pre][pre]je      default[/pre]
  ?0 x& G' t5 {1 f1 L4 u
  执行中,eax寄存器中保存了ZwQueryLicenseValue的状态值,在通常情况下,系统跳转到default代码段,不允许使用超过4GB容量内存,通过简单的修改就可以让系统认为ZwQueryLicenseValue返回128GB的可用容量:
9 S1 E, h% q1 T& T, Z' ]
Opcode Bytes- ~, r1 t; J1 ]
操作码
Instruction
: p6 {4 Q& u/ [6 _7 r汇编指令
[pre]B8 00 00 02 00 [/pre][pre]mov     eax,00020000h [/pre]
[pre]90[/pre][pre]nop[/pre]
[pre]90[/pre][pre]nop[/pre]
% ]7 E3 b  d& u9 b6 `
  nop是空操作的意思(no operation),20000h就代表着128GB(16进制值)。以下是上述指令在英文版本Vista上的位置:
6 V1 X6 h. |1 q) O  |( Y% k! ~! q
Version
  L6 L" ~4 y3 k' G版本号
Package9 r+ H. a/ J  G# @3 ]# P
版本
File Offsets" Y; O3 k/ Q& {3 n) _
文件偏移量
6.0.6000.16386Windows Vista0x003040B1, 0x003040F2
6.0.6001.18000Windows Vista SP10x00309AA3, 0x00309AE4
0 c3 l, @: P6 c2 ^: F# {
为了安全,一般建议,修改后的内核文件名为NTKR128G.EXE
" f- X" z* ^  j# {- Q8 F  温馨提示:修改核心文件具有风险,此文仅用于研究用途。  B" [+ z2 F, U1 d$ T4 [

2 M, z/ ?1 W5 a  b 虽然知道原理之后还有很多操作,如,数字签名等操作,不过这些都是为人熟知,因此已经有不少的补丁实现了该大内存支持修改理论,有一个国内的圣贤实现的版本:
* G9 e! u' i& [5 X% [

3 m# K4 k; b! s) i8 E; c如图,请自行思考如何获得该软件

/ R' K% ]* L% _: |* B4 I简单地按下“应用”按钮

* R8 w7 q0 X3 u一个新的核心文件就出炉了
7 Y2 U% \$ ~! n, i
该补丁还提供了一个自动修改启动选项以应用NTKR128G.EXE的命令行批处理文件
; b1 Q4 ]4 d: e7 S5 V+ ^$ u
自行进行修改
) u7 o8 L! o" ]: K0 Y5 E. W/ w3 w$ r
为了安全,这个补丁默认启动正常的核心文件,需要手动选择加入的新选项才能使用NTKR128G.EXE启动
  以下为可选命令:& }+ N  ~7 Y: Z7 j$ ]( }( U
启动菜单10秒选择时间:# R7 K. E. y) {/ j" u( w
bcdedit -timeout 10
3 }+ q) K) V0 b将指定的GUID代表的启动选项设置为第一项,GUID可以通过bcdedit命令显示出来(resumeobject):
4 x1 ]3 H$ |8 Q4 }0 T# Ybcdedit -displayorder GUID -addfirst
. L& h( K3 l- }* O. L. I) l9 `修改默认启动为GUID代表的启动选项
! j( ]6 E; X: D4 h; M3 V2 wbcdedit -default GUID! _+ x2 Y- j4 X/ F# p2 [; j0 O
* z3 U+ Y& V8 P7 A( y" V+ O
6GB容量
  成功之后,系统将可以应用超过4GB以上的内存。虽然经过修改,已经解决了大内存支持的问题(顺便也解决了MMIO吃掉内存的问题),然而,在32位环境无法解决的是,进程的地址空间的问题。因为架构的原因,现代的普通32bit操作系统上,每一个用户模式的应用程序可以寻址的通常只有2GB(有一个选项可以让其增大为3GB)。提供多于4GB容量的内存,每一个用户模式的应用程序可以寻址的容量仍然没有改变——尽管不同的应用程序都具有互相独立的的2GB寻址空间可以让大内存电脑同时运行多个不同的程序。
2 Y5 V# r  G( r4 R/ W# d
! k) d( S, Z# Q6 R: @. C
通常,64位的应用程序才可以使用超过2GB的内存;64位应用程序的寻址空间是4TB
图中部的Virtual Size显示了一个程序使用的地址空间,Working Set则是其所有占用的内存(包括映射的系统文件),Private Bytes则是完全由程序自己占用的私有内存
  通常的应用程序就受到了这个限制,例如,在使用如Maxthon这样的多页面浏览器打开70个图片页面的时候,程序的寻址空间就已经到达2GB了,这时虽然其工作集并不大,然而程序已经无法寻址更多的内存;继续打开新的页面只会让Maxthon崩溃。
6 Q* q7 N# \- U2 }7 r7 Q8 q  G7 ?
7 l1 L& Z. m+ c  为了让程序突破(促销产品 主营产品)2GB寻址的限制,近代Windows NT核心提供了一个变通的方案:4GB内存调整优化技术,通过这个技术,可以将用户模式的寻址空间扩大至3GB,这样核心寻址空间便被限制为1GB了,需要超大内存容量的应用程序可以从这个特性中获得性能改善,如SQL Server数据库这种类型。要使用这个4GB内存优化技术,用户需要在Windows Server操作系统的启动参数中加入/3GB开关。这个特性同时需要操作系统打开DEP(数据执行保护,其实/3GB开关需要的是PAE的支持)。! W! J4 U; |4 \; I
  对于一个用户进程来说,默认的2GB可能已经足够,然而对于操作系统核心来说——所有的内核模式程序包括内核、驱动程序、系统缓存等都共享着相同的2GB空间(或者1GB;从这点上看,Windows已经不怎么具有微内核的样子了,为了性能,Windows将许多本应该放在用户模式的系统服务都放进了内核),在一个大系统上很容易受到限制。如上图这样,系统的System Cache总不会超过2GB(还要加上核心内存的占用),这样Superfetch也就无法发挥最大的作用。除了破解NTKRNLPA.EXE文件之外,以往还有一个方法来应用超过4GB的内存:RAMDISK,通过启动时装载的内核模式驱动,它也能让超过4GB的内存得到一些应用。显然,破解的方法更为灵活一些,不仅仅是RAMDISK才能使用4GB以上的内存。并且破解之后一样可以使用RAMDISK。1 V& |" E; ~* F& ^

0 ]) O! w7 D& T5 f' n# a9 Z32位Windows Vista突破(促销产品 主营产品)4GB容量限制(也可以应用于Windows 7)8 o# Y6 ~- W/ u! N) q3 p4 A  l
  然而,由于上一页所说的限制,使用64位操作系统仍然是推荐的,不仅仅是为了支持的最大内存容量更大,而是为了更强大的操作系统内部数据结构。6 }. L" o" b6 C
64位系统:系统缓存、分页池和未分页池(较小的系统缓存是因为笔者使用了一个应用软件来限制的缘故)
5 b0 t( ]0 f1 A: g$ ?. Q$ R! F  系统资源主要有四种:分页池、未分页池、系统分页表和系统缓存,System Cache系统缓存容易理解(用来缓存读取的各种程序/文件),系统分页表则是用来保存所有线程使用到的堆栈(Windows所有的线程都具有自己的堆栈),分页池和未分页池则是所有程序的核心模式组件使用到的内存部分,区别只是未分页池里分配的内存是不能交换到虚拟内存上面的,分页池上的则可以(从而可能保存到磁盘上去,当程序需要这些页面的时候,再读到内存里面来)。例如设备驱动就使用未分页池(假如放到虚拟内存并被交换到磁盘上时可能会发生灾难性的后果)。这些资源短缺的时候系统将会发生不可预料的事情,分页池吃紧的时候系统将会频繁地使用虚拟内存,从而不停读写磁盘减低性能,而未分页池吃紧的时候系统多半已经踏入鬼门关了。
" Z) f: }) `& x5 I6 L4 q6 K  由于这些资源共同占用着相同的内核模式地址空间,因此在32位条件下很受限制,并且稍有不慎就会导致短缺,在64位环境下,这些资源的上限都可以达到128GB,因此系统运行起来会更加稳定,可以支持更多的进程/线程运行——也就是打开更多的窗口,运行更多的程序(从这点上看,32位的Vista也多少具有这些特征,虽然无法突破4GB的限制,不过系统资源的分配没有太过于固定的限制)。' N0 k1 g' u1 H( j) Y7 i
* t) _7 Y9 g8 ?/ b' Q3 B
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
猴老大 发表于 2009-10-31 00:50:38 | 显示全部楼层
pentium系列的芯片有36根地址总线,这就是问题的答案
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
回复

使用道具 举报

wwbmyos 发表于 2009-10-31 00:56:47 | 显示全部楼层
好长好长     
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
回复

使用道具 举报

风中幽灵 发表于 2009-10-31 01:15:34 | 显示全部楼层
高手
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
回复

使用道具 举报

猴老大 发表于 2009-10-31 01:28:35 | 显示全部楼层
灌水的同志消停下,注意版规
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
回复

使用道具 举报

woaitun 发表于 2009-10-31 01:58:05 | 显示全部楼层
看的好晕啊  还是没看懂
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
回复

使用道具 举报

loweny 发表于 2009-10-31 17:18:32 | 显示全部楼层
不是计算机的路过 看得半懂不懂的...4 O, J" x) }$ i" Q

! s  c9 S; J; _! l话说 要是我把现在的2GB*1变成2GB*2可以吧...?...
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
回复

使用道具 举报

xiangxiang 发表于 2009-11-1 23:54:54 | 显示全部楼层
以后用得到,未来的主流。。。。
宣传/支持龙江曦月.龙江曦月需要理解,适宜长居
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

手机版|龙江曦月 ( 闽ICP备05009150号-1 )闽公安网备35060202000316

GMT+8, 2025-5-26 07:39 , Processed in 0.039805 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表