| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3363 人关注过本帖
标题:Linux 0.11
取消只看楼主 加入收藏
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
结帖率:98.63%
收藏
 问题点数:0 回复次数:23 
Linux 0.11
新学期开始,读 linux 0.11 代码注释,

不定期更新自己觉得有必要注意的东西,希望自己可以坚持

对于linux 0.11内核,系统设置全局描述符表 GDT 中的段描述符项数最大为256,

其中 2 项空闲,2 项系统使用,

每个进程使用两项。因此,此时系统可以最多容纳 (256-4)/2 + 1=127 个任务,

并且虚拟地址范围是 ((256-4)/2)* 64MB约等于 8G。

但0.11内核中人工定义最大任务数 NR_TASKS = 64 ,

每个进程虚拟地址(或线性地址)范围是 64M(2^26 字节),

并且各个进程的虚拟地址起始位置是(任务号-1)*64MB。

因此所使用的虚拟地址空间范围是64MB*64=4G.


图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 madfrogme 于 2012-10-3 23:06 编辑 ]
搜索更多相关主题的帖子: Linux 系统 任务 
2012-09-28 23:24
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
页目录和页表的结构是一样的, 表项结构也相同。

页目录表中的每个表项(简称页目录项)(4字节)用来寻址一个页表,

而每个页表(4字节)用来指定一页物理内存页。

因此,当指定了一个页目录和一个页表项,

我们就可以唯一地确定所对应的物理内存页。

页目录表占用一页内存,因此最多可以寻址1024个页表。

而每个页表也同样占用一页内存,因此一个页表可以寻址最多1024个物理内存页面。

这样在80386中,一个页目录表所寻址的所有页表共可以寻址

1024 * 1024 * 4096 = 4G 的内存空间。 在linux 0.11 内核中,

所有进程都使用一个页目录表, 而每个进程都有自己的页表

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 madfrogme 于 2012-10-3 23:07 编辑 ]

The quieter you become, the more you can hear
2012-09-28 23:48
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
线性地址的位31-22 共10个比特用来确定页目录中的目录项,

位21 -12 用来 寻址页目录项指定的页表中的页表项,

最的12 个比特正好用作页表项指定的一页物理内存的偏移地址(2 ^12 = 4096)

图片附件: 游客没有浏览图片的权限,请 登录注册

The quieter you become, the more you can hear
2012-09-28 23:58
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
以下是引用有容就大在2012-9-29 01:46:51的发言:

并且虚拟地址范围是 ((256-4)/2)* 64MB约等于 8G。
只用4G 还有4G拿来干什么?


剩下4G拿来干什么我暂时没法清楚的解释,但我感觉到的问题是

现在的linux内核每一个进程都能寻址4G的空间,

但0.11 的每个进程都只有64MB的寻址空间,

用一个4G的虚拟空间就能容得下64个进程且不互相打扰,这和现在的虚拟空间明显不同,只是我也解释不清楚

很明显当时的物理内存不会有那么大,所以只是一个对虚拟地址理解的问题了,我感觉。

互相学习

这几张图应该是基础,等我慢慢深入理解下去,尽量把细节也表现出来


[ 本帖最后由 madfrogme 于 2012-9-29 02:17 编辑 ]

The quieter you become, the more you can hear
2012-09-29 01:12
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
以下内容应该不局限在0.11内核, 地址转换发生在两处, 实模式中和保护模式中

实模式中
逻辑地址(logical address) : segment : offset
计算方式: segment address * 16 + offset
比如:
FFFF : 0001 则结果是 FFFF * 16 + 0001 = FFFF1

保护模式中
段寄存器(segmentation registers)
逻辑地址: segment identifier : offset
其中segment identifier 就是16位的 segment selector
offset 为 32位

可以从处理器的段寄存器(segment registers)中快速获得segment selector
总共有六个这样的寄存器
CS:code segment
DS : data segment
SS : stack segment
FS :
GS :
其中CS 寄存器有2 位 用来指定CPU 的 CPL (Current Privilege level),0到3
linux中使用0 表示内核模式, 3表示用户模式

图片附件: 游客没有浏览图片的权限,请 登录注册

其中13个位的index 是GDT/LDT 的入口(entry pointer)
所以说每个段寄存器(segment register)都会被映射到处理器中一个不可编程的寄存器(non programmable register )
从而把你引向段描述符(Segment descriptor)


段描述符( segment descriptor )
每个段(segment)都会通过8个字节的段描述符(segment descriptor)来表示
他们被存在GDT或LTD 中(Global descriptor table 和 Local descriptor table)
一般一个CPU有一个GDT, 但每个进程都会有自己的LDT


[ 本帖最后由 madfrogme 于 2012-9-29 11:08 编辑 ]

The quieter you become, the more you can hear
2012-09-29 09:51
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
迟迟不敢下手GDT,继续巩固周边概念
Segment
a logically contiguous chunk of memory with consistent properties (CPU's speaking)

Segment Register
a register of your CPU that refers to a segment for a special use (e.g. SS, CS, DS ...)

Selector
a reference to a descriptor you can load into a segment register;
the selector is an offset of a descriptor table entry.
These entries are 8 bytes long, therefore selectors can have values 0x00, 0x08, 0x10, 0x18, ...


Descriptor
a memory structure (part of a table) that tells the CPU the attributes of a given segment


[ 本帖最后由 madfrogme 于 2012-9-29 11:32 编辑 ]

The quieter you become, the more you can hear
2012-09-29 10:28
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
下面的内容不是对0.11内核的讨论。是对更一般的linux的讨论

在保护模式中,逻辑地址由一个16位的段选择子(Segment Selector) 和一个32位的偏移量(Offset)构成,

而段寄存器(Segmentation registers)只能存储16位的段选择子(Segment Selector).

所以为了加快从逻辑地址到线性地址的转换,80x86处理器提供了额外的不可编程(nonprogrammable)寄存器,

每个不可编程寄存器(nonprogrammable register)里面都是一个8字节的段描述符(Segment Descriptor),

这8字节的段描述符是由相应段寄存器(segmentation register)中的段选择子(Segment Selector)决定的。

每次当一个段选择子(Segment Selector)被 加载到一个段寄存器(segmentation register)中时,

相应的段描述符(Segment Descriptor)就会从内存中被加载到相应的不可编程(nonprogrammable)CPU寄存器中


之后,对段(Segment)的逻辑地址的转换工作就不需要依靠再去访问主内存中的GDT或是LDT了。

因为段描述符(Segment Descriptor)为8字节,

所以它在GDT或者LDT中的相当地址可以通过用 8 乘以 段选择子(Segment Selector)中的那13位来获得。

比如GDT的地址为0x00020000(GDT的地址存储在gdtr寄存器中)并且段选择子(Segment Selector)的那index 的13位 指定的值为2,

于是相应的段描述符的地址就是 0x00020000 + (2 * 8 ) , 结果是0x00020000。

GDT的第一个入口(first entry)永远都被设为0,这就保证了一个空的段选择子(null Segment Selector)会被认为是无效的,

并且引起 processor exception。 GDT中可以存储的最多 8191个 段描述符(Segment descriptors)因为, 2^13 -1 为 8191


图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 madfrogme 于 2012-9-29 17:27 编辑 ]

The quieter you become, the more you can hear
2012-09-29 16:25
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
以下是引用有容就大在2012-9-29 12:16:09的发言:

  全局描述表(GDT Global Descriptor Table)是一个数据结构?
是个数组吗?他的下标索引就是segment selector 的前13位吧 我这个理解有没错?

对的,目有错,段描述符位置的计算方法 是 下标(比如2)* 8 再加上 gdtr 中的值,就可以算出来了,

至于具体是什么样的数据结构,我看晚上能不能把它写出来,我也是在一点一点摸索

The quieter you become, the more you can hear
2012-09-29 16:32
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
以下是引用zklhp在2012-9-29 17:35:25的发言:

还用看这个么 有专门的讲描述符表的书啊。。。

我在这里写的都是从四面八方搜集来的我觉得有用的东西,总体说来也算是归纳起来,给自己理清思路用的。

这几天我会主要看地址转换,过几天也就换主题了,就是人们说的好记性不如烂笔头

[ 本帖最后由 madfrogme 于 2012-9-29 19:02 编辑 ]

The quieter you become, the more you can hear
2012-09-29 17:30
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
以下是引用信箱有效在2012-9-29 18:47:37的发言:

[ 本帖最后由 madfrogme 于 2012-9-29 18:32 编辑 ]

我这里怎么才17点50呢

真细心啊,我确实快一个小时

The quieter you become, the more you can hear
2012-09-29 18:00
快速回复:Linux 0.11
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017157 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved