一步步编写操作系统 44 用c语言编写内核1

先来个简单的,欢迎我们神秘嘉宾——main.c。这是我们第一个c语言代码。

1	int main(void) {
2	 while(1);
3	 return 0;
4	}

它没法再简单啦,简单的程序似乎能帮助咱们更容易的理解所学的知识,哈哈,我说的是似乎,其实,再长的代码,编译后生成的文件结构也是由那几个部分组成,万变不离其宗。这里所说的文件结构是指将来要说的elf文件格式,在此不多说,留作伏笔。

正如之前所说,咱们只有用c语言的语法结构,这里没有包含标准库,也没有直接的系统调用,以后咱们都得按照这种简洁的方式编程啦。另外,有的同学已经注意到main.c所在的目录啦,本来我还是想卖个关子的,但它所在的目录出卖了我:在kernel目录下。对,如您所想,它就是我们第一个内核文件,我们在project目录下建立了个子目录kernel,今后我们所有与内核相关的模块都要放在此目录下。

您也看到了,这个内核文件什么都没做,通过while(1)这个死循环一直空兜cpu,目的是停在这里。想当初我就因为忘记加这样的语句而导致不知道cpu执行到哪去了,当时排错时可晕头了,看到执行的指令都不是自己写的,甚至都怀疑是虚拟机的问题,想想好惭愧啊,脸红脸红啊。当然查出来原因之后,自然又是满地打滚,喜极而泣啦。这个简单粗暴可依赖的死循环仅仅是为了演示elf文件解析以及加载内核的作用,今后我们要逐步完善它,看着它一点一点长大,就像是我们在养育孩子一样,尽管我还没有结婚^_^。

生成c语言程序的过程是这样的。先将源程序编译成目标文件(由c代码变成汇编代码后,再由汇编代码生成二进制的目标文件),再将目标文件链接成二进制可执行文件。平时我们写只有一个文件的小程序时,编译器也是悄悄在背后这样做的,除非加了参数让编译器分成两个动作。由于咱们用的是c语言写的程序,想到的是编译器自然是大名鼎鼎的gcc,所以我们用gcc编译该程序的参数是:

gcc -c -o kernel/main.o kernel/main.c,也许对其中的参数有的同学不太熟,没关系,在执行gcc –help回车后,大家可以看到一些帮助信息,其中:

-c的作用是编译、汇编到目标代码,不进行链接,也就是直接生成目标文件。

-o的作用是将输出的文件以指定文件名来存储,有同名文件存在时直接覆盖。

经过上面gcc的编译后,我们得到了main.o文件,目前为止,它还是个“半成品”。为什么这么说呢,因为它只是个目标文件,也称为待重定位文件,重定位指的是文件里面所用的符号还没有安排地址,这些符号的地址需要将来与其它目标文件“组成”一个可执行文件时再重新定位(编排地址),这里的符号就是指该目标文件中所调用的函数或使用的变量,而这里的“组成”就是指链接。这些符号一般是位于其它文件中,所以在编译时不能确定其地址,需要在所有目标文件都到齐了,将它们链接到一起时再重新定位(编排地址)。由于不知道可执行文件是由几个目标文件组成,所以一律在链接阶段对符号重新定位(编排地址)。所以说,哪怕是可执行文件只是由一个文件组成,其目标文件中的符号也是未编址的,编址工作,即重定位,一律统一在链接阶段完成。

编译成目标文件时也不我们可以用file命令检查一下main.o的状态。如file kernel/main.o,输出见图

为了让大家更明显地看出目标文件的可重定位属性,我将relocatable用方框给大家圈出来了。

目标文件是可重定位文件,其中的符号都尚未“定位”,也就是符号(变量名,函数名)的地址尚未确定,这一点我们可以用linux的nm命令来查看。如图

如图所见,由于咱们的main.c过于简单,里面只有一个符号,即main,所以nm只列出了它的符号信息。main函数的地址由于未被指定,所以其值为00000000。一会咱们链接后再对比下大家就更清楚了.

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

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

相关文章

从零实现一个3D目标检测算法(1):3D目标检测概述

本文是根据github上的开源项目:https://github.com/open-mmlab/OpenPCDet整理而来,在此表示感谢,强烈推荐大家去关注。使用的预训练模型也为此项目中提供的模型,不过此项目已更新为v0.2版,与本文中代码略有不同。 本文…

一步步编写操作系统 45 用c语言编写内核2

在linux下用于链接的程序是ld,链接有一个好处,可以指定最终生成的可执行文件的起始虚拟地址。它是用-Ttext参数来指定的,所以咱们可以执行以下命令完成链接: ld kernel/main.o -Ttext 0xc0001500 -e main -o kernel/kernel.bin …

使用OpenCV库快速求解相机内参

本文主要介绍如何使用OpenCV库函数求解相机内参。具体可查阅官网:https://docs.opencv.org/master/dc/dbb/tutorial_py_calibration.html。 关于相机内参的求解还有很多其它的工具,如使用MATLAB求解会更方便,直接调用MATLAB中的APP即可。 1.背…

一步步编写操作系统 46 用c语言编写内核3

再把上节代码贴出来, 1 //int main(void) { 2 int _start(void) { 3 while(1); 4 return 0; 5 }有没有同学想过,这里写一个_start函数,让其调用main函数如何?其实这是可以的,main函数并不是第一个函数,它实…

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

操作系统并不是在功能上给予用户的支持,这种支持是体现在机制上。也就是说,单纯的操作系统,用户拿它什么都做不了,用户需要的是某种功能。而操作系统仅仅是个提供支持的平台。 虽然我们是模仿linux来写一个黑屏白字的系统&#x…

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

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

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

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

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

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

百度顶会论文复现(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…

一步步编写操作系统 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)

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

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

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

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

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

详解两阶段3D目标检测网络PVRCNN:Point-Voxel Feature Set Abstraction for 3D Object Detection

在《动手学无人驾驶(4):基于激光雷达点云数据3D目标检测》一文中介绍了3D目标检测网络PointRCNN。今天介绍该作者新提出的3D检测模型:PVRCNN,论文已收录于CVPR2020。 作者个人主页为:https://sshaoshuai.gi…

一步步编写操作系统 53 任务状态段TSS介绍

操作系统是利用PCB来维护所有任务的,包括进程和线程,但cpu提供的是TSS,linux系统可没用它,因为效率太低。但是还是要了解下TSS才清楚操作系统中某些操作的原因。 本节中所讲的特权级与它有着密不可分的联系,TSS作用不…

动手学无人驾驶(6):基于IMU和GPS数据融合的自车定位

在上一篇博文《动手学无人驾驶(5):多传感器数据融合》介绍了如何使用Radar和LiDAR数据对自行车进行追踪,这是对汽车外界运动物体进行定位。 对于自动驾驶的汽车来说,有时也需要对自身进行更精确的定位,今天…

【Codeforces - 798C】 Mike and gcd problem(思维,贪心)

题干: Mike has a sequence A  [a1, a2, ..., an] of length n. He considers the sequence B  [b1, b2, ..., bn] beautiful if the gcd of all its elements is bigger than 1, i.e. . Mike wants to change his sequence in order to make it beauti…