一步步编写操作系统 47 48 二进制程序运行方式

操作系统并不是在功能上给予用户的支持,这种支持是体现在机制上。也就是说,单纯的操作系统,用户拿它什么都做不了,用户需要的是某种功能。而操作系统仅仅是个提供支持的平台。

虽然我们是模仿linux来写一个黑屏白字的系统,但如果没有windows的话,估计当今这个世界将会失去70%以上的光芒。由于有了操作系统的支持,我们可以安装一些软件,也就是应用程序,比如安装了QQ或一些其它的即时通讯工具,这样我们就能够给同其他人聊天。

所以,操作系统并不能直接帮大家做什么,但大家想做什么的时候,操作系统能提供最大限度的支持。

任何程序都需要被载入到内存后才能运行,这是cpu等其它硬件的运行机制决定的,我们若在该硬件系统上运行程序,不得不遵守这样那样的约束。应用程序是独立于操作系统的,它不会像操作系统那样,含着金钥匙,一出生就直接在内存中。它们通常是位于磁盘等外存设备中,在使用时,需要从外存中将其调入到内存后才行。

如何去加载用户程序呢?

操作系统是程序、是软件,用户程序也是软件,用一个程序去调用另一个程序一点难度都没有,最最简单的办法,就是用jmp或call指令。我们的bios就是这样调用mbr,我们的mbr就是这样调用loader的。但大家还记得不,bios调用mbr,mbr的地址是0x7c00,mbr调用loader,loader的地址是0x900。这两个地址是写死的,也就是说,我们目前的方法是很不灵活的,调用方需要提前和被调用方约定调用地址。

有没有一种灵活的方法让程序的加载地址不那么固定呢?肯定有,不过突然想起周一要汇报工作,今晚加班,下节再说。

 

接上节,有没有一种灵活的方法让程序的加载地址不那么固定呢?

显然是有的,由于每个程序是单独存在的,所以程序的入口地址信息需要与程序绑定,最简单的办法就是在程序文件中专门腾出个空间来写入这些程序的入口地址,主调程序在该程序文件的相应空间中将该程序的入口信息读出来,将其加载到相应的入口地址,跳转过去就行了。当然不仅仅只写入程序入口地址,能写的东西很多,比如为了给程序分配内存,至少还得需要知道程序的尺寸大小。但在哪里写入程序的入口地址呢?这便是文件头的由来,在程序文件的开头部分记载这类信息,而程序文件中除文件头外其余的部分则是之前的程序体。这样一来,原先的纯二进制可执行文件加上新的文件头,就形成了一种文件格式。不仅文件是这样,很多其它传输协议也是采用文件头header+文件体body的形式,如邮件传输协议和http传输协议。在现实生活中也有这样的例子,比如咱们坐火车的时候,按理说,只要火车停在能让咱们看到的地方,咱们就能直接上火车了。但现实中不可能让所有火车摆在咱们面前,所以我们在乘坐火车时,都是进站后先要查看大屏幕上的列车时刻表,从中找到在哪个候车室等候上车。其中,列车时刻表就相当于文件头,我们从中找到上火车的入口,而火车则相当于文件体。

在程序中,程序头(也就是文件头)是用来描述程序的布局等信息,它属于信息的信息,也就是元数据。包含程序头的程序文件示意如图:

由于程序文件中包含了程序头,好处是程序的入口地址等信息不需要写死,调用方中的调用代码可以变得通用,根据实际情况加载便可。但不好的地方是,这些元信息不是代码,故不应该将其放在cpu上“执行”,所以程序就不再是纯粹的二进制可执行文件了,不像之前咱们用nasm默认编译的可执行文件(里面全是程序本身的指令和数据)那样纯粹。所以,将这种具有程序头格式的程序文件从外存读入到内存后,从该程序文件的程序头中读出入口地址,需要直接跳进入口地址执行,跨过程序头才行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度顶会论文复现(1):课程概述

最近百度推出了一款重磅课程《全球顶会论文作者,28天免费手把手带你复现顶会论文》。这个课程真的是很硬核的课程,这里简单记录下自己的学习过程。 文章目录1. 课程设计思路和安排2. 课程大纲1. 课程设计思路和安排 课程设计思路如下,共分为…

【Codeforces - 127D】Password(思维,二分+字符串Hash)

题干: Asterix, Obelix and their temporary buddies Suffix and Prefix has finally found the Harmony temple. However, its doors were firmly locked and even Obelix had no luck opening them. A little later they found a string s, carved on a rock be…

百度顶会论文复现(2):GAN综述

本节课主要是对GAN的发展进行了介绍,包括基本原理,训练方法,存在问题,改进以及应用场景等。实践作业则为手写数字生成。课程地址为:https://aistudio.baidu.com/aistudio/education/preview/493290。 文章目录1.什么是…

一步步编写操作系统 48 二进制程序的加载方式

接上节,程序头可以自定义,只要我们按照自己定义的格式去解析就行。也许我光这么一说,很多同学还是不能彻底明白如何自定义文件头,因为大多数同学都是用高级语言来写程序,即使用了偏底层的c语言,不同平台的c…

【Codeforces - 864D】Make a Permutation!(贪心,字典序)

题干: Ivan has an array consisting of n elements. Each of the elements is an integer from 1 to n. Recently Ivan learned about permutations and their lexicographical order. Now he wants to change (replace) minimum number of elements in his arra…

百度顶会论文复现(3):视频分类综述

本节课主要是对视频分类的发展进行了介绍,包括任务与背景,分类方法,前沿进展等。课程地址为:https://aistudio.baidu.com/aistudio/course/introduce/1340?directly1&shared1。 文章目录1. 任务与背景2. 视频分类方法2.1 双流…

一步步编写操作系统 46 linux的elf可执行文件格式1

ELF文件格式依然是分为文件头和文件体两部分,只是该文件头相对稍显复杂,类似层次化结构,先用个ELF header从“全局上”给出程序文件的组织结构,概要出程序中其它头表的位置大小等信息,如程序头表的大小及位置、节头表的…

百度顶会论文复现(4):飞桨API详解

本节课主要是对飞桨常用API进行了介绍,课程地址为:https://aistudio.baidu.com/aistudio/education/group/info/1340。 文章目录1.飞桨API官网2. API使用介绍3. 飞桨模型操作1.飞桨API官网 官网地址为:https://www.paddlepaddle.org.cn/docu…

【Codeforces - 977D】Divide by three, multiply by two(思维构造)

题干: Polycarp likes to play with numbers. He takes some integer number xx, writes it down on the board, and then performs with it n−1n−1 operations of the two kinds: divide the number xx by 33 (xx must be divisible by 33);multiply the numbe…

一步步编写操作系统 45 linux的elf可执行文件中的段和节

接上文,为了描述清楚文件格式的本质,咱们先从最基本的“段”说起。 程序中最重要的部分就是段(segment)和节(section),它们是真正的程序体,是真真切切的程序资源,所以下…

视觉SLAM十四讲(3):三维空间刚体运动

本章需要掌握的知识点有:旋转矩阵,变换矩阵,四元数,欧拉角定义和数学表达;同时也要掌握Eigen库关于矩阵、几何模块的使用方法。 文章目录3.1 旋转矩阵3.1.1 点,向量和矩阵的关系3.1.2 坐标系间的欧式变换3.…

【CodeForces - 483C】Diverse Permutation(思维构造)

题干: Permutation p is an ordered set of integers p1,   p2,   ...,   pn, consisting of ndistinct positive integers not larger than n. Well denote as n the length of permutation p1,   p2,   ...,   pn. Your task is to find such…

一步步编写操作系统 47 elf格式文件分析实验

在上一节中,我们讲述了elf格式的部分理论知识,为什么是部分呢?因为我们本着“够用”的原则,只把我们需要了解的部分说完啦。不过,我相信大部分同学仅仅凭上一节中的理论知识还是领悟不到elf本质,咱们在本节…

百度飞桨顶会论文复现(5):视频分类论文之《Representation Flow for Action Recognition》篇

这次老师在课上总共领读了4篇分类论文,我这里分享其中的一篇论文,是关于使用神经网络对光流进行学习。 课程地址是:https://aistudio.baidu.com/aistudio/education/group/info/1340。 论文地址是:https://arxiv.org/abs/1810.014…

智能算法(GA、DBO等)求解零等待流水车间调度问题(NWFSP)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年…

【蓝桥官网试题 - 算法提高】change(思维)

题干: 问题描述 数组A中共有n个元素,初始全为0。你可以对数组进行两种操作:1、将数组中的一个元素加1;2、将数组中所有元素乘2。求将数组A从初始状态变为目标状态B所需要的最少操作数。 输入格式 第一行一个正整数n表示数组中元…

一步步编写操作系统 50 加载内核3

接上节,在这里,我们把参数放到了栈中保存,大家注意到了,参数入栈的顺序是先从最右边的开始,最后压入的参数最左边的,其实这是某种约定,要不,为什么不先把中间的参数src入栈呢。既然主…

【POJ - 2965】The Pilots Brothers' refrigerator(暴力枚举,思维)

题干: The game “The Pilots Brothers: following the stripy elephant” has a quest where a player needs to open a refrigerator. There are 16 handles on the refrigerator door. Every handle can be in one of two states: open or closed. The refrige…

动手学无人驾驶(5):多传感器数据融合

本系列的前4篇文章主要介绍了深度学习技术在无人驾驶环境感知中的应用,包括交通标志识别,图像与点云3D目标检测。关于环境感知部分的介绍本系列暂且告一段落,后续如有需要再进行补充。 现在我们开启新的篇章,在本文中将会介绍无人…

一步步编写操作系统 52 深入浅出cpu的特权级

所谓保护模式下的“保护”,主要体现在特权级上,以后随着后面工作的展开,会越来越多的和它们打交道,现在是时候说道说道了。 在人类社会中出现恶势力时,人们总是希望出现一位具有神力的英雄来拯救世人、主持公道。阶级…