程序员的自我修养(7)

文章介绍了运行库在程序执行中的作用,包括入口函数的初始化、IO操作如open和fopen,以及线程的概念。同时,详细阐述了系统调用作为应用程序与内核交互的接口,如何通过中断机制在用户模式和内核模式间切换,并以Linux为例说明其系统调用的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行库

能够使程序的函数能够正常启动,让各种熟知的函数发挥作用,他们就是应用程序的运行库。
1.入口函数与程序初始化
程序被系统装载后,第一步肯定不是运行main函数的第一句,而是进行其它一些代码,这些代码负责准备main函数执行所需要的环境,并且调用main函数。
这些代码的函数称为入口函数或入口点,程序的入口实际是一个程序的初始化部分,它往往是运行库的一部分。以下是具体步骤
1.创建程序进程后,会将控制权交给程序的入口,通常是运行库的函数。
2.入口函数对运行库和程序的运行环境进行初始化,包括堆,IO,线程,全局变量构造,等等。
3.入口函数完成初始化后,调用main函数,正式开始执行程序主体部分。
4.main函数执行完成后,返回到入口函数,入口函数进行清理工作,内存释放关闭IO等等。

2.运行库与IO
IO即输入与输出,个人理解,更像一个通道,连接程序与外界资源,这里的资源可以是文件,设备,网络等。但用文件统一称呼比较好,在LINUX下,一切设备都可以看做文件。对一个文件,运行库提供了很多函数,主要是open,close与fopen与fclose。open对应的函数使用的是文件描述符,是一个整数(为什么一个整数可以指向文件,因为每个进程有一个独立的打开文件表,这个表是一个指针数组,那么这个fd其实就是下标嘛)。fopen使用的是FILE结构的指针。

3.运行库与多线程
线程的访问能力很自由能够访问进程内存内的所有数据,设置其它线程的数据,但实际运用过程中线程也有自己的数据,栈,线性局部存储,寄存器。linux标准库是没有线程操作的,需要在链接的时候链接线程库。

系统调用API

系统调用是操作系统内核之间与应用系统的接口,决定了应用程序如何与内核打交道。
1.什么是系统调用
简单的来说,有一些操作,应用程序不借助操作系统无法办到或有效办到。例如要延时1S,程序只能for循环一直i++等待时间到,但这样消耗CPU资源,但操作系统本身有定时器,可以直接使用。例如我要修改一个文件没有权限,也不能擅自修改,只能请求操作系统帮忙修改。
所以为了让应用程序有一定能力使用操作系统的能力,用于程序操作使用。每个操作系统会提供一套接口,这些接口通常通过中断实现,linux下系统调用以0x80号中断进入。
系统调用的功能也很强大,创建,退出进程,线程。进程的内存管理,对系统资源的访问,对图形界面的操作等等。
2.linux的系统调用
在x86下,系统调用由0x80中断完成,哥哥哥通用寄存器用于参数传递。EAX寄存器用于系统调用的接口号,例如EAX=1表示退出进程,=2创建,=3读取文件或者IO,=4写文件或IO等等。这些操作通常放在#include<unistd.h>头文件内,也有对应的函数。
3.特级权与中断
在操作系统中,通常有两种模式,用户模式与内核模式,内核模式能进行的操作会更加的底层和关键,特别是一些可能危害系统的操作。用户态执行不了的内核命令需要通过中断来从用户态转变到内核态。
中断有两个属性,一个是中断号,一个是中断函数。操作系统存在一个中断向量表,通过中断号就能够访问对应的中断函数。但并不是一个中断号对应一个函数,是一个或多个中断号对应一系列的函数,例如0x80进入中断只是知道要运行系统调用函数了,但是还有一个系统调用号用于确定调用的是那个函数。EAX寄存器存储系统调用号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值