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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

(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)

谢谢

相关推荐

  1. shell_80.Linux函数递归

    2024-07-17 19:56:01       57 阅读
  2. 【ctype.h】全部函数介绍与代码示例

    2024-07-17 19:56:01       60 阅读
  3. H5/CSS 笔试面试考题(71-80

    2024-07-17 19:56:01       42 阅读
  4. 笔记82:关于 C++ 中 swap 函数

    2024-07-17 19:56:01       37 阅读
  5. 笔记ing】Helm-5 Chart模板指南-5 模板函数列表

    2024-07-17 19:56:01       56 阅读
  6. python笔记基础--函数5

    2024-07-17 19:56:01       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 19:56:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 19:56:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 19:56:01       58 阅读
  4. Python语言-面向对象

    2024-07-17 19:56:01       69 阅读

热门阅读

  1. XML详解

    2024-07-17 19:56:01       18 阅读
  2. Vue进阶之Vue无代码可视化项目(六)

    2024-07-17 19:56:01       19 阅读
  3. 209.长度最小的子数组 数组 双指针 滑动窗口

    2024-07-17 19:56:01       19 阅读
  4. notes for datawhale 2th summer camp NLP task2

    2024-07-17 19:56:01       21 阅读
  5. linux学习笔记整理: 关于linux系统介绍 2024/7/16;

    2024-07-17 19:56:01       21 阅读
  6. 单例模式-C#

    2024-07-17 19:56:01       18 阅读
  7. 常用的系统层安全机制

    2024-07-17 19:56:01       21 阅读
  8. 什么是智能家居?

    2024-07-17 19:56:01       18 阅读
  9. C++的关键字const

    2024-07-17 19:56:01       21 阅读
  10. 服务端正常启动了,但是客户端请求不到

    2024-07-17 19:56:01       22 阅读