一步步编写操作系统 66 浅析c库函数与系统调用1
本来说好的接下来的工作是要去“丰满”我们的内核,可咱们这种一步一回头的学习方式还得继续啊。其实我了解大家急切写内核的心情,但本书《操作系统真象还原》(请大家支持正版)的目的不是写一个操作系统就完事了,而是让大家明白一个至少能运行的操作系统为什么要这样写,所以咱们的学习方式必然是边学习理论知识边实践。如果不给大家交待清楚必要的理论知识,我也对不起自己的良心,我不能为了自己的懒惰而假装大家都明白了。另外,既然咱们都渴望学习,能了解到更多的混合编程方式不是更好吗,好啦,不煽情了,开始学习go! go! go!。
开门见山,汇编语言和c语言混合编程可分为两大类:
- 单独的汇编代码文件与单独的c语言文件分别编译成目标文件后,一起链接成可执行程序。
- 在c语言中嵌入汇编代码,直接编译生成可执行程序。
本节所说的“汇编语言和c语言混合编程”属于第1种,第2种的内嵌汇编又称为内联汇编,以后咱们会有专门的章节来说的。在内核文件中,有些比较长的汇编代码真不适合用内联汇编完成,还是需要专门写个汇编代码文件专项专用。
简单起见,咱们先学习下linux系统调用,利用系统调用能够帮助简化演示的模型。
系统调用是linux内核提供的一套子程序,它和windows的动态链接库dll文件的功能一样,用来实现一系列在用户态不能或不易实现的功能,比如最常见的读写硬盘文件,只有操作系统有权限去访问硬件,用户程序是没有权限的,用户程序只能向操作系统寻求帮助,故系统调用是供用户程序来使用的,操作系统权利至高无上,不需要使用自己对外发布的功能接口,即系统调用。
由于是用户程序想使用操作系统提供的功能,所以系统调用又称为操作系统功能调用。
系统调用很像bios中断调用(在很久很久以前咱们有说过bios中断、dos中断等内容),只不过系统调用的入口只有一个,是第0x80号中断,它不像bios中断那样,几乎是一个功能就有一个入口,所以您在bios中断手册中会见到那么多的中断调用啦,比如中断号 0~0x20都是bios的中断调用。
为什么系统调用只有一个入口呢?以后咱们学习中断机制的时候就会明白,中断的实现是要用到中断描述符表的,表中很多中断项(号)是被预留的,不能强占,所以linux就选了一个可用的中断号做个所有系统调用的统一入口,具体的子功能在寄存器eax中单独指定。
总之,bios中断走的是中断向量表,所以有很多中断号给它用,而系统调用走的是中断描述符表中的一项而已,所以只用了第0x80项中断。
一步步编写操作系统 66 浅析c库函数与系统调用1相关推荐
- 一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74
一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法.咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量.如今我们要写一个打印函数了, ...
- 一步步编写操作系统 69 汇编语言和c语言共同协作 70
由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...
- 一步步编写操作系统 62 函数调用约定
由于我们要将c语言和汇编语言结合编程啦,所以一定会存在汇编代码和c代码相互调用的问题,有些事情还是要提前交待给大家的,本节就是要给大家说下函数调用规约中的那些事儿. 函数调用约定是什么? 调用约定,c ...
- 一步步编写操作系统 67 系统调用的实现1-2 68
接上文: 系统调用的子功能要用eax寄存器来指定,所以咱们要看看有哪些系统调用啦,在linux系统中,系统调用是定义在/usr/include/asm/unistd.h文件中,该文件只是个统一的入口, ...
- 一步步编写操作系统 42 用c语言编写内核
在这之前,我们一直用汇编语言直接与机器对话,如果大家不知道这个世界上有高级语言的话,我想大家也不会觉得写汇编代码的过程很辛苦,哈哈,幸福确实是比较出来的.相对于汇编语言,用c 语言写内核是非常爽的事, ...
- 一步步编写操作系统 2 部署工作环境 2
1.22汇编语言编译器新贵,NASM "新"是相对于旧来说的,老的汇编器MASM和TASM已经过时了,从名称上可以看出字母n是在m之后,其功能必然有所超越才会被大家接受. 请用一句 ...
- 一步步编写操作系统(1)
为什么80%的码农都做不了架构师?>>> 平台:VMwave workstation 虚拟机,linux 5操作系统. 安装arm-elf-gcc 1.下载leeos_tool ...
- ftp无法连接虚拟机_一步步编写操作系统4 安装x86虚拟机 bochs
本节内容摘自<操作系统真象还原>,请大家支持正版 Bochs下载安装 在完成了linux发行版的安装后,现在到了安装bochs的环节,这是我们的操作系统最终的宿主机. 由于我的工作是运维, ...
- 一步步编写操作系统 77 内联汇编与ATT语法简介
内联汇编 之前和大家介绍过了一种汇编方法,就是C代码和汇编代码分别编译,最后通过链接的方式结合在一起形成可执行文件. 另一种方式就是在C代码中直接嵌入汇编语言,强大的GCC无所不能,咱们本节要学习的就 ...
最新文章
- Objetive-C +load方法研究
- 为什么 ConcurrentHashMap 的读操作不需要加锁?
- 关于微型计算机的ppt,微型计算机基础知识.ppt
- 每日一皮:自己运行正常,测试一测就有bug
- c语言输入十个英文国名,c语言程式设计 在主函式输入10个字元,用子函式求出共输入几个英文字元,几个数字字元,几个符号%...
- 交叉编译器的命名规则及详细解释(arm/gnu/none/linux/eabi/eabihf/gcc/g++)
- char* 赋值 const char* 释放_嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”const)》...
- docker centos7 安装ssh
- [vb] Set 语句
- 在写易买网时产生的错误 JSTL标签库中c:choose/c:choose不能放JSP页面!-- --注释...
- 拓端tecdat|R语言中的模拟过程和离散化:泊松过程和维纳过程
- 录制高清微课视频,录屏软件有什么推荐?
- 计算机教师招聘10分钟试讲,小学数学教师招聘考试面试,要求是一个小时备课,试讲十分钟,怎么准备?求助各位前辈~...
- 计算机毕设 SSM线上少儿编程系统 在线少儿编程学习系统 少儿编程教育课程平台Java
- Java程序出现不正常情况
- Android计算器功能的实现
- 软件测试真的有那么好吗?
- Java里重写toString的作用
- Redis监控汇总一
- java年轻代频繁gc_JVM young GC频繁,内存泄漏
热门文章
- 01-Javascript简介
- LOJ#6002. 「网络流 24 题」最小路径覆盖
- 【BZOJ3677】[Apio2014]连珠线 换根DP
- javascript删除数组里的对象
- GridView应用整理
- 用多媒体库 Bass.dll 播放 mp3 [15] - 设置与获取播放速度
- [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]
- 【软考】[信息安全工程师]
- oracle t44,SecureFiles LOBs基础知识之存储篇
- pb graph鼠标移上显示数据_Plotly数据可视化:离线版、微软vscode版的Python的基本作图...