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

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

ld kernel/main.o -Ttext 0xc0001500 -e main -o kernel/kernel.bin

从左到右说一下参数,-Ttext 指定起始虚拟地址为0xc0001500,这个地址是设计好的,为什么用这个地址,咱们将来在加载内核时会告诉大家,在此大伙儿先淡定一下。其中 –o的意义也是指定输出的文件名,至于-e,还是要看一下官方帮助。

ld –help回车后,输出的信息太多,咱们只看下面的-e参数:

-e ADDRESS, --entry ADDRESS Set start address

-e和--entry一样,字面上的意思是用来指定程序的起始地址。注意,不要被迷惑了,虽然说是指定起始地址,但参数不仅可以是数字形式的地址,而且可以是符号名,这和汇编中的标号也是地址是一样的道理。总之它是用来指定程序从哪里开始执行。

为了让大家更清楚-e的意思,咱们不加-e参数试试,如图

经过这样的链接操作,ld报错发出了警告,提示找不到入口符号(entry symbol)_start,默认地址为00000000c0001500。这个_start是什么呢?一个程序总该有个入口地址,这个地址表示的是程序将从哪里开始执行。要知道,并不是程序体中的第一个字节就是程序的起始地址,因为在程序的开头可能有函数声明或数据定义,想想咱们的汇编文件loader.S,它最前面的部分可不是指令而是一堆数据,而我们在设计它的时候,知道它的入口地址不在程序开始处,所以在mbr中直接跳入了loader.S的loader_start标号处,跨过了程序开头的数据部分。这还仅仅是由一个loader.S生成loader.bin,并且是我们提前知道入口地址的情况,如果当多个文件拼合成一个可执行文件时,计算机如何知道程序的入口在哪里呢?也就编译后的程序应该从哪句代码开始执行呢?这入口代码可说不准是哪一个了。由于程序内的地址是在链接阶段编排(也就是重定位)的,所以在链接阶段必须要明确入口地址才行,于是链接器规定,默认只把名为_start的函数做为程序的入口地址,即默认的entry symbol是_start,除非另行指定。

大家看到了,代码中并没有_start这个符号,链接器ld找不到该起始地址,所以发出了警告。既然缺少_start符号,那现在把主函数main改成_start试试,代码如下:

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

好啦,编译链接一气呵成,整个过程没出任何问题,如图:

上图中,我们还用file命令查看了最终生成的kernel.bin文件,您看,它已经是executable啦,即可执行文件。悄悄提示一下,该文件放到虚拟机上运行也是没问题的。

本节内容摘自《操作系统真象还原》

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

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

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

相关文章

【Codeforces - 977F】Consecutive Subsequence(STLmap,输出路径,dp)

题干: You are given an integer array of length nn. You have to choose some subsequence of this array of maximum length such that this subsequence forms a increasing sequence of consecutive integers. In other words the required sequence should …

使用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函数并不是第一个函数,它实…

从零实现一个3D目标检测算法(2):点云数据预处理

在上一篇文章《从零实现一个3D目标检测算法(1):3D目标检测概述》对3D目标检测研究现状和PointPillars模型进行了介绍,在本文中我们开始写代码一步步实现PointPillars,这里我们先实现如何对点云数据进行预处理。 在图像…

【CodeForces - 129C】Statues(思维,bfs)

题干: In this task Anna and Maria play a game with a very unpleasant rival. Anna and Maria are in the opposite squares of a chessboard (8  8): Anna is in the upper right corner, and Maria is in the lower left one. Apart from them, the board h…

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

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

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