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

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

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

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

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

一步步编写操作系统 42 用c语言编写内核相关推荐

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

    再把上节代码贴出来, 1 //int main(void) { 2 int _start(void) { 3 while(1); 4 return 0; 5 } 有没有同学想过,这里写一个_start ...

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

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

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

    先来个简单的,欢迎我们神秘嘉宾--main.c.这是我们第一个c语言代码. 1 int main(void) { 2 while(1); 3 return 0; 4 } 它没法再简单啦,简单的程序似乎 ...

  4. 世界上最著名的操作系统是用什么语言编写的?

    Unix 与 C 语言的关系 在服务器领域,最著名的系统莫过于Unix了,即便Linux也是类Unix的操作系统.Unix 是用 C 语言编写的,而且是世界上第一个用 C 语言编写的操作系统.但是 U ...

  5. magenta内核与linux,谷歌将推出新操作系统Fuchsia:Magenta语言为内核

    谷歌现在研发出来并且推出使用的系统有Chrome OS.Android和Chromecasts,这三者在操作系统的市场中占得份额很高,但是好像谷歌对此并不满意,因为有相关消息显示,谷歌正在研发新的操作 ...

  6. c语言编写的商品管理程序,C语言编写的商品管理系统

    C语言编写的商品管理系统 商品的增删改查 #include #include #include #define K 5 int m=2; //商品种数 /*定义商品结构体*/ struct goods ...

  7. C语言编写Python包,使用C语言编写Python扩展1——Hello World

    能够使用C语言编写扩展是Python一大卖点吧,这可以将一些关键的代码使用C来写以提升程序的性能.本文是参考了Python的官方文档整理而来的,同时结合了Python2跟Python3.按照惯例现在先 ...

  8. C语言编写一下棋程序,C语言编写的与电脑下棋程序代码

    C语言编写的与电脑下棋程序代码 C语言编写的与电脑下棋程序代码 #include "stdafx.h" #include using namespace std; void che ...

  9. matlab编写正整数阶乘函数,用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值....

    点击查看用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值.具体信息 答:编写一个matlab文件,求1到n的阶乘之和.其代码编写的目的,就是学会自定义 ...

最新文章

  1. 纯真IP库的结构分析及一个查询类
  2. php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解_PHP教程
  3. Maplace.js – 小巧实用的 jQuery 谷歌地图插件
  4. [].slice.call
  5. python paramiko远程执行命令打开窗口_使用Paramiko在远程机器上通过sshClient()执行本地python脚本...
  6. 冲突、冲突域、广播、广播域、洪泛的基本概念
  7. AI进入制造业 节省人工成本也能提高产品性能
  8. 2017《JAVA》预备作业 计科1501班 王奕开
  9. 比赛计分软件部分界面抓图
  10. bpsk调制及解调实验_调制的理解
  11. python画航线图_Python获取航线信息并且制作成图的讲解
  12. 【Linux】用户管理命令
  13. python基础练习题:找到一个圆锥的体积。【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶
  14. 配置flashgot+axel
  15. JPG图片在线翻译的操作方法
  16. python给ppt表格加边框_带你用Python玩转PPT
  17. html添加一条虚线垂直的,【html问题】在网页中添加垂直分割线
  18. VLC web插件 js接口
  19. 个人网站性能优化经历(10)网站增加访客记录
  20. ubunt linux解压gz,ubuntu解压命令

热门文章

  1. 《DSP using MATLAB》第6章开始了
  2. iOS 动画绘制线条颜色渐变的折线图
  3. 0421 AutoLayout的实践/基本使用
  4. HDU - 5878 A - I Count Two Three H 技巧枚举
  5. python中superclass是什么_深度解析并实现python中的super(转载,好文)
  6. java 对象访问权限_Java面向对象编程之访问控制权限
  7. mysql参数化查询为什么可以实现_为什么参数化SQL查询可以防止SQL注入?
  8. IDEA快捷键的使用成就手速之旅(要想手速变得快,快捷练习必须刚)
  9. 1315B. Homecoming
  10. Codeforces Global Round 15 (A-D)没有C