2 u011285495 u011285495 于 2016.04.04 14:22 提问

系统调用和C语言库函数

最近学习操作系统,有些东西不是很明白。c语言的库函数有些是利用系统调用实现的,有些不是.我就想问下不是利用系统调用的那部分,在执行时硬件是怎么知道的呢?最后语言代码被编译成二进制,执行时仍然是由寄存器硬件什么执行的吧,既然没利用系统调用,alu这些东西是怎么懂这些库函数要求的操作是干嘛的啊?不是说系统调用是软硬件的接口吗?还有系统调用和驱动程序的关系是什么?

4个回答

lm_whales
lm_whales   Rxr 2016.04.04 18:52
已采纳

调用系统调用,代码跳入内核态,可以执行任何指令,包括 受保护的指令
在用户态,很多指令是受保护的,不能直接执行,或者执行会出错。
例如 286 以上的X86 系列及兼容CPU
IO指令,就是受保护的。
实际上,硬件之间是通过总线相连的,并通过,IO读写指令,内存读写指令,DMA 方式,等等相互通讯。
程序代码,被CPU取到,然后逐一执行
你写的代码,加载到内存后,操作系统用一个跳转指令(call,jump,ret,iret 等等,都属于跳转类指令)
转到你的代码中执行的

除非受到保护的指令,都是可以在用户态执行的,例如加法指令
数学库
math.h,的函数
string.h
就大部分代码都属于,非保护指令

而 IO库中的许多函数
例如
stdio.h
io.h
中的很多函数,都会调用系统调用的

qq_24941111
qq_24941111   2016.04.04 14:39

说说我的理解,C语言里的库函数在编译后都是生成的二进制指令,就包含了对硬件的操作。
举一个例子,“+”是对两个数进行操作,这两个数既可能是数字,也可能是变量。如果是数字,在汇编语言中对于的就是立即数,编译成二进制指令时直接利用无符号数加法指令就可以;而如果是变量的话,就会编译成多条指令,首先是从内存里读取变量到寄存器,再在寄存器中进行加法运算,运算完再保存到内存中。

qq_24941111
qq_24941111 ALU表示算术逻辑单元,是CPU的组成部分。不同CPU提供了不同的指令系统,80x86系列,ARM指令系统,以及x64系统的指令集都不一样,对ALU的操作实际上是利用CPU提供的指令集实现的。 编译系统能够把高级语言编译成二进制代码,每一条高级语言语句就对应一条或多条指令,而这些指令可以直接操作CPU。
一年多之前 回复
qq_24941111
qq_24941111 换句话说,编译系统决定了硬件怎么根据C程序进行操作。
一年多之前 回复
qq_24941111
qq_24941111   2016.04.04 14:46

驱动程序提供了使硬件正常工作的API,这些API是系统调用的实现。比如系统调用中Display()表示在显示器输出信息,而驱动程序实现了Display()这个函数,这样系统提供API,驱动程序实现这些API,应用程序调用API。

lm_whales
lm_whales   Rxr 2016.04.04 18:39

系统调用,一般通过 中断 或者C API之类的接口提供的。
使用了系统调用,就可以调用系统内核的函数
不使用系统调用,在DOS 时代,是可以直接操作 硬件的(寄存器,IO,内存)
现在操作系统,对硬件指令做了保护,你的代码,无法直接操作硬件
除非开发驱动程序,或者调用系统调用。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!