运行库
每种语言的程序运行都需要其运行库的支持, java需要java虚拟机、JavaScript需要js引擎, C语言也需要glibc(Linux上)的支持。所谓运行库,就类似于语言的框架,编写语言时,需要根据框架的定义进行编程。比如,我们约定程序都是从main函数开始执行,用户就必须编写main函数,运行库在准备好运行环境之后,再调用main函数开始运行。
运行库glibc的入库为_start, 由链接器设置。
运行库功能包含
- 程序的启动与退出
- 标准函数库
- IO库封装
- 堆的实现
- 语言实现,语言功能
- 调试
IO
运行库提供IO文件的操作,存在fd、FILE指针、内核对象等概念。
运行库在调用用户代码之前, 会进行IO初始化,创建fd与FILE等的对应关系, 这样就可以在用户代码中调用printf, scanf等函数。
系统调用
所谓系统调用,就是用户程序为了访问系统资源而调用的系统提供的API接口。系统调用会对系统资源进行保护和调度,对用户程序屏蔽了具体的细节。很多资源用户程序本身是没有权限、或者没有途径直接进行访问,需要通过系统调用来实现。系统调用提供文件的读写、网络通信、终端输出、进程的创建与退出等功能。
系统调用的接口比较原始,直接使用系统调用可能需要相关的知识。 运行库作为用户程序与系统调用的中间层,屏蔽了一些细节,对不同平台的系统调用进行了整合。
现代CPU存在特权级, 分为用户模式和内核模式。用户程序处于用户态, 系统调用处于内核态。用户态代码对访问设备、开关终端等操作是受限的。系统通过中断切换运行的模式。当CPU接收到中断的时候,会暂停当前的处理流程,然后 根据中断向量表找到对应的中断处理程序进行处理,处理结束后再继续处理之前的流程。由于中断号是有限的, 因此,一般多个系统调用共用一个中断号,然后根据系统调用号来区分不同的系统调用。linux的系统调用中断一般是0x80, 然后通过eax寄存器存储系统调用号。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。