引题:

0.11内核版本代码在do_exit函数中需要获取段的基址和长度

  free_page_tables (get_base (current->ldt[1]), get_limit (0x0f));

  free_page_tables (get_base (current->ldt[2]), get_limit (0x17));这两个函数中调用了get_base 和get_limit 这两个宏来获取段基址和段长度,段基址的获取比较好理解,从描述符中按照描述符结构获取即可。但是get_limit就比较难理解了

extern _inline unsigned long get_limit(unsigned long segment) { 

//    unsigned long __limit; 

    _asm { 

        mov eax,segment 

        lsl eax,eax 

//        mov __limit,eax 

    } 

//    return __limit; 

}

按照这份代码,mov eax,segment,获取的是DS:segmen中指向的段描述符信息。lsl eax,eax 只是一个逻辑左移命令,怎么可能获取到端长度。


真正的实现:

实际上此处应该是写错了,在这部分代码下有注释掉的代码:

/*

unsigned long __limit; \

__asm__( "lsll %1,%0\n\tincl %0": "=r" (__limit): "r" (segment)); \

__limit;})

*/

实际上用的是lsll指令获取段长度。估计是谁在修改此代码的时候改错了,但是也没有进行编译。