??xml version="1.0" encoding="utf-8" standalone="yes"?>
字符必须~码后才能被计算机处理。计机使用的缺省编码方式就是计机的内码。早
期的计算Z?位的ASCII~码Qؓ了处理汉字,E序员设计了用于体中文的GB2312
和用于繁体中文的big5?
GB2312(1980q?一共收录了7445个字W,包括6763个汉字和682个其它符受汉字区的内
码范围高字节从B0-F7Q低字节从A1-FEQ占用的码位?2*94=6768。其中有5个空位是
D7FA-D7FE?
GB2312支持的汉字太?995q的汉字扩展规范GBK1.0收录?1886个符P它分为汉?
区和囑ŞW号区。汉字区包括21003个字W?000q的GB18030是取代GBK1.0的正式国?
标准。该标准收录?7484个汉字,同时q收录了藏文、蒙文、维向ְ文等主要的少数民
族文字。现在的PCq_必须支持GB18030Q对嵌入式品暂不作要求。所以手机、MP3一
般只支持GB2312?
从ASCII、GB2312、GBK到GB18030Q这些编码方法是向下兼容的,卛_一个字W在q些?
案中L有相同的~码Q后面的标准支持更多的字W。在q些~码中,英文和中文可?
l一地处理。区分中文编码的Ҏ是高字节的最高位不ؓ0。按照程序员的称|
GB2312、GBK到GB18030都属于双字节字符?(DBCS)?
有的中文Windows的缺省内码还是GBKQ可以通过GB18030升包升U到GB18030。不q?
GB18030相对GBK增加的字W,普通h是很隄到的Q通常我们q是用GBK指代中文
Windows内码?
q里q有一些细节:
GB2312的原文还是区位码Q从Z码到内码Q需要在高字节和低字节上分别加上A0?
在DBCS中,GB内码的存储格式始l是big endianQ即高位在前?
GB2312的两个字节的最高位都是1。但W合q个条g的码位只?28*128=16384个。所?
GBK和GB18030的低字节最高位都可能不?。不q这不媄响DBCS字符的解析Q在d
DBCS字符时Q只要遇到高位ؓ1的字节,可以将下两个字节作Z个双字节~码Q?
不用低字节的高位是什么?
二、关于编?
所谓编码,是以固定的顺序排列字W,q以此做录、存贮、传递、交换的l一内部
特征Q这个字W排列顺序被UCؓ“~码”。和中文字库有关的常见编码有Q大陆GB码?
GBK码、港台BIG-5码等。下面简要介l一下?
GB?
全称是GB2312-80《信息交换用汉字~码字符?基本集》,1980q发布,是中文信息处
理的国家标准Q在大陆及v外用简体中文的地区Q如新加坡等Q是强制使用的唯一?
文编码。P-Windows3.2和苹果OS是以GB2312为基本汉字编码, Windows 95/98则以GBK
为基本汉字编码、但兼容支持GB2312?
GB码共收录6763个简体汉字?82个符P其中汉字部分Q一U字3755Q以拼音排序Q二
U字3008Q以偏旁排序。该标准的制定和应用范、推动中文信息化q程起了很大?
用?
1990q又制定了繁体字的编码标准GB12345-90《信息交换用汉字~码字符?W一辅助
集》,目的在于规范必须使用J体字的各种场合Q以及古c整理等。该标准共收?866
个汉字(比GB2312?03个字Q其它厂商的字库大多不包括这些字Q,U繁体的字大概有
2200余个?
Unicode~码(Universal Multiple Octet Coded Character Set)
国际标准l织?984q?月成立ISO/IEC JTC1/SC2/WG2工作l,针对各国文字、符可?
l一性编码?991q美国跨国公司成立Unicode ConsortiumQƈ?991q?0月与WG2达成
协议Q采用同一~码字集。目前Unicode是采?6位编码体p,其字W集内容与ISO10646
的BMPQBasic Multilingual PlaneQ相同。Unicode?992q?月通过DISQDraf
International StandardQ,目前版本V2.0?996公布Q内容包含符?811个,汉字
20902个,韩文拼音11172个,造字?400个,保留20249个,p65534个?
GBK~码(Chinese Internal Code Specification)
GBK~码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作组?
1995q?0月,同年12月完成GBK规范。该~码标准兼容GB2312Q共收录汉字21003个、符
?83个,q提?894个造字码位Q简、繁体字融于一库?
Windows95/98体中文版的字库表层编码就采用的是GBKQ通过GBK与UCS之间一一对应?
码表与底层字库联pR?
BIG5~码
是目前台湾、香港地区普遍用的一U繁体汉字的~码标准Q包?40个符P一U汉?
5401个、二U汉?652个,p13060个汉字?
Ҏ748~码
所?48~码Q是指方正系l在长期应用q程中实施、制定的、繁体字库编码方式,
体兼容GB2312且有所扩展Q共7156字;J体兼容GB12345q扩展全部BIG-5汉字Q计14943
字。此外,Ҏ748~码q含有丰富的W号库?48~码仅用于方正Y件和pȝ?br>
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/coffeemay/archive/2006/04/17/666213.aspx
U性地址QLinear AddressQ?是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址Q或者说是段中的偏移地址Q加上相应段的基地址q成了一个线性地址。如果启用了分页机制Q那么线性地址可以再经变换以生一个物理地址。若没有启用分页机制Q那么线性地址直接是物理地址。Intel 80386的线性地址I间定w?GQ??2ơ方?2根地址ȝdQ?/p>
物理地址QPhysical AddressQ?是指出现在CPU外部地址ȝ上的d物理内存的地址信号Q是地址变换的最l结果地址。如果启用了分页机制Q那么线性地址会用页目录和页表中的项变换成物理地址。如果没有启用分|Ӟ那么U性地址q接成为物理地址了?/p>
虚拟内存QVirtual MemoryQ?是指计算机呈现出要比实际拥有的内存大得多的内存量。因此它允许E序员编制ƈq行比实际系l拥有的内存大得多的E序。这使得许多大型目也能够在h有限内存资源的系l上实现。一个很恰当的比LQ你不需要很长的轨道可以让一列火车从上v开到北京。你只需要够长的铁轨(比如?公里Q就可以完成q个d。采取的Ҏ是把后面的铁轨立刻铺到火车的前面Q只要你的操作够快q能满要求Q列车就能象在一条完整的轨道上运行。这也就是虚拟内存管理需要完成的d。在Linux 0.11内核中,l每个程序(q程Q都划分了d量ؓ64MB的虚拟内存空间。因此程序的逻辑地址范围?x0000000?x4000000?/p>
有时我们也把逻辑地址UCؓ虚拟地址。因Z虚拟内存I间的概늱|逻辑地址也是与实际物理内存容量无关的?
逻辑地址与物理地址?#8220;差距”?xC0000000Q是׃虚拟地址->U性地址->物理地址映射正好差这个倹{这个值是由操作系l指定的?/p>
虚拟地址到物理地址的{化方法是与体pȝ构相关的。一般来说有分段、分两U方式。以现在的x86 cpuZQ分D分都是支持的。Memory Mangement Unit负责从虚拟地址到物理地址的{化。逻辑地址是段标识+D内偏移量的形式QMMU通过查询D表Q可以把逻辑地址转化为线性地址。如果cpu没有开启分功能,那么U性地址是物理地址Q如果cpu开启了分页功能QMMUq需要查询页表来线性地址转化为物理地址Q?br>逻辑地址 ----Q段表)---> U性地址 ?Q页表)?gt; 物理地址
不同的逻辑地址可以映射到同一个线性地址上;不同的线性地址也可以映到同一个物理地址上;所以是多对一的关pR另外,同一个线性地址Q在发生换页以后Q也可能被重新装载到另外一个物理地址上。所以这U多对一的映关pM会随旉发生变化?/p>
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/leves1989/archive/2008/11/15/3305402.aspx
原文地址Q?a >http://duartes.org/gustavo/blog/
[注:本h水^有限Q只好挑一些国外高手的_ֽ文章译一下。一来自己复习,二来与大家分享。]
本文要的展示了现代Intel处理器的CPU cache是如何组l的。有关cache的讨论往往~Z具体的实例,使得一些简单的概念变得扑朔qL。也许是我可q脑瓜有点迟钝吧Q但不管怎样Q至下面讲qC故事的前一半,即Core 2?L1 cache是如何被讉K的:
L1 cache – 32KBQ?路组相联Q?4字节~存U?/p>
1. q引拣选缓存组Q行Q?/p>
在cache中的数据是以~存U(lineQؓ单位l织的,一条缓存线对应于内存中一个连l的字节块。这个cache使用?4字节的缓存线。这些线被保存在cache bank中,也叫路(wayQ。每一路都有一个专门的目录QdirectoryQ用来保存一些登C息。你可以把每一路连同它的目录想象成电子表格中的一列,而表的一行构成了cache的一l(setQ。列中的每一个单元(cellQ都含有一条缓存线Q由与之对应的目录单元跟t管理。图中的cache?4 l、每l?路,因此?12个含有缓存线的单元,合计32KB的存储空间?/p>
在cachegQ物理内存被分割成了许多4KB大小的物理内存页QpageQ。每一都含有4KB / 64 bytes == 64条缓存线。在一?KB的页中,W??3字节是第一条缓存线Q第64?27字节是第二条~存U,以此cL。每一都重复着q种划分Q所以第0늬3条缓存线与第1늬3条缓存线是不同的?/p>
在全相联~存Qfully associative cacheQ中Q内存中的Q意一条缓存线都可以被存储CQ意的~存单元中。这U存储方式十分灵z,但也使得要访问它们时Q检索缓存单元的工作变得复杂、昂c由于L1和L2 cache工作在很强的U束之下Q包括功耗,芯片物理I间Q存取速度{,所以在多数情况下,使用全相联缓存ƈ不是一个很好的折中?/p>
取而代之的是图中的l相联缓存(set associative cacheQ。意思是Q内存中一条给定的~存U只能被保存在一个特定的l(或行Q中。所以,L物理内存늚W?条缓存线Q页内第0?3字节Q必d储到W?l,W?条缓存线存储到第1l,以此cL。每一l有8个单元可用于存储它所兌的缓存线Q译注:是那些需要存储到q一l的~存U)Q从而Ş成一?路关联的l(8-way associative setQ。当讉K一个内存地址Ӟ地址的第6?1位(译注Q组索引Q指Z?KB内存中~存U的~号Q从而决定了卛_使用的缓存组。D例来_物理地址0x800010a0的组索引?00010Q所以此地址的内容一定是在第2l中~存的?/p>
但是q有一个问题,是要找Zl中哪个单元包含了想要的信息Q如果有的话。这到了缓存目录登场的时刻。每一个缓存线都被其对应的目录单元做了标记QtagQ;q个标记是一个简单的内存늼P指出~存U来自于哪一c由于处理器可以d64GB的物理RAMQ所以d?4GB / 4KB == 224个内存页Q需?4位来保存标记。前例中的物理地址0x800010a0对应的页号ؓ524,289。下面是故事的后一半:
在组中搜索匹配标?/p>
׃我们只需要去查看某一l中?路,所以查扑配标记是非常q速的Q事实上Q从电学角度Ԍ所有的标记是同时进行比对的Q我用箭头来表示q一炏V如果此时正好有一条具有匹配标{有效~存U,我们p得一ơ缓存命中(cache hitQ。否则,q个h׃被{发的L2 cacheQ如果还没匹配上再转发l主pȝ内存。通过应用各种调节寸和容量的技术,IntellCPU配置了较大的L2 cacheQ但其基本的设计都是相同的。比如,你可以将原先的缓存增?路而获得一?4KB的缓存;再将l数增加?096Q每路可以存?56KB。经q这两次修改Q就得到了一?MB的L2 cache。在此情况下Q需?8位来保存标记Q?2位保存组索引Q缓存所使用的物理内存页的大与其一路的大小相等。(译注Q有4096l,需要lg(4096)==12位的l烦引,~存U依然是64字节Q所以一路有4096*64B==256KB字节Q在L2 cachegQ内存被分割?56KB的块Q所以需要lg(64GB/256KB)==18位来保存标记。)
如果有一l已l被放满了,那么在另一条缓存线被存储进来之前,已有的某一条则必须被腾I(evictQ。ؓ了避免这U情况,对运速度要求较高的程序就要尝试仔l组l它的数据,使得内存讉K均匀的分布在已有的缓存线上。D例来_假设E序中有一个数l,元素的大是512字节Q其中一些对象在内存中相?KB。这些对象的各个字段都落在同一~存U上Qƈ竞争同一~存l。如果程序频J的讉K一个给定的字段Q比如,通过虚函数表vtable调用虚函敎ͼQ那么这个组看v来就好像一直是被填满的Q缓存开始变得毫无意义,因ؓ~存U一直在重复着腄与重新蝲入的步骤。在我们的例子中Q由于组数的限制QL1 cache仅能保存8个这cd象的虚函数表。这是l相联策略的折中所付出的代P即在整体缓存的使用率ƈ不高的情况下Q由于组冲突Q我们还是会遇到~存~失的情c然而,鉴于计算Z各个存储层次的相寚w度Q不怎么_大部分的应用E序q不必ؓ此而担心?/p>
一个内存访问经常由一个线性(或虚拟)地址发vQ所以L1 cache需要依赖分单元(paging unitQ来求出物理内存늚地址Q以便用于缓存标记。与此相反,l烦引来自于U性地址的低位,所以不需要{换就可以使用了(在我们的例子中ؓW??1位)。因此L1 cache是物理标C虚拟索引的(physically tagged but virtually indexedQ,从而帮助CPUq行q行的查找操作。因为L1 cache的一路绝不会比MMU的一还大,所以可以保证一个给定的物理地址位置L兌到同一l,即ɾl烦引是虚拟的。在另一斚wL2 cache必须是物理标记和物理索引的,因ؓ它的一路比MMU的一要大。但是,当一个请求到达L2 cacheӞ物理地址已经被L1 cache准备QresolvedQ完毕了Q所以L2 cache会工作得很好?/p>
最后,目录单元q存储了对应~存U的状态(stateQ。在L1代码~存中的一条缓存线要么是无效的QinvalidQ要么是׃n的(sharedQ意思是有效的,真的JQ。在L1数据~存和L2~存中,一条缓存线可以?个MESI状态之一Q被修改的(modifiedQ,独占的(exclusiveQ,׃n的(sharedQ,无效的(invalidQ。Intel~存是包容式的(inclusiveQ:L1~存的内容会被复制到L2~存中。在下一讨论线E(threadingQ,锁定QlockingQ等内容的文章中Q这些缓存线状态将发挥作用。下一ơ,我们看看前端ȝ以及内存讉K到底是怎么工作的。这成Z个内存研讨周?/p>
Q在回复中Dave提到了直接映缓存(direct-mapped cacheQ。它们基本上是一U特D的l相联缓存,只是只有一路而已。在各种折中Ҏ中,它与全相联缓存正好相反:讉K非常快捷Q但因组冲突而导致的~存~失也非常多。)
[译者小l:
1. 内存层次l构的意义在于利用引用的I间局部性和旉局部性原理,经常被讉K的数据放到快速的存储器中Q而将不经常访问的数据留在较慢的存储器中?/p>
2. 一般情况下Q除了寄存器和L1~存可以操作指定字长的数据,下层的内存子pȝ׃会再使用q么的单位了,而是直接Ud数据块,比如以缓存线为单位访问数据?/p>
3. 对于l冲H,可以q么理解Q与上文怼Q假设一个缓存,?12条缓存线l成Q每条线64字节Q容?2KB?/p>
a) 假如它是直接映射~存Q由于它往往使用地址的低位直接映缓存线~号Q所以所有的32K倍数的地址Q?2KQ?4KQ?6K{)都会映射到同一条线上(即第0U)。假如程序的内存l织不当Q交替的去访问布|在q些地址的数据,则会D冲突。从外表看来好像缓存只?条线了,管其他~存U一直是I闲着的?/p>
b) 如果是全相联~存Q那么每条缓存线都是独立的,可以对应于内存中的Q意缓存线。只有当所有的512条缓存线都被占满后才会出现冲H?/p>
c) l相联是前两者的折中Q每一路中的缓存线采用直接映射方式Q而在路与路之_~存控制器用全相联映射法Q决定选择一l中的哪一条线?/p>
d) 如果?路组相联~存Q那么这512条缓存线p分ؓ?路,每\256条线Q一?6KB。此时所有ؓ16K整数倍的地址Q?6KQ?2KQ?8K{)都会映射到第0U,但由?路是兌的,所以可以同时有2个这U地址的内容被~存Q不会发生冲H。当然了Q如果要讉KW三个这U地址Q还是要先腾I已有的一条才行。所以极端情况下Q从外表看来好像缓存只?条线了,管其他~存U一直是I闲着的?/p>
e) 如果?路组相联~存Q与文中CZ相同Q,那么q?12条缓存线p分ؓ?路,每\64条线Q一?KB。所以如果数l中元素地址?K寚w的,q且E序交替的访问这些元素,׃出现l冲H。从外表看来好像缓存只?条线了,管其他~存U一直是I闲着的?/p>
]
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/drshenlei/archive/2009/06/17/4277959.aspx
首先Qcore是内存的意思,在半g应用之前Q内存是由铁氧化物圆环制造的QcoreQ,但一直沿用至今?/p>
而这两种错误Q都是有g告知操作pȝ一个有问题的内存引用。操作系l通过信号Q再错误信息告知进E。缺省情况下Q进E收?#8220;ȝ错误”?#8220;D错?#8221;信号后,信息{储ƈl止。当然也可以些信可|一个信号处理程序(signal handlerQ?/p>
ȝ错误Qbus errorQ,几乎都是有内存未寚wdL。内存对齐,是内存变量的地址只能是其大小的整数倍,q样存储的目的就是ؓ了方便ƈ快速存取内存。一般情况下Q编译器都会做好内存寚w工作Qؓ什么又会引发段故障呢?很多情况是由指针和强制cd转换引v的,如:
union{
char a[10];
int i;
}u;
int *p = (int *)&(u.a[1]);
*p = 17;
当然Q还有一些其它原因会引v“ȝ错误”Q如奇偶校验码错误,所引用的内存块不存在。但是现在,内存都有g电\和修正Q一般不会再传到软g层了Q除了驱动程序,一般也不会引用不存在的内存块?/p>
D错误,一般是׃引用不位于自q地址I间的地址引v的。最常见的就是通过一个未初始化,或者有非法值的指针引v的,如:int *p = 0; *p = 7; 而导致指针的非法值可能是׃不同的编E错误引LQ比?#8220;ȝ错误”更加间接?/p>
D错误一般是q件段表{换机构的错误引发Q如Sung中的内存理单元(MMU)?/p>
q有一个微妙之处是Q如果未初始化的指针恰好h未对齐的|它将产生ȝ错误Q而不是段错误?/p>