一、系统调用的实现框图
二、系统调用的实现细节
注:
1、glibc
glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象。而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。在 GNU/Linux 系统中,其C函式库发展史点出了GNU/Linux 演进的几个重要里程碑,用 glibc 作为系统的C函式库,是GNU/Linux演进的一个重要里程碑。
2、uglibc
在计算术语中,uClibc 是一个面向嵌入式Linux系统的小型的C标准库。最初uClibc是为了支持uClinux而开发,这是一个不需要内存管理单元的Linux版本,因此适合于微控制器系统(uCs;此处"u"是代表"micro"的μ的罗马化)。
uClibc比一般用于Linux发行版的C库GNU C Library (glibc)要小得多,glibc目标是要支持最大范围的硬件和内核平台的所有C标准,而uClibc专注于嵌入式Linux.很多功能可以根据空间需求进行取舍。
uClibc运行于标准的以及无MMU的Linux系统上,支持i386,x86 64,ARM (big/little endian), AVR32,Blackfin,h8300,m68k,MIPS (big/little endian), PowerPC,SuperH (big/little endian), SPARC,和v850等处理器。
3、weak_alias
是一个宏,其目的是为函数添加一个”弱”别名,与”强”符号函数名区分。
说明, 如果调用函数无对应的函数无”强”符号对应的函数,则会调用该别名对应的函数
C/C++ 函数调用是以编译后的”符号”做索引调用,详情了解 <符号表>
详情见:
C语言 : weak_alias描述
4、软中断
软中断是利用硬件中断的概念,用软件方式进行模拟,实现从用户模式切换到特权模式并执行特权程序的机制。
硬件中断是由电平的物理特性决定,在电平变化时引发中断操作。而软中断是通过一条具体指令SWI,引发中断操作,也就是说用户程序里可以通过写入SWI指令来切换到特权模式,当CPU执行到SWI指令时会从用户模式切换到管理模式下,执行软件中断处理。由于SWI指令由操作系统提供的API封装起来,并且软件中断处理程序也是操作系统编写者提前写好的,因此用户程序调用API时就是将操作权限交给了操作系统,所以用户程序还是不能随意访问硬件。
5、swi指令
SWI指令编码中immed_24为24位任意有效立即数(范围0~2^24-1),当该指令被执行时系统产生软中断异常,切换到管理模式下。
用户程序切换到管理模式下后,进入到软中断处理程序,通常软中断异常处理程序都是系统开发人员提前写好的,SWI切换到了特权模式,执行的是系统开发人员写好的异常处理程序,只要该处理程序没有问题,那么用户程序还是不能为所欲为的。SWI指令后面的24立即数是干什么用的呢?
用户程序通过SWI指令切换到特权模式,进入软中断处理程序,但是软中断处理程序不知道用户程序到底想要做什么?SWI指令后面的24位用来做用户程序和软中断处理程序之间的接头暗号(存放_NR_open)。
通过该软中断立即数来区分用户不同操作,执行不同内核函数。