linux0.11 内存结构


Linux0.11,内存最多支持16M,其中0-1M是内核去,实际内核使用是从0-640k,从640k-1M的区域,分别是显存,bios区域,高速缓冲区,1-16M是是主内存区域。

在内存内核区域当中,从0开始,首先存放的是页目录表,占4kb,之后的3个是页表,每个4kb,每个页表包含一个数组,每个数组共1024项,即每项4个字节,这个也定义在/include/linux/head.h当中。

在内核区域中,最重要的区域之一是idtgdt2个合起来占1页内存。每个占2k内存。二者的定义在/include/linux/head.h当中。

#ifndef_HEAD_H
#define_HEAD_H
typedefstructdesc_struct
{                           // 定义了段描述符的数据结构。该结构仅说明每个描述
    unsignedlonga, b;           // 符是由个字节构成,每个描述符表共有项。
}desc_table[256];
externunsignedlongpg_dir[1024];      // 内存页目录数组。每个目录项为字节。从物理地址开始。
//#define pg_dir((unsigned long*)0)
externdesc_tableidt,gdt; // 中断描述符表,全局描述符表。
#defineGDT_NUL 0              // 全局描述符表的第0项,不用。
#defineGDT_CODE 1           // 第1项,是内核代码段描述符项。
#defineGDT_DATA 2           // 第2项,是内核数据段描述符项。
#defineGDT_TMP 3             // 第3项,系统段描述符,Linux 没有使用。
#defineLDT_NUL 0              // 每个局部描述符表的第项,不用。
#defineLDT_CODE 1            // 第项,是用户程序代码段描述符项。
#defineLDT_DATA 2            // 第项,是用户程序数据段描述符项。
#endif

从上面的代码可以看出来,idt,gdtdesc_struct结构的,每个都是256项。

每项包含2个部分,每个部分4个字节,

idt存放的是中断描述符表。

gdt中存放的是全局描述符表。gdt当中,第0项为null,第1项为代码段描述,第2项为数据段描述符,第3项为系统段描述符,未使用,为null。从第4项开始,存放进程的相关信息,每个进程使用2项,对于每个进程,第一项是tssn,2项是ldtn,其中n为进程标号。从这里就可以看出来linux0.11最多容纳127个任务,但实际上,linux0.11规定,最多有64个任务同时存在。

对于80386,有32根地址线,可以寻址4G的地址空间,tssn描述符内,存放的正是任务号为ntss段的地址,ldtn描述符内,有任务号为nldt描述符地址。

Linux0.11规定,每个任务的虚拟地址范围为64M。每个任务都包含一个task_union的联合体,包含一个task_struct结构体和一个堆栈数组。

uniontask_union
{// 定义任务联合(任务结构成员和stack 字符数组程序成员)。
    structtask_structtask;// 因为一个任务数据结构与其堆栈放在同一内存页中,所以
    charstack[PAGE_SIZE];// 从堆栈段寄存器ss 可以获得其数据段选择符。
};


linux0.11 内存结构,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。