免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1944 | 回复: 3
打印 上一主题 下一主题

内核理解 有一定难度 [复制链接]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-09 23:44 |只看该作者 |倒序浏览
10可用积分
赵炯说的:

对于Linux 0.12系统,内核设置全局描述符表GDT中的段描述符项数最大为256,其中2项空闲、2项系统使用,每个进程使用两项。因此,此时系统可以最多容纳(256-4)/2 =126 个任务,并且虚拟地址的范围是((256-4)/2)×64MB 约等于8GB。但0.12内核中人工定义最大任务数NR_TASKS = 64个,每个任务逻辑地址范围是64MB,并且各个任务在线性地址空间中的起始位置是(任务号)×64MB。因此全部任务所使用的线性地址空间范围是64MB×64 =4GB,如图5-10所示。图中示出了当系统具有4个任务时的情况。内核代码段和数据段被映射到线性地址空间的开始16MB部分,并且代码和数据段都映射到同一个区域,完全互相重叠。而第1个任务(任务0)是由内核“人工”启动运行的,其代码和数据包含在内核代码和数据中,因此该任务所占用的线性地址空间范围比较特殊。任务0的代码段和数据段的长度是从线性地址0开始的640KB范围,其代码和数据段也完全重叠,并且与内核代码段和数据段有重叠的部分。实际上,Linux 0.12中所有任务的指令空间I(Instruction)和数据空间D(Data)都合用一块内存,即一个进程的所有代码、数据和堆栈部分都处于同一内存段中,也即是I&D不分离的一种使用方式。

按这样的说法,那么系统最多只有126个进程?不可能吧?

论坛徽章:
0
2 [报告]
发表于 2009-10-10 00:32 |只看该作者
是的,在kernel 0.12里gdtr被强制赋值为256个entry,见head.s,而早期的kernel里进程数量又受限于gdt的大小。那么进程的确只能达到126个。

论坛徽章:
0
3 [报告]
发表于 2009-10-10 01:10 |只看该作者
没看过0.12的代码,不过赵烔的这段话,确实描述的不好

照他这么说,早期的 0.12 代码使用了段机制管理,并且分页管理也做得不好:每个进程使用2个相同地址范围的 segment descriptor。是属于比较落后的段管理机制了。那么这样设计就有了限制

现在的OS的所有进程都可使用同一个descriptor,只是在进程切换时,映射到不同物理地址,以区分每个进程的空间

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
4 [报告]
发表于 2009-10-10 09:50 |只看该作者
Linux 0.12是哪个年代的内核?

”每个任务逻辑地址范围是64MB“ 感觉表达的有错误,按理来说每个任务的逻辑地址应该是4G啊,怎么会只有64MB?
而且按赵炯书上说的,好像所有的任务都公用一个LDT表,怎么不是每个任务有自己的LDT表吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP