Chinaunix

标题: 没见过这么垃圾的人,还当版主mik! [打印本页]

作者: rawa9999    时间: 2009-09-21 08:55
标题: 没见过这么垃圾的人,还当版主mik!
LDTR是多少位寄存器?16位。386就是一个32位16位的混合处理器,不然怎样运行当时的16位程序,动不动就是手册,根本不动脑子。你为什么结帖?懒得跟你废话。88
作者: yidou    时间: 2009-09-21 09:27

作者: www_xylove    时间: 2009-09-21 09:55

作者: rawa9999    时间: 2009-09-21 10:25
罗列了这么多手册内容,东拼西凑,还结帖了。晕
386GDTR寄存器可管理虚拟内存能力达到64T是硬件能力,是实实在在的,怎么说无意义呢?虽然仅仅增加一个寄存器和几条指令就有点简单,但这是硬件能力你懂吗!
作者: liying_gg    时间: 2009-09-21 10:30

作者: rawa9999    时间: 2009-09-21 10:39
386 是 32 位寄存器和 16 位寄存器混合的处理器。
指令兼容16位指令,又有16位寄存器(可能你不知道LDTR不是真正的寄存器,是缓存的一段空间,这个你的手册上没有)你回答我这是什么样的处理器呢?
作者: rawa9999    时间: 2009-09-21 10:45
需要较多的时钟周期,并不是因为你说的这个原因,而是因为需要权限,它需要做更多的检测 check 工作

那好你回答我32bit的处理器一个时钟周期(一次电流从波谷到波峰再到波谷,整天看手册,这个手册上没有)怎么处理一个48bit的数据?(需要使用通用寄存器才算数)
作者: rawa9999    时间: 2009-09-21 10:47
虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。
选择符的索引部分由13 个比特位表示,加上区分GDT 和LDT 的1 个比特位;
因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长度都取最大值4G,则最大虚拟地址空间范围是16384 * 4G = 64T

GDT只有一个怎么算出的16384???
作者: rawa9999    时间: 2009-09-21 10:52
16位段限存储虚拟内存页文件的索引编号,16位其中有两位表示该内存分页的特权级别。啥东东,明明是 segment,说成 page

page你的手册上没有,因为这是OS的实现,是利用段寻址能力。win系统不能管理64T虚拟内存,实际上只能能管理2^13*4G的虚拟内存。
作者: prolj    时间: 2009-09-21 12:19
支持PK,扯虚的没用。
作者: epegasus    时间: 2009-09-21 12:22
page功能是CPU提供的.
作者: rawa9999    时间: 2009-09-21 12:54
此page非彼page ,386能管理64T,win只能管理2^13*4G 就是说这两个page的不同。mik的手册肯定是对,但他未必看明白。
作者: rawa9999    时间: 2009-09-21 13:18
简单点,mik说64T根本没有这回事,这是彻底错误的。

立即寻址(immediate addressing):操作数包含在指令中
直接寻址(direct addressing):操作数的地址包含在指令中
间接寻址(indirect addressing):指令中包含一个存有实际操作数地址的指示器(如寄存器)。
相对寻址(relative addressing):地址由计算机再处理产生

虚拟内存属于间接寻址(indirect addressing)386中叫做寄存器间接寻址(Register Indirect Addressing),因为64T空间的任何一个地址都可以存方在48bit的寄存器中,但不能一个指令存取,因为通用寄存器都是32位的,需要读高低位,但是这个48bit寄存器的存在表示一个指令就能完成一次64T空间范围的地址指向。
作者: emperor    时间: 2009-09-21 14:17
不知道lz要说什么
这帖子应该转清茶。。。。
作者: rawa9999    时间: 2009-09-21 14:59
mik把没讨论完的帖子锁了,有什么办法?其实这个问题网上很多人发问,但是没人回答清楚,正好讨论一下。他得出结论,罗列了手册云云,结果说无意义,结帖了。386支持64T虚拟内存是官方的说法。无意义???
作者: newIT666    时间: 2009-09-21 15:12
原帖由 emperor 于 2009-9-21 14:17 发表
不知道lz要说什么
这帖子应该转清茶。。。。


原因是这里:
http://linux.chinaunix.net/bbs/thread-1134053-1-1.html

学习一下.
作者: rawa9999    时间: 2009-09-21 15:24
我是看了一些文章分析得来的,这个问题网上至今没有定论,正好分析一下!关注高手分析,我不是高手,但是认为mik罗列手册也不是。
这是我的观点

GDTR是一个长度为48bit的寄存器,内容为一个32位的基地址和一个16位的段限。这是386一个专门用来寻找虚拟内存的寄存器。32位基地址是物理内存的地址,16位段限存储虚拟内存页文件的索引编号,16位其中有两位表示该内存分页的特权级别。最大内存索引虚拟内存2^14*4G=64T
--------
分析:由于GDTR是48bit寄存器,CPU通用寄存器是32bit(还有16bit)所以一个指令周期根本不能处理这个48bit的寄存器,需要很多指令操作这个寄存器。欢迎讨论。
386的GDTR寄存器选择48bit是因为386是一个32位寄存器和16位寄存器混合的处理器,两部分数据分别由两种类型的通用寄存器处理。直接寻址就是一个指令周期能读入和写出的地址。GDTR寄存器仅仅代表了一种能力,可以软实现。
作者: emperor    时间: 2009-09-21 15:52
原帖由 rawa9999 于 2009-9-21 14:59 发表
mik把没讨论完的帖子锁了,有什么办法?其实这个问题网上很多人发问,但是没人回答清楚,正好讨论一下。他得出结论,罗列了手册云云,结果说无意义,结帖了。386支持64T虚拟内存是官方的说法。无意义???

早该结贴了,4G的寻址.管理64T空间,两个层面的事儿.讨论关公战秦琼么?......

[ 本帖最后由 emperor 于 2009-9-21 15:54 编辑 ]
作者: emperor    时间: 2009-09-21 16:00
原帖由 rawa9999 于 2009-9-21 10:39 发表
386 是 32 位寄存器和 16 位寄存器混合的处理器。
指令兼容16位指令,又有16位寄存器(可能你不知道LDTR不是真正的寄存器,是缓存的一段空间,这个你的手册上没有)你回答我这是什么样的处理器呢?

386 SX和DX不同,只说一个很片面..........
作者: newIT666    时间: 2009-09-21 17:25
原帖由 rawa9999 于 2009-9-21 10:39 发表
LDTR不是真正的寄存器,是缓存的一段空间


不懂,学习了.
作者: vxasm    时间: 2009-09-21 18:08
原帖由 rawa9999 于 2009-9-21 10:47 发表
虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。
选择符的索引部分由13 个比特位表示,加上区分GDT 和LDT 的1 个比特位;
因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长 ...


感谢LZ,听你这样一说,我也清楚多了,14个比特位,2^14*4G=64T,不错,不错。

PS:这是技术论坛,本来就是大家自由讨论技术的地方,观点不同,可以各抒已见啊。个人认为,像mik版主这样,武断地认为帖子没意义,自己却又Balabala说一大通错错对对,然后咣当一声锁贴,实在是有损版主风范。
作者: mik    时间: 2009-09-21 20:49
rawa9999  你有没有大脑的? 你会不会思考的?

我锁贴的时间是:2009-9-20 23:25   回复你的时间是:2009-9-20 23:45  

锁贴的原因是:这样的贴子根本没必要再讨论下去。 锁了之后,看了你的回复不对才回复的。


像你这个贴子里的发言,不值一批!

就光1楼里:

>> “LDTR是多少位寄存器?16位。386就是一个32位16位的混合处理器,不然怎样运行当时的16位程序”
就笑死我了。




跟你这样的人多说一句就是浪费时间!

我倒不如写多几行代码!
作者: 开垦的土地    时间: 2009-09-21 22:11
说的什么啊,我怎么不明白啊
作者: rawa9999    时间: 2009-09-22 09:43
386CPU是一个16位和32位混合的处理器,这个不是我说的。

虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。
选择符的索引部分由13 个比特位表示,加上区分GDT 和LDT 的1 个比特位;
因此Intel 80X86 CPU 共可以索引16384 个选择符。
———————————————————————————
这个也不是我说的。GDT只有一个表,所以无法得出16384,必须分析GDTR处理地址的过程,mik列不出这些汇编指令所以他也不是高手,给出一段处理一个虚拟地址的源码就清楚了。
几乎所有的386CPU都有64T虚拟内存这个承诺。

mik你认为不对,为什么不反驳我呢?我知道你很忙在写代码,那就列出些源码吧。分析GDTR处理地址的过程。64T,16、32位混合CPU这不是我说的,你站错位置了。
作者: mingyanguo    时间: 2009-09-22 10:29
真是服了,这麽个没含氧量的问题值得争来争去。
谁先定义一下“虚拟内存大小”怎么计算?一个进程所能寻址的地址空间大小?所有进程能寻址的地址空间大小之和?虚拟地址段相加怎么算?是直接把大小求和还是做集合合并?intel在手册上说,线性地址是32位,那虚拟地址算出和超过32位怎么办,只取32位?还是无视32位限制只定义概念?明明都是些似是而非的概念,一定要翻来覆去的辩。谁能在现在的x86手册找出CPU的“虚拟内存大小”的准确定义或者大小也可以直接砸出来,免的没个了解。

BTW. 从旁观的角度,我觉得版主确实应该适当的注意一下措词,bbs上的交流毕竟只限于文字,容易产生误会。
作者: gilet    时间: 2009-09-22 14:39

作者: yy_galois    时间: 2009-09-22 17:48
都是高手,我是来膜拜兼围观的。
作者: rawa9999    时间: 2009-09-23 03:45
恩,关于表限我说错了。实际上我所说的LDT索引存放在LDTR寄存器中,不是GDTR的低16位,GDTR存放是表长度,这部分程序不可见,所以存放在哪用户也看不到这个过程:

LDTR寄存器 LDTR高速缓存
   15 0              47 16               15 0
选择符(16位) LDT表基址(32位)表限(16位表长度)

LDTR寄存器中的16位
Bit15~Bit3:选择子
Bit12:0表示GDT 1表示 LDT
Bit0~Bit1:处理器当前运行的级别--CPL,四个等级0、1、2、3

LDTR寄存器本质上是一个16位段寄存器,386段寄存器的最大可用选择是2^14而不是2^16
所以LDTR寄存器最大可选虚拟内存是2^14*4G=64T,这个跟GDT和LDT根本没关系。至于段
寄存器的剩余两位则表示CPL(CPU运行权限或级别)。终于把这个问题搞清楚了。欢迎不同观点。

---------------------------------------------
给出一个定位内存和虚拟内存的源码

call 1a:804304c (call cs:eip即cs = 1a, eip = 804304c)
target_cs = 1a;
target_eip = 0x0804304c;
CPL = CS.RPL;            /* 当前执行的代码段的权限级别就是CPL */
RPL = target_cs.RPL;     /* 目标段 selector 的低3位是RPL */
target_si = target_cs.SI;    /* 目标段 selector 的索引是Bit15~Bit3 */
target_ti = target_cs.TI;    /* 目标段selector的描述符表索引是Bit2 */
CODESEG_DESCRIPTOR target_descriptor;

if (target_ti == 0) { /* target_cs.TI为0 就是参考到 GDT(全局描述符表) */
/* 以GDTR寄存器的base 为基地址加上selector的索引乘以8即得出目标
       段描述符,目标描述符的DPL就是目标段所需的访问权限 */
    target_descriptor = GDTR.base + target_si * 8

} else {               /* 否则就是参考 LDT (局部描述符表)*/
    /* 以 LDTR寄存器的base 为基地址得出目标段描述符 */

target_descriptor = LDTR.base + target_si * 8;
}
DPL = target_descriptor.DPL;     /* 获取DPL */
if (target_descriptor.type & 0x06) { /* conforming */
if (CPL >= DPL) {   /* 允许执行高权限代码 */
     /* go ahead */
    } else {
     /* 引发 #GP 异常 */
    goto DO_GP_EXCEPTION;
}

} else {                  /* nonconforming */
    if (CPL == DPL && RPL <= CPL) {  
        /* go ahead */
    } else {
        /* 引发 #GP 异常 */
       goto DO_GP_EXCEPTION;
    }
  
}
/****** go ahead … …******/
CS = target_cs;           /* 加载目标段CS 进入 CS 寄存器 */
EIP = target_eip;        /* 加载目标指令EIP 进入 EIP 寄存器 */
                 /* 当前执行权限 CPL 不改变 */

goto target_descriptor.base + target_eip; /* 跳转到目标地址执行 */

DO_GP_EXCEPTION:     /* 执行 #GP异常点 */
           … …
作者: rawa9999    时间: 2009-09-23 03:55
关键是解决问题,讽刺、漫骂不能解决问题,我说话也有点过,抱歉。
作者: mik    时间: 2009-09-23 07:54
原帖由 rawa9999 于 2009-9-23 03:45 发表
恩,关于表限我说错了。实际上我所说的LDT索引存放在LDTR寄存器中,不是GDTR的低16位,GDTR存放是表长度,这部分程序不可见,所以存放在哪用户也看不到这个过程:
LDTR寄存器 LDTR高速缓存
   15 0         ...

没见过你这样无耻的人

不知从哪抄了我2年前写的东西,还在我面前乱喷

真无耻呀,拿了别人东西﹑还不尊重作者

http://blog.chinaunix.net/u/11773/showart_368316.html

下次引用资料看清楚了,傻b
作者: rawa9999    时间: 2009-09-23 08:32
呵呵,我承认这个确实是我找来的,你说是你写的,这个无法佐证,也不是你的博客,但是你为什么不贴出来让大家明白呢?
你说你写的你给大家讲解一下吧
作者: rawa9999    时间: 2009-09-23 08:55
2007年2月的帖子
http://bbs.gd-emb.org/archive/?/t-8890.html

我贴这段源码的原因是为了辅助说明一下,64T跟GDT和LDT根本没关系。
你的博客有这段源码,要想证明你就发帖讲解一下。SB
作者: rawa9999    时间: 2009-09-23 08:57
恩,关于表限我说错了。实际上我所说的LDT索引存放在LDTR寄存器中,不是GDTR的低16位,GDTR存放是表长度,这部分程序不可见,所以存放在哪用户也看不到这个过程:

LDTR寄存器 LDTR高速缓存
   15 0              47 16               15 0
选择符(16位) LDT表基址(32位)表限(16位表长度)

LDTR寄存器中的16位
Bit15~Bit3:选择子
Bit12:0表示GDT 1表示 LDT
Bit0~Bit1:处理器当前运行的级别--CPL,四个等级0、1、2、3

LDTR寄存器本质上是一个16位段寄存器,386段寄存器的最大可用选择是2^14而不是2^16
所以LDTR寄存器最大可选虚拟内存是2^14*4G=64T,这个跟GDT和LDT根本没关系。至于段
寄存器的剩余两位则表示CPL(CPU运行权限或级别)。终于把这个问题搞清楚了。欢迎不同观点。
---------------------
你批驳一下我的观点!
作者: rawa9999    时间: 2009-09-23 09:24
从你的文章根本读不出64T的根本原因,以上是我的观点,根本跟那个源码是两码事,所以用---------------线分割。SB
作者: rawa9999    时间: 2009-09-23 09:50
我仔细看了两段源码错误也一样,谁抄谁的?我的这段源码地址也忘记了,所以无法从时间上判断,大家可以分析一下在网上哪个版本应该是原版。即便是mik的是原版,他也没能从这个源码当中得出64T虚拟内存的结论。

[ 本帖最后由 rawa9999 于 2009-9-23 09:52 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2