本来说好的接下来的工作是要去“丰满”我们的内核,可咱们这种一步一回头的学习方式还得继续啊。其实我了解大家急切写内核的心情,但本书《操作系统真象还原》(请大家支持正版)的目的不是写一个操作系统就完事了,而是让大家明白一个至少能运行的操作系统为什么要这样写,所以咱们的学习方式必然是边学习理论知识边实践。如果不给大家交待清楚必要的理论知识,我也对不起自己的良心,我不能为了自己的懒惰而假装大家都明白了。另外,既然咱们都渴望学习,能了解到更多的混合编程方式不是更好吗,好啦,不煽情了,开始学习go! go! go!。

开门见山,汇编语言和c语言混合编程可分为两大类:

  1. 单独的汇编代码文件与单独的c语言文件分别编译成目标文件后,一起链接成可执行程序。
  2. 在c语言中嵌入汇编代码,直接编译生成可执行程序。

本节所说的“汇编语言和c语言混合编程”属于第1种,第2种的内嵌汇编又称为内联汇编,以后咱们会有专门的章节来说的。在内核文件中,有些比较长的汇编代码真不适合用内联汇编完成,还是需要专门写个汇编代码文件专项专用。

简单起见,咱们先学习下linux系统调用,利用系统调用能够帮助简化演示的模型。

系统调用是linux内核提供的一套子程序,它和windows的动态链接库dll文件的功能一样,用来实现一系列在用户态不能或不易实现的功能,比如最常见的读写硬盘文件,只有操作系统有权限去访问硬件,用户程序是没有权限的,用户程序只能向操作系统寻求帮助,故系统调用是供用户程序来使用的,操作系统权利至高无上,不需要使用自己对外发布的功能接口,即系统调用。

由于是用户程序想使用操作系统提供的功能,所以系统调用又称为操作系统功能调用。

系统调用很像bios中断调用(在很久很久以前咱们有说过bios中断、dos中断等内容),只不过系统调用的入口只有一个,是第0x80号中断,它不像bios中断那样,几乎是一个功能就有一个入口,所以您在bios中断手册中会见到那么多的中断调用啦,比如中断号 0~0x20都是bios的中断调用。

为什么系统调用只有一个入口呢?以后咱们学习中断机制的时候就会明白,中断的实现是要用到中断描述符表的,表中很多中断项(号)是被预留的,不能强占,所以linux就选了一个可用的中断号做个所有系统调用的统一入口,具体的子功能在寄存器eax中单独指定。

总之,bios中断走的是中断向量表,所以有很多中断号给它用,而系统调用走的是中断描述符表中的一项而已,所以只用了第0x80项中断。

一步步编写操作系统 66 浅析c库函数与系统调用1相关推荐

  1. 一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

    一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法.咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量.如今我们要写一个打印函数了, ...

  2. 一步步编写操作系统 69 汇编语言和c语言共同协作 70

    由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...

  3. 一步步编写操作系统 62 函数调用约定

    由于我们要将c语言和汇编语言结合编程啦,所以一定会存在汇编代码和c代码相互调用的问题,有些事情还是要提前交待给大家的,本节就是要给大家说下函数调用规约中的那些事儿. 函数调用约定是什么? 调用约定,c ...

  4. 一步步编写操作系统 67 系统调用的实现1-2 68

    接上文: 系统调用的子功能要用eax寄存器来指定,所以咱们要看看有哪些系统调用啦,在linux系统中,系统调用是定义在/usr/include/asm/unistd.h文件中,该文件只是个统一的入口, ...

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

    在这之前,我们一直用汇编语言直接与机器对话,如果大家不知道这个世界上有高级语言的话,我想大家也不会觉得写汇编代码的过程很辛苦,哈哈,幸福确实是比较出来的.相对于汇编语言,用c 语言写内核是非常爽的事, ...

  6. 一步步编写操作系统 2 部署工作环境 2

    1.22汇编语言编译器新贵,NASM "新"是相对于旧来说的,老的汇编器MASM和TASM已经过时了,从名称上可以看出字母n是在m之后,其功能必然有所超越才会被大家接受. 请用一句 ...

  7. 一步步编写操作系统(1)

    为什么80%的码农都做不了架构师?>>>    平台:VMwave workstation 虚拟机,linux 5操作系统. 安装arm-elf-gcc 1.下载leeos_tool ...

  8. ftp无法连接虚拟机_一步步编写操作系统4 安装x86虚拟机 bochs

    本节内容摘自<操作系统真象还原>,请大家支持正版 Bochs下载安装 在完成了linux发行版的安装后,现在到了安装bochs的环节,这是我们的操作系统最终的宿主机. 由于我的工作是运维, ...

  9. 一步步编写操作系统 77 内联汇编与ATT语法简介

    内联汇编 之前和大家介绍过了一种汇编方法,就是C代码和汇编代码分别编译,最后通过链接的方式结合在一起形成可执行文件. 另一种方式就是在C代码中直接嵌入汇编语言,强大的GCC无所不能,咱们本节要学习的就 ...

最新文章

  1. Objetive-C +load方法研究
  2. 为什么 ConcurrentHashMap 的读操作不需要加锁?
  3. 关于微型计算机的ppt,微型计算机基础知识.ppt
  4. 每日一皮:自己运行正常,测试一测就有bug
  5. c语言输入十个英文国名,c语言程式设计 在主函式输入10个字元,用子函式求出共输入几个英文字元,几个数字字元,几个符号%...
  6. 交叉编译器的命名规则及详细解释(arm/gnu/none/linux/eabi/eabihf/gcc/g++)
  7. char* 赋值 const char* 释放_嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”const)》...
  8. docker centos7 安装ssh
  9. [vb] Set 语句
  10. 在写易买网时产生的错误 JSTL标签库中c:choose/c:choose不能放JSP页面!-- --注释...
  11. 拓端tecdat|R语言中的模拟过程和离散化:泊松过程和维纳过程
  12. 录制高清微课视频,录屏软件有什么推荐?
  13. 计算机教师招聘10分钟试讲,小学数学教师招聘考试面试,要求是一个小时备课,试讲十分钟,怎么准备?求助各位前辈~...
  14. 计算机毕设 SSM线上少儿编程系统 在线少儿编程学习系统 少儿编程教育课程平台Java
  15. Java程序出现不正常情况
  16. Android计算器功能的实现
  17. 软件测试真的有那么好吗?
  18. Java里重写toString的作用
  19. Redis监控汇总一
  20. java年轻代频繁gc_JVM young GC频繁,内存泄漏

热门文章

  1. 01-Javascript简介
  2. LOJ#6002. 「网络流 24 题」最小路径覆盖
  3. 【BZOJ3677】[Apio2014]连珠线 换根DP
  4. javascript删除数组里的对象
  5. GridView应用整理
  6. 用多媒体库 Bass.dll 播放 mp3 [15] - 设置与获取播放速度
  7. [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]
  8. 【软考】[信息安全工程师]
  9. oracle t44,SecureFiles LOBs基础知识之存储篇
  10. pb graph鼠标移上显示数据_Plotly数据可视化:离线版、微软vscode版的Python的基本作图...