实验环境
本文假设已经创建虚拟机并配置好Ubuntu 16.04(网上太多教程了,所以这里就不赘述了)。
X86-32硬件介绍
x86指的是80386这种机器(一种32位CPU,在早期得到了广泛的应用),大概理解为一种32位的CPU就行。
段寄存器主要是用来寻址,注意在实模式和保护模式下寄存器中同样的值会有不同的含义。
EIP要和CS结合使用,具体含义如果学过微型计算机相似的课程都知道怎么回事,这里就不解释了。
UCORE部分编程技巧
这部分主要关于上图中的内容。
为什么要介绍?因为UCORE基于C开发,但是又用到了上述内容,所以要解释下。
例如上图中就是用了面向对象的编程方法。这部分代码用来建立一个物理内存的管理器,这样主要是为了能够让在调用这里定义好的函数接口的时候接口不会改变,尽管接口的实现方式在不同的连续内存分配方法上是不一样的。
上图为通常的双链表定义
上图为uCore的双向链表结构的定义(我觉得图中的list_entry
和list_entry_t
是同一个东西),不过可以不只是用在双向链表上。上图中page
(因为它里面定义了page_link
)可以和free_area
建立链接关系,同时它里面还可以定义别的成员变量来装特定的数据,这样就可以针对不同数据结构对成员变量的要求来改变page
的定义,因此可以更灵活简洁地实现各类数据结构。
上图中的free_area
相当于是链表的头节点。图中le2page
用来寻找到某个page
的头节点的实现:
le2page
包含两个模块,一个是指针le
(宿主数据结构的链表节点的指针),一个是member
(成员变量)。to_struct
多一个Page
,表示这个链表节点。to_struct的作用就是用当前链表节点的地址减去offset(Page
所在位置减去成员的偏移值),这样就可以计算出宿主数据结构头指针的地址。offsetof
的type就是Page
,注意(type*)0
,它不是代表具体的一个地址,而是合在一起代表了这种member
成员变量在这个类型type
中的一个偏移值。
可能要装的一些软件
这里假设是在Ubuntu 16.04下进行的。
要装的有:
sudo apt install eclipse-cdt git meld vim
上面的不完全,到时候用到再补充。我比较习惯用vim
这款编辑器,所以这里列了vim
,可以选别的。