limit为32BIT的前20BIT,后12BIT自然是从0到FFF了。

解决方案 »

  1.   


     /--- limit 值 ---/------20 bit------\/--12 bit--XXXXXXXXXXXXXXXXXXXX000000000000 ----- 下界XXXXXXXXXXXXXXXXXXXX111111111111 ----- 上界
      

  2.   

    可能你所说的“段界限以4k为单位”这句话可能会让你产生误解,实际上正确的
    说法是段属性中的分配粒度为4k,一般情况下当粒度为1时,20位的段限值就是实际
    的段界限值,而当分配粒度为4k时,描述符中的段限值a需要乘以4k再加上0xfff才
    是真正的段限值,即a*4k+0xfff,这里为什么要加上0xfff,我个人想法是为了处理
    机处理上的方便性,因为,机器接受应用程序传来的段内32位偏移,就可以直接将
    偏移值和0xfffff000做and运算就可以比较了,当然如果不加上0xfff而是将段限值
    加一也可以将前一地址范围包含在内,但是将会多包含一字节进来,而这多加的一字
    节不是用户考虑在内的,本来用户指定不可访问的这一字节的内容将能够被访问,这
    是错误的,而上面这种做法不会有问题。例如,用户想要为自己的段指定16k的空间,他就可以将段限设为3,而分配粒度设为
    4k(当然这个例子并不需要使用4k粒度的方式),这样他在程序中就以偏移0-3*4k+0xfff
    可以访问该段中所有的内存,而不会越界,如果考虑将段限设为4,而不允许加上0xfff,
    他仍然能够访问该段内存,但是可访问的内容将是 0-4*4k,与上面的 0- 3*4k-1多出
    一字节。