linux 0.11目录,linux0.11 内存结构

2b239d5c1960d316ccceedba0305b09f.png

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

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

在内核区域中,最重要的区域之一是idt和gdt。2个合起来占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,gdt是desc_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描述符内,存放的正是任务号为n的tss段的地址,ldtn描述符内,有任务号为n的ldt描述符地址。

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

{// 定义任务联合(任务结构成员和stack 字符数组程序成员)。

structtask_structtask;// 因为一个任务数据结构与其堆栈放在同一内存页中,所以

charstack[PAGE_SIZE];// 从堆栈段寄存器ss 可以获得其数据段选择符。

};

带中文注释可成功编译运行的Linux0.11+Bochs2.62实验环境说明 此注释以网上获得的“linux带中文注释的0.11版本”为基础,对照赵炯博士《Linux内核完全注释(0.11) 》V3.0版(http://oldlinux.org/download/clk011c-3.0.pdf)编辑而成。作为对赵博士感谢,以及对Linux初学者的回馈,特发布在CSDN上。 此注释可以在http://oldlinux.org/Linux.old/bochs/提供的Linux-0.11-devel-XXXXXX实验环境下正确编译成功,使用:"make disk"命令重启Bochs虚拟机后,新编译源码直接生效,便于学习者直接阅读源码,直接进行实验。 注意事项: 1、为了使注释版与实验环境上的Linux0.11内核保持一致,达到对应文件可以互换的目的,与Linux0.11原始版本相比,加入了15个系统调用函数(参见include/Linux/sys.h第78-92行。赵博士原书没有这部分注释,我不敢班门弄斧),其它相关的文件加入了相应的定义。新加入的代码只有函数体定义,没有具体实现,对其它原始代码没有改变、没有影响。 2、键盘定义改成了美式键盘(原始代码中是芬兰键盘,会导致个别键出问题,调试的时候我曾被迷糊了好久,以为自己把程序搞乱了)。 3、把网上VC版的注释统一改成了 “/* */” 格式的注释。经测试,在Linux0.11实验环境中(gcc1.40),只有标准C注释语法可以正常编译。 4、由于《Linux内核完全注释(0.11) 》原书版本更新的原因,注释中提到的图、表可能与V3.0版书中不一致。 5、由于代码中加入注释,代码行号发生变化,注释中提到的代码行号会出现不一致,建议对照3.0版查询对应内容。 6、实验方法:请先安装附带的Bochs2.62版安装包,双击Test.bxrc即可启动实验系统,执行命令:sh t,即可完成对linuxcn的编译。 7、linux目录中是此实验系统中/usr/src/linux提取出来的不含中文注释的linux0.11源码(此版本比原始的0.11版多15个系统调用函数),linuxcn是加入了中文注释的源码。 8、diskb.img是实验系统与Windows环境下进行文件交换的1.44M软盘映像,执行脚本命令"sh t"时会自动从此映像中读取linux.tar、linuxcn.tar包,解包并编译,编译结果在:/usr/root/zw/linuxcn目录下。为了方便文件交换,建议使用7zip为压缩/解压缩工具(7zip可以直接生成tar包),用WinImage实现Windows环境与软件映像交换文件。 9、实验系统下 .profile中加入了几个命令,请读者注意。 10、若实验环境的启动盘被破坏,请用压缩包中的bootimage-0.11-hd覆盖对应文件即可。 11、若实验环境的要命文件系统被破坏,请用压缩包中的hdc-0.11-new.img覆盖对应文件即可。 2014-5-4 cyfx2288
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值