笔记 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)

谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3245850.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

大模型的“幻觉”克星!被低估的RAG技术

1 RAG与大模型、Prompt、微调的关系 本文主要带大家深入学习一下最近AI领域的重要技术RAG,本文致力于用大白话给大家说明白RAG,但是还是需要一些大模型和微调有关的领域名词有一些基本的了解,大家选择性阅读哦!在进行正文学习之前我们先用一…

【内网穿透】打洞笔记

文章目录 前言原理阐述公网sshfrp转发服务 实现前提第一步:第二步第三步第四步 补充第五步(希望隧道一直开着)sftp传数据(嫌云服务器上的网太慢) 前言 租了一个云服务器,想用vscode的ssh远程连接&#xff…

数据库中的复合查询

一、基本查询回顾 1、查询工资高于500或岗位为manager的员工,并且名字首字母是J 2、按部门编号升序,工资降序排序 3、用年薪降序排序 4、显示工资最高的员工名字和岗位(使用了子查询) 5、查询工资高于平均工资的员工 6、按部门查…

kubernetes集群部署elasticsearch集群,包含无认证和有认证模式

1、背景: 因公司业务需要,需要在测试、生产kubernetes集群中部署elasticsearch集群,因不同环境要求,需要部署不同模式的elasticsearch集群, 1、测试环境因安全性要求不高,是部署一套默认配置; 2…

orcad导出pdf 缺少title block

在OrCAD中导出PDF时没有Title Block 最后确认问题在这里: 要勾选上Title Block Visible下面的print

《昇思25天学习打卡营第19天|Diffusion扩散模型》

什么是Diffusion Model? 什么是Diffusion Model? 如果将Diffusion与其他生成模型(如Normalizing Flows、GAN或VAE)进行比较,它并没有那么复杂,它们都将噪声从一些简单分布转换为数据样本,Diffusion也是从…

46 mysql 客户端拿不到具体的错误信息

前言 这是最近碰到的一个问题 同样的一个 环境的问题, 在正常的 mysql 环境会返回 具体的错误信息, 然后 在我的另外一个环境里面 只能返回一些 unknown error 之类的 十分抽象的环境 然后 我们这里 来看一下 具体的情况 我们这里从 错误的环境 往前推导 来查看 并解决这个…

常见的计算机语言有哪些?

计算机语言用于编写软件和应用程序,各种语言有不同的用途和特点。目前常见的的编程语言有: 1、Java;2、Python;3、JavaScript;4、C;5、C#;6、Swift;7、Go;8、Ruby&#…

Chromium CI/CD 之Jenkins实用指南2024-系统基本配置(二)

1. 引言 在现代软件开发和持续集成/持续部署(CI/CD)过程中,Jenkins已经成为一款不可或缺的工具。作为一个开源的自动化服务器,Jenkins能够帮助开发团队自动化各种任务,包括构建、测试和部署应用程序。特别是当与Ubunt…

高职综合布线实训室

一、高职综合布线实训室建设背景 随着《国民经济和社会发展第十四个五年规划和2035年远景目标纲要》的深入实施,数字化转型已成为国家发展的核心战略之一,计算机网络技术作为数字化建设的基石,其重要性日益凸显。然而,面对数字时代…

数据可视化在智慧医疗中的重要应用

在现代智慧医疗的推动下,数据可视化技术正日益成为医疗领域的重要工具。通过将复杂的医疗数据转换为直观的图表和图形,数据可视化不仅提升了医疗服务的效率,还极大地改善了患者的就医体验。 在智慧医疗中,数据可视化首先在电子病历…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 7月17日,星期三

每天一分钟,知晓天下事! 2024年7月17日 星期三 农历六月十二 1、 三部门:紧急调拨1万件救灾物资支持河南、山东两省做好受灾群众基本生活保障工作。 2、 多部门联合公布无人驾驶试点名单:北京、上海等20个城市(联合体…

Cesium能做啥,加载哪些数据源,开源免费用商用吗?这里告诉你。

很多小伙伴对Cesium是什么,一知半解,本文是基础知识的扫盲,为大家分享cesium是什么、能做什么、默认数据是什么,为什么首先要进行数据加载,要加载哪些数据,希望通过这些带你入个门,欢迎点赞评论…

所有权与生命周期:Rust 内存管理的哲学

所有权与生命周期:Rust内存管理的哲学 博主寄语引言:编程语言的内存管理困境与 Rust 的解决方案。所有权基本概念:资源的绝对主权生命周期的理解与应用:编译时的守护神借用与引用的精妙设计:安全与效率的和谐共舞Rust …

服务器基础1

服务器基础复习01 1.环境部署 系统:华为欧拉系统 网络简单配置nmtui 因为华为欧拉系统密码需要复杂度 所以我们可以进入后更改密码 echo 123 | passwd --stdin root也可以 echo "root:123" | chpasswd2.关闭防火墙,禁用SElinux 首先先关…

C++:链表插入排序/删除重复节点题解

插入排序 插入排序的思路很简单,基本都知道。 关键是放在链表中, 1.要建立一个哨兵位,这个哨兵位的下一个节点,始终指向val最小的节点。 2.prev指针作为cur的前一个节点,始终指向val最大的节点。它的下一个节点始终…

C++ ─── vector的模拟实现

知识点: ① 因为vector是模版,所以声明和定义都放在.h中,防止出现编译错误。 .h不会被编译,在预处理中.h在.cpp中展开,所以在编译时只有.cpp 而 .cpp顺序编译,只会进行向上查找,因此至少有函数的…

交叉编译ethtool(ubuntu 2018)

参考文章:https://www.cnblogs.com/nazhen/p/16800427.html https://blog.csdn.net/weixin_43128044/article/details/137953913 1、下载相关安装包 //ethtool依赖libmul git clone http://git.netfilter.org/libmnl //ethtool源码 git clone http://git.kernel.or…

野兔在线工具箱系统全新升级改版,基于TP8和yetuadmin后台实现

野兔在线工具箱系统全新升级改版,基于TP8和yetuadmin后台实现 系统名称:野兔在线工具系统 系统语言:支持多语言,大概有20种 系统源码:不加密,开源 系统开发:PHPMySQL (基于thinkphp8&#x…

Docker容器——初识Docker,安装以及了解操作命令

一、Docker是什么? 是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源,用来管理容器和镜像的工具是在Linux容器里驱动运行应用的开源工具是一种轻量级的“虚拟机” 基于linux内核运行Docker的容器技术可以在一台主机上轻松为任何应用…