第四讲、扒开系统调用的三层皮(上)

1、一般现代CPU都有几种不同的指令执行级别

2、在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态

3、而在相应地低级别执行状态下,代码的掌控范围会受到限制。只能在对应级别允许范围内活动

4、Intel x86 CPU有四种不同的执行级别0-3,Linux只使用了其中的0级和3级分别来表示内核态和用户态

---------------------------------------

1、cs寄存器的最低两位表明了当前代码的特权级

2、CPU每条指令的读取都是通过cs:eip这两个寄存器:其中cs是代码段选择寄存器,eip是偏移量寄存器。上述判断是由硬件完成

3、一般来说,在Linux中,地址空间是一个显著地标志:0xc0000000以上的地址空间只能在内核态下访问,0x0000000 - 0xbfffffff的地址空间在两种状态下都可以访问,简单来说,用户态进程位于内存的0~3G空间中, 内核代码则位于内存3G以上的部分。(这里的地址空间是逻辑地址而不是物理地址 - CPU的MMU来进行地址转换)

--------------------------------------

寄存器上下文

1、从用户态切换到内核态时,必须要保存用户态寄存器的上下文

2、中断/int指令会在堆栈上保存一些寄存器的值。如:用户态栈顶地址、当时的状态字、当时的cs:eip的值

--------------------------------------

1、interrupt(ex: int 0x80) - save

cs:eip/ss:eip/eflags(current) to Kernel stack, then load cs:eip(entry of a specific ISR) and ss:eip(point to Kernel stack)

2、SAVE_ALL

  -...//内核代码,完成中断服务,发生进程调度

3、RESTORE_ALL

4、iret - pop cs:eip/ee:eip/eflag from Kernel stack

解释:CS:eip指向当前中断处理程序的入口,对于系统调用来说,则指向sys_call函数

----------------------------------------

系统调用的意义

1、操作系统为用户态进程与硬件设备进行交互提供了一组接口-系统调用。把用户从底层的硬件编程中解放出来。

2、应用编程接口(application program interface,API)和系统调用是不同的。API和系统调用的关系:将系统调用封装成一个API接口。系统调用通过软中断向内核发出一个明确的请求。

3、libc库定义的一些API引用了 封装例程(wrapper routine,唯一目的就是发布系统调用)

-一般每个系统调用对应一个封装例程

-库再用这些封装例程定义出给用户的API

4、不是每个API都对应一个特定的系统调用

-API可能直接提供用户态服务,如一个数学函数

-一个单独的API可能调用几个系统调用

-不同的API可能调用了同一个系统调用

5、返回值

-大部分封装例程返回一个整数,其值的含义依赖于相应的系统调用

- -1在多数情况下表示内核不能满足进程的请求

-libc中定义的errno变量包含特定的出错码

-------------------------------------------------------


int 0x80对应内核代码入口起点

sys_xyz() -> 中断服务程序

系统调用三层皮:xyz、system_call和sys_xyz

-------------------------------------------------------

1、当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数

-Linux中是通过执行int $0x80来执行系统调用的,这条汇编指令产生向量为128的编程异常

2、传参

-内核实现了很多不同的系统调用,进程必须指明需要哪个系统调用,这需要传递一个名为系统调用号的参数。使用eax寄存器传递。

-------------------------------------------------------

1、系统调用也需要输入输出参数,例如:

-实际的值

-用户态进程地址空间的变量的地址

-甚至是包含指向用户态函数的指针的数据结构的地址

2、system_call是Linux中所有系统调用的入口点,每个系统调用至少有一个参数,即由eax传递的系统调用

-一个应用程序调用fork封装例程,那么在执行int $0x80之前就把eax寄存器的值置为2(即_NR_FORK)。

-这个寄存器的设置是libc库中的封装例程进行的,因此用户一般不关心系统调用号

-进入sys_call之后,立即将eax的值压入内核堆栈

3、寄存器传递参数具有如下限制

-每个参数的长度不能超过寄存器的长度,即32位

-在系统调用号(eax)之外,参数的个数不能超过6个(ebx、ecx、edx、esi、edi、ebp),超过6个就把每一个寄存器作为一个指针,指向一段内存 进入到内核态之后,可以访问所有的内存地址空间。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第Ο章 写在前面...................................................................................................................2 第一章汇编语言简介.............................................................................................................3 第二章认识处理器.................................................................................................................4 2.1 寄存器........................................................................................................................4 2.2 使用寄存器................................................................................................................6 第三章操作内存...................................................................................................................12 3.1 实模式......................................................................................................................12 3.2 保护模式..................................................................................................................16 3.3 操作内存..................................................................................................................19 3.4 串操作......................................................................................................................21 3.5 关于保护模式中内存操作的一点说明.................................................................22 3.6 堆栈.........................................................................................................................23 本章小结.........................................................................................................................25 第四章利用子程序与中断...................................................................................................25 4.1 子程序......................................................................................................................25 4.2 中断..........................................................................................................................31 第五章编译优化概述...........................................................................................................34 5.1 循环优化:强度削减和代码外提.........................................................................36 5.2 局部优化:表达式预计算和子表达式提取.........................................................37 5.3 全局寄存器优化.....................................................................................................38 5.4 x86体系结构上的并行最大化和指令封包..........................................................40 5.5 存储优化..................................................................................................................42 第六章 Linux X86汇编程序设计........................................................................................46 6.1编译和链接...............................................................................................................46 6.2基本示例...................................................................................................................46 第七章 X86汇编指令集汇总...............................................................................................47 一.数据传输指令............................................................................................................47 二、算术运算指令.........................................................................................................49 三、逻辑运算指令.........................................................................................................49 四、串指令.....................................................................................................................50 五、程序转移指令.........................................................................................................50 六、伪指令.....................................................................................................................52 七、寄存器.....................................................................................................................52 八、位操作指令,处理器控制指令.............................................................................52 九、FPU instructions......................................................................................................54 第八章 GCC内联汇编基础..................................................................................................54 1. GCC汇编格式...........................................................................................................55 2.内联汇编基本形式......................................................................................................56 3. 扩展形式内联汇编....................................................................................................56 4. 深入constra................................................................................................................59 5.结束语..........................................................................................................................63

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值