Updates from 三月, 2017 Toggle Comment Threads | 键盘快捷键

  • jinzihao pm3:37 on 2017年3月1日 链接地址 | 回复
    Tags:   

    static struct gatedesc idt[256] = {{0}};
    

    这行代码看起来有点奇怪…
    其实struct也可以用{value1, value2, …}的方式初始化,与数组的初始化类似,例如:

    struct gatedesc idt1 = {7};
    

    表示idt1的第一个元素用7初始化,其余元素用0初始化。
    因此开始这行代码表示新建一个大小为256的gatedesc数组,数组的每一项的每个元素(或说“成员变量”)都是0。

     
  • jinzihao pm2:46 on 2017年3月1日 链接地址 | 回复
    Tags: , x86   

    C语言struct定义中的冒号(“:”) 

    在C语言的struct定义中,可以使用冒号(“:”)来指定struct中的元素所占的bit数,注意是bit不是byte,因此可以出现诸如3bit、11bit的元素,如下面这段代码所示:

    struct gatedesc {
        unsigned gd_off_15_0 : 16;        // low 16 bits of offset in segment
        unsigned gd_ss : 16;            // segment selector
        unsigned gd_args : 5;            // # args, 0 for interrupt/trap gates
        unsigned gd_rsv1 : 3;            // reserved(should be zero I guess)
        unsigned gd_type : 4;            // type(STS_{TG,IG32,TG32})
        unsigned gd_s : 1;                // must be 0 (system)
        unsigned gd_dpl : 2;            // descriptor(meaning new) privilege level
        unsigned gd_p : 1;                // Present
        unsigned gd_off_31_16 : 16;        // high bits of offset in segment
    };

    这个数据结构对应于如下两种x86架构下的中断描述符(IDT):

    这种语法在表示一些带有非整字节元素的数据结构时非常方便,例如x86架构定义的一些数据结构,或是类似IPv4的网络协议头,可以免于用C++的成员函数的方式来封装。

     
c
写新的
j
下一篇文章/下一个回复
k
前一篇文章/以前的回复
r
回复
e
编辑
o
显示/隐藏 回复
t
回到顶部
l
go to login
h
show/hide help
shift + esc
取消