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

在这之前,我们一直用汇编语言直接与机器对话,如果大家不知道这个世界上有高级语言的话,我想大家也不会觉得写汇编代码的过程很辛苦,哈哈,幸福确实是比较出来的。相对于汇编语言,用c 语言写内核是非常爽的事,马上我们就要步入内核实践中啦,所以现在和大伙儿聊聊c语言写内核的体会。

通常,我们写的代码都是直接编译成可执行文件,那是因为我们是在写用户程序,操作系统为咱们提供了很多便利,所以编译和链接一气呵成,不需要咱们单独再指定什么,编译器也和操作系统达成了诸多约定,默默在后面为咱们做了大量的工作,比如程序编译出来的虚拟起始地址通常是0x8048000左右。在有操作系统为咱们撑腰时,我们确实不需要关注这些与业务逻辑无关的东西,只要专注于自己的工作就好啦。可如今,我们要用c语言写脱离操作系统的程序,这回咱们就不能再这么省心了,必须要自己指定程序的入口地址。

另外,我们之前开发用户程序,有大量的标准库可以用,标准库一般是系统调用的封装,所以,表面上通过标准库访问系统资源,本质上是用系统调用来实现的。当然如果大伙儿愿意,在用户程序中也可以直接调用“系统调用”,在功能上这是允许的,因为中断描述符表中系统调用对应的中断描述符,它的权限是用户程序可以访问的,否则就无法实现系统调用啦。就拿linux来说,它的系统调用是先往eax寄存器中写入系统调用号,然后通过0x80中断来实现的。我们可以用汇编语言写一个系统调用的代码,用c 语言去调用它或者干脆直接在c语言中内嵌汇编代码。无论是采用哪种形式,汇编语言的部分都是诸如先用mov eax,xx的形式在eax寄存器中指定系统调用的功能号,然后紧跟着使用中断指令int 0x80来引发0x80中断,从而触发0x80对应的中断处理程序,由该中断处理程序根据eax的内容去执行相应的系统调用。虽然可以直接调用“系统调用”的功能,但不推荐这样做,毕竟标准库中为咱们考虑了很多优化策略,通过标准库访问系统资源比直接用系统调用效率更高。也许有同学不信这个邪,非要整出个效率更高的库,当然这是非常可能的,可是标准库考虑的不仅是效率,还有很多兼容规范在里面,所以它可能会为了规范而牺牲效率。除非为了某些个性化的应用咱们才去写自己的库,否则还是不要企图颠覆标准库啦。标准库可以说是由世界上成千上万的超级大脑完成的,以咱们个人之力去和全世界的极客拼脑细胞,这是不科学的,不如把精力放在其它方面,好啦,我知道话又说多啦^_^。

对于系统调用这些平时我们认为理所当然的功能,如今已经成为了咱们的奢望。首先咱们本身是在写操作系统而不是用户程序,操作系统不应该再依赖于其它系统的功能,所以不能在咱们的程序(操作系统)中再调用宿主操作系统的系统调用功能。其次,同一时刻只能有一个操作系统在运行,咱们即使调用了0x80中断,中断描述符表里0x80对应的中断处理程序是咱们提供的,再也不存在宿主系统的代码,相当于咱们在调用自己的中断处理程序,而此时我们可能尚未准备好相应的中断处理程序。如果系统调用不能用,也更不能用c标准库啦,所以只能用c语言原生支持的语法结构。不过以后我们会在实现内核的过程中建立咱们自己的库,库中会通过咱们自己的系统调用实现某些功能。

以上多说了几句有关系统调用的实现,其实我是怕无法满足好奇心强的同学,很担心仅仅一句“在脱离操作系统下写程序不能使用系统调用”让更多的同学感到不解。如果我解释得还不够,咱们以后会在实现系统调用的时候有所了解。

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

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

相关文章

【CodeForces - 722C】Destroying Array(并查集,时光倒流)

题干: 给定一个有n个数的序列a1,a2, ..., an 你每次可以将序列中一个数删去,剩下的数会被分割为一段一段连续的数列 给定一个删除数的顺序,问在每次删除之后,剩下的连续的数列中,数列和的最大值为多少 Input 第…

视觉SLAM十四讲(1):预备知识

最近在学习高翔博士的《视觉SLAM十四讲》(第二版),算是初学本书,配套资源还算蛮丰富的,有代码(第一版和第二版都有),B站上也有高翔博士对第一版录制的讲解视频,真的是很贴…

一步步编写操作系统 43 汇编语言和c语言的理解

也许有的同学喜欢用汇编语言来实现操作系统,觉得用汇编来写程序似乎更简单直接,可控性比较强,有种“一切尽在掌握”的赶脚。而用c语言实现操作系统这件事,虽然轻松很多,但似乎隐约感觉到有些慌张。因为虽然c语言相对来…

视觉SLAM十四讲(2):初识SLAM

这一讲主要介绍视觉SLAM的结构,并完成第一个SLAM程序:HelloSLAM。 目录 2.1 小萝卜的例子 单目相机 双目相机 深度相机 2.2 经典视觉SLAM框架 2.3 SLAM问题的数学表述 2.4 编程实践 Hello SLAM 使用cmake 使用库 【高翔】视觉SLAM十四讲2.1 小…

【CodeForces - 467C】George and Job(dp,思维)

题干: The new ITone 6 has been released recently and George got really keen to buy it. Unfortunately, he didnt have enough money, so George was going to work as a programmer. Now he faced the following problem at the work. Given a sequence of …

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

先来个简单的,欢迎我们神秘嘉宾——main.c。这是我们第一个c语言代码。 1 int main(void) { 2 while(1); 3 return 0; 4 }它没法再简单啦,简单的程序似乎能帮助咱们更容易的理解所学的知识,哈哈,我说的是似乎,其实&…

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

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

【Codeforces - 900C】Remove Extra One(思维,STLset,tricks)

题干: You are given a permutation p of length n. Remove one element from permutation to make the number of records the maximum possible. We remind that in a sequence of numbers a1, a2, ..., ak the element ai is a record if for every integer…

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

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

【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…