linux内核学习(4)_库函数API和C代码嵌入汇运用用系统调用

理论基础

内核与用户

运行模式(mode)
Linux 使用了其中的两个:特权级0和特权级3 ,即内核模式(kernel mode) 和用户模式(user mode )
地址空间(space )
a)每个进程的虚拟地址空间可以划分为两个部分:用户空间和内核空间
b)在用户态下只能访问用户空间;而在核心态下,既可以访问用户空间,又可以访问内核空间。 
c)内核空间在每个进程的虚拟地址空间中都是固定的(虚拟地址为3G~4G的地址空间)。
上下文(context )
一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。
a)用户级上下文:正文、数据、用户栈以及共享存储区;
b)寄存器上下文:通用寄存器、程序寄存器(IP )、处理机状态寄存器(EFLAGS)、栈指针(ESP);
c)系统级上下文:进程控制块task_struct 、内存管理信息(mm_struct 、vm_area_struct、pgd 、pmd、
   pte 等)、核心栈等。

系统调用

概念

系统调用是内核向用户进程提供服务的唯一方法,应用程序调用操作系统提供的功能模块(函数)。用户程序通过系统调用从用户态(user mode)切换到核心态(kernel mode ),从而可以访问相应的资源。这样做的好处是:为用户空间提供了一种硬件的抽象接口,使编程更加容易。有利于系统安全。有利于每个进程度运行在虚拟系统中,接口统一有利于移植。

a)Linux 的应用编程接口(API)遵循POSIX标准
b)Linux 的系统调用作为c库的一部分提供。c库中实现了Linux 的主要API,包括标准c库函数和系统调用。
c)应用编程接口(API)其实是一组函数定义,这些函数说明了如何获得一个给定的服务; 而系统调用是通过软中断向内核发出一个明确的请求,每个系统调用对应一个封装例程(wrapper routine,唯一目的就是发布系统调用)。一些API应用了封装例程。API还包含各种编程接口,如:C库函数、OpenGL 编程接口等
d)系统调用的实现是在内核完成的,而用户态的函数是在函数库中实现的


系统调用所需要参数

它在内核态下的参数传递方式和用户态下不太一样,不是通过栈而是通过寄存器来存放参数(在64位系统中用户程序的参数也变为

用寄存器存放),若参数个数不超过6个可以使用ebx, ecx,edx,esi,edi,ebp来存放(eax中存放系统调用号,系统调用号列表见:/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl超过的话要用一个单独的寄存器存放指向所有这些参数在用户空间地址的指针。



系统调用的主要过程

1、程序调用libc 库的封装函数。
2、调用软中断int 0x80  进入内核。
3、在内核中首先执行system_call 函数(首先将系统调用号(eax)和可以
   用到的所有CPU寄存器保存到相应的堆栈中(由SAVE_ALL完成)
),
   接着根据系统调用号在系统调用表中查找到对应的系统调用服务例程。
4、执行该服务例程。
5、执行完毕后,转入ret_from_sys_call 例程,从系统调用返回



实验基础

用于实现系统调用的处理程序函数,在形式上有如下几个共同的特性:
1,每个函数的名称前缀都是 sys_ ,将该函数唯一地标识为一个系统调用,
   更精确的说,标识为一个系统调用的处理程序函数。
2,所有的处理程序函数都最多接收 5 个参数否则,
   用一个单独的寄存器指向进程  地址空间中这些参数值所在的一个内存区即可
3,所有的系统调用都在内核态执行

系统调用由内核分配的一个编号唯一标识。
所有的系统调用都由一处中枢代码处理,根据调用编号和一个静态表,将调用分派到具体的函数。
传递的参数也是由中枢代码处理,这样参数的传递独立于实际的系统调用。
从用户态到内核态,以及调用分派和参数传递,都是由汇编语言代码实现的。
为容许用户态和内核态之间的切换,用户进程必须通过一条专用的机器指令,引起处理器/内核
对该进程的关注,这需要 C 标准库的协助。内核也必须提供一个例程,来满足切换请求并执行
相关操作。该例程不能在用户空间中实现,因为其中需要执行普通应用程序不允许执行的命令。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值