(莱昂氏unix源代码分析导读-14)系统初启(7)

#1进程

 

现在,是#1进程的天下了。回到main函数:

1627 if(newproc()) {                        /返回值为1,要执行以下的语句

1628      expand(USIZE+1);              /扩展进程私有空间,增大1block      

1629      estabur(0, 1, 0, 0);   

1630      copyout(icode, 0, sizeof icode);

1631      /*

1632           * Return goes to loc. 0 of user init

1633           * code just copied out.

1634      */

1635      return;

1636 }

 

首先看看expand函数,它用来扩展(或缩小)进程的私有空间:

(1)    缩小空间的情形比较简单,只需回收多余的空间即可;

(2)    如果需要扩大空间,则需要使用malloc分配所需连续空间,然后将

               current私有空间的内容拷贝到新分配的空间去,最后通过retu调用

               重新设置kisa6

 

expand调用后,进程的私有空间变大,即在核心stack栈底后多一个block的free空间,如下图所示:

 

user

到目前为止,我们的进程一直工作与kernel态,但是,Kernel态是特权阶级,大多数的进程尤其是用户进程

在大多数时间里不应该处于这种状态。

 

现在,是了解user态的时候了。有些人习惯将user态和kernel态的进程看作是两个进程,但我觉得还是把它们看

作一回事比较好——这样确定进程身份的方法仍没有变,即仍通过进程的“私有空间”kernel page #6

 

我们讨论过PDP11-40的存管系统,同kernel态一样,user态拥有8组的page地址、描述寄存器。在ppdau区域里定义了

两个数组,分别用来记录user态的page address/description Register相关的信息;

413 struct user

414{

……

436     int u_uisa[16]         /prototype of segment address

437     int u_uisd[16]         /page description saver

……

459}u

 

这里的16令人迷惑,Page Address registerPage Description Register各有8个,那么,这16从何而来呢?

答案就位于莱昂书中的第2.12小节——在更高版本的PDP-11中,user态地址被分为了“i”、“d”两部分。

而数值之所以留16entry,就是为了支持这种划分。

 

但是,我们需要知道是,莱昂在整理代码时,是按照PDP-11/40为模型进行整理的。虽然代码兼容了更

高版本的系统,我将不讨论这部分的内容。也就是说,我只考察PDP-11/40所能涉及到的代码——凡是针

对“i”、“d”划分的特殊处理都将被跳过。

 

另外一个令人迷惑的是 u_uisa[]的注释,什么是prototype?显然,u_uisa[]记录的不是Address register,那么

它是什么呢?我们将在代码中找到答案。

 

 博客地址:http://blog.csdn.net/cszhao1980 

博客专栏地址: http://blog.csdn.net/column/details/lions-unix.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 献辞 致谢 序(一) 序(二) 历史注记 上篇 UNIX操作系统版本6源代码 UNIX操作系统过程分类索引 3 UNIX操作系统文件及过程 5 UNIX操作系统定义的符号列表 7 UNIX操作系统源代码交叉引用列表 9 第一部分 初始化、进程初始化 25 第二部分 陷入、中断、系统调用和 进程管理 75 第三部分 程序交换、基本输入/输出、 块设备 109 第四部分 文件和目录、文件系统、管道 133 第五部分 面向字符的特殊文件 181 下篇 莱昂UNIX源代码分析 前言 207 第1章 绪论 209 1.1 UNIX操作系统 209 1.2 公用程序 209 1.3 其他文档 210 1.4 UNIX程序员手册 210 1.5 UNIX文档 211 1.6 UNIX操作系统源代码 211 1.7 源代码中各部分 212 1.8 源代码文件 212 1.9 分析的使用 212 1.10 对程序设计水平的一条注释 212 第2章 基础知识 214 2.1 处理机 214 2.2 处理机状态字 214 2.3 通用寄存器 214 2.4 指令集 215 2.5 寻址方式 216 2.5.1 寄存器方式 217 2.5.2 寄存器延迟方式 217 2.5.3 自动增1方式 217 2.5.4 自动减1方式 217 2.5.5 变址方式 217 2.5.6 立即方式 218 2.5.7 相对方式 218 2.6 UNIX汇编程序 219 2.7 存储管理 219 2.8 段寄存器 220 2.9 页说明寄存器 220 2.10 存储分配 220 2.11 状态寄存器 221 2.12 “i”和“d”空间 221 2.13 启动条件 221 2.14 专用设备寄存器 221 第3章 阅读“C”程序 222 3.1 某些选出的例子 222 3.2 例1 222 3.3 例2 223 3.4 例3 223 3.5 例4 225 3.6 例5 225 3.7 例6 227 3.8 例7 227 3.9 例8 228 3.10 例9 228 3.11 例10 229 3.12 例11 229 3.13 例12 230 3.14 例13 230 3.15 例14 231 3.16 例15 231 3.17 例16 232 3.18 例17 233 第4章 概述 235 4.1 变量分配 235 4.2 全局变量 235 4.3 “C”预处理程序 235 4.4 第一部分 236 4.4.1 第1组“.h”文件 236 4.4.2 汇编语言文件 237 4.4.3 在第一部分中的其他文件 237 4.5 第二部分 237 4.6 第三部分 238 4.7 第四部分 238 4.8 第五部分 239 第一部分 初始化、进程初始化 第5章 两个文件 241 5.1 文件malloc.c 241 5.1.1 列表维护规则 241 5.1.2 malloc(2528) 242 5.1.3 mfree(2556) 243 5.1.4 结论 244 5.2 文件prf.c 244 5.2.1 printf(2340) 244 5.2.2 printn(2369) 245 5.2.3 putchar(2386) 246 5.2.4 panic(2419) 247 5.2.5 prdev(2433)、deverror(2447) 247 5.3 包含的文件 247 第6章 系统初启 249 6.1 操作员的动作 249 6.2 start(0612) 249 6.3 main(1550) 251 6.4 进程 252 6.5 proc〔0〕的初始化 252 6.6 sched(1940) 253 6.7 sleep(2066) 253 6.8 swtch(2178) 253 6.9 再回到main 254 第7章 进程 256 7.1 进程映像 256 7.2 proc结构(0358) 257 7.3 user结构(0413) 257 7.4 每个进程数据区 258 7.5 段 258 7.6 映像的执行 258 7.7 核心态执行 259 7.8 用户态执行

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值