笔记 5 :linux 0.11 注释,函数 copy_mem() , copy_process () , 中断函数 int 80H 的代码框架

(38)接着介绍一个创建进程时的重要的函数 copy_mem() 函数:

在这里插入图片描述

(39a) 3-16a 分析另一个关于 fork() 的重要的函数 copy_process(),与李忠老师的操作系统不同,在理解上有难度:

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a9462aaeb88a49c1872e71d032738852.png

以及该函数的调用链,该函数挺重要的:

在这里插入图片描述

上图中还有共享文件的代码:

在这里插入图片描述

(40)至此,已分析完 fork()执行时调用链上的所有函数,以下给出 fork()函数的执行调用链,以理清该函数执行的逻辑过程:

在这里插入图片描述

(41) 至此,其实还有一个疑问: 若所有进程共享一个页目录表,那么 1 号进程是如何完成线性地址到物理地址的映射的,毕竟又不是可重定位代码:

在这里插入图片描述

同样来自闪客老师的课本插图:

在这里插入图片描述

以及:

在这里插入图片描述

结论: 英特尔 CPU 认为代码中的地址都是偏移量,需要加上基址才是完整的线性地址,再去查页目录表。而一开始我错误的以为代码中的地址就是线性地址,只要在段基址限定范围内即可。但进程 0 假如先后连续产生两个进程,未经修改的内核代码同时在三个进程中运行,怎么也不可能符合三个段基址的要求啊,原来如此。谢谢闪客老师!!!!!!

(42)由以上,又有一个结论。探讨下 64 这个数字在 linux 0.11 中的使用,为什么 linux 大师用了这个数字:
第一处: 全局变量 task [ ] 数组的长度是 64 ,允许系统中最多 64 个进程同时运行;
第二处:每个进程的所在的线性起始地址是 64Mb 的倍数;
第三处:每个进程的长度最多是 64 Mb ,这和第二条也是有关联的,进程各自占据的内存不能越界。
可以猜测下 linux 大师的思路:他那个年代,内存非常宝贵稀缺,故采用了所有进程共享一个页目录表,进程各自拥有独立的页表的结构。因为每个页目录表就要占据 4Kb 的内存。进程的线性地址采用了段页式管理结构。64Mb * 64 = 4096Mb = 4Gb ,刚好瓜分完 32 位CPU 架构的可以支持的最大内存空间。只有进程的线性空间不发生彼此干涉越界,才能保证物理内存的分布也不会互相干涉越界。
现在咱们学习保护模式,都是跟着李忠老师学习的。后来的年代,内存普及了。所以对内存的使用也可以放宽了。可以为每个进程安排一个页目录表,并登记在 CR3 寄存器里,这样的做法相当于每个进程都独自拥有 4Gb 的内存空间。当然进程的大小可以超过了 64Mb ,但也不能真的太大。因为同时会有多个进程在运行,都需要内存。
估计后来的 linux 版本已经改过来了,随着内存的增大和程序的增大。但先学习过李忠老师的操作系统的内存结构,不了解早期 linux 大师的思路,先入为主,会给理解 linux 0.11 的代码带来一段时间的困扰。故单独记录下。

(43) 结合看汇编代码,有必要再研究下栈指针 esp 的工作原理:压栈时是先移动栈指针,再赋值:

在这里插入图片描述

(44) 介绍 syscall 时候源码中出现的汇编指令 bsf 与 bsr :

在这里插入图片描述
+
在这里插入图片描述

(45)再复习另一个汇编指令 btr :

在这里插入图片描述

(46) 在 int 80 H 里,我们可以做很多事,但不清楚 int 80H 的所有的中断代码,也是不合适的,尤其是这里存在对信号量的处理:

在这里插入图片描述

(47)

谢谢

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值