| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3373 人关注过本帖
标题:Linux 0.11
只看楼主 加入收藏
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
结帖率:98.63%
收藏
 问题点数:0 回复次数:49 
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
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
并且虚拟地址范围是 ((256-4)/2)* 64MB约等于 8G。
只用4G 还有4G拿来干什么?

梅尚程荀
马谭杨奚







                                                       
2012-09-29 00:46
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
好好  那几张图太强悍了 对页表映射机制有了进一步的认识。

梅尚程荀
马谭杨奚







                                                       
2012-09-29 00:49
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
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
现在才知道原来一个段寄存器有16 bit的可见部分 还有64 Bit的不可见部分
这些和segment selector / segment discription 有很大关系啊。。。

梅尚程荀
马谭杨奚







                                                       
2012-09-29 11:13
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
  全局描述表(GDT Global Descriptor Table)是一个数据结构?
是个数组吗?他的下标索引就是segment selector 的前13位吧 我这个理解有没错?


[ 本帖最后由 有容就大 于 2012-9-29 11:18 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-09-29 11:16
快速回复:Linux 0.11
数据加载中...
 
   



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

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