c语言-系统调用和C语言库函数

问题描述

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

解决方案

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

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

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

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

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

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

时间: 2024-10-22 22:03:44

c语言-系统调用和C语言库函数的相关文章

Swift语言指南(九) Swift语言的基本运算符

运算符(operator)是用来检查,改变或合并值的一种特殊符号或短语.例如,加号运算符让两个数字相加(如:let i = 1 + 2),还有些更复杂的运算符,如逻辑与运算符(&&)(如:if enteredDoorCode && passedRetinaScan)和自增运算符(++i)(将 i 的值加 1 的便捷写法). Swift 支持标准C语言的大多数运算符,并且改进了一些特性以规避常见的代码错误.赋值运算符(=)是没有返回值的,这样是为了避免在使用等于运算符(==)

c语言基础问题-C语言基础问题,基本类型,

问题描述 C语言基础问题,基本类型, 为什么六种整数类型的每一种所表示的取值范围度会根据机器的不同而不同 .如果我想了解,要看什么书. 解决方案 和机器无关,和编译器有关.你用turbo c编译,即便用的是64bit的windows 10,int 也是16bir 建议你看C primer 解决方案二: 一种语言,基本数据类型因为编译器的不同而不同,这在今天看上去很雷人.但是C语言是一种充满缺陷和坑的古老的语言. 也许它的标准制定者自以为聪明地认为,这样做,那些16bit的程序不用修改源代码就变成

r语言-在C# 程序里 调用R语言 调用完R语言后C#程序也跟着结束了,怎么让他不跟着结束呢?

问题描述 在C# 程序里 调用R语言 调用完R语言后C#程序也跟着结束了,怎么让他不跟着结束呢? 我程序里调用R语言的代码是这样的 REngine.SetEnvironmentVariables(); REngine engine = REngine.GetInstance(); engine.Evaluate(R_cmd); engine.Evaluate("q()"); engine.Dispose(); 这样有什么问题吗? 解决方案 你C#怎么写的?控制台程序可以加上一个Cons

用c 语言或者c++程序语言编写DGIM算法(近似计算窗口中1-bit的个数的算法)。

问题描述 用c 语言或者c++程序语言编写DGIM算法(近似计算窗口中1-bit的个数的算法). 1:以01stream.txt文件,好像不能上传附件,文件内容为01所组成的数据流,为自己所写程序的输入,读取中文件中的01数据流: 2:设定窗口大小1000,以不超过50%的相对误差回答任意时刻,当前窗口中有多少个1-bit: 3:设定窗口大小2000,以不超过10%的相对误差回答任意时刻,当前窗口中有多少个1-bit: 4:编写一个精确计算当前窗口中1-bit个数的精确程序,比较精确程序在运行时

设计模式 java语言-如何把自己定义的一个语言转换到java语言。想请问有人知道用什么设计模式比较好不?

问题描述 如何把自己定义的一个语言转换到java语言.想请问有人知道用什么设计模式比较好不? 如何把自己定义的一个语言转换到java语言.想请问有人知道用什么设计模式比较好不?

求助c语言高手帮在下解决几个棘手的问题, 就是帮忙把fortran语言转换成c语言

问题描述 求助c语言高手帮在下解决几个棘手的问题, 就是帮忙把fortran语言转换成c语言 READ(*,*)X0,EP N=1 10 X=1.0/(X0*X0+1.0) WRITE(*,200) N,X 200 FORMAT(1X,2HN=,I4,5X,2HX=,F10.6) IF (ABS(X-X0).LT.EP) GOTO 20 X0=X N=N+1 GOTO 10 20 STOP END

着急-这些sql语言对应的C#语言怎么编写?

问题描述 这些sql语言对应的C#语言怎么编写? //-------------------------------//考卷内容表drop table examcontent;create table ExamContent( Pid number(40) not null Tid number(40) null Type number(40) null Source number(10) null Answer varchar2(4000) null FullMark number(31) n

cursor-PL/SQL中什么变量必须定义?它属于强类型语言还是弱类型语言

问题描述 PL/SQL中什么变量必须定义?它属于强类型语言还是弱类型语言 declare begin for i in 0..5 loop for k in 1..i loop dbms_output.put(' '); end loop; for j in 1..11-2*i loop dbms_output.put('*'); end loop; dbms_output.put_line(''); end loop; end; i,j,k都不必先申明再使用 declare pename em

深入理解C语言的逻辑控制_C 语言

本文对C语言的逻辑控制做一番较为深入的探讨,一般来说C语言的逻辑控制语句主要有如下的7种: 1. goto 最强大,但一般只在特殊环境下使用. 2. if else 3. ?: 4. switch case 5. for 6. while 7. do while 自从dijkstra的论文Go To Statement Considered Harmful以后,C语言代码很少看到goto了.(一般用在多次资源分配的错误处理上) 但,从计算机的角度来说,缺少goto(jmp指令)还真没法干活.其实