用户态,内核态和中断处理过程

库函数将系统调用封装起来

用户态和内核态的差别:

在内核态时,cs和eip的值可以是任意地址,但在用户态时只能访问0x00000000 - 0xbfffffff,0x000000000以上的地址只能在内核态访问

一般现代CPU都有几种不同的指令执行级别
在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态
而在相应的低级别执行状态下,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动
CPU每条指令的读取都是通过cs:eip这两个寄存器:其中cs是代码段选择寄存器,eip是偏移量寄存器

中断处理的完整过程:

interrupt(ex:int 0x80)-save
SAVE_ALL
RESTORE_ALL
iret-pop cs:eip/ss:esp/eflags from kernel stack

中断处理是从用户态进入到内核态的主要方式
系统调用是一种特殊的中断

用户态-->内核态:必须保存用户态寄存器的上下文,同时将内核态的值放入当前cpu中。
中断/int指令会在堆栈上保存一些寄存器的值,如用户态栈顶地址,当时的状态字,当时的cs:eip的值

  • 保护现场就是进入中断程序 保存需要用到的寄存器的数据
  • 恢复现场就是推出中断程序 恢复保存寄存器的数据
    系统调用概述
    -------------
    系统调用的意义:

系统调用和API的关系:

系统调用的三层皮:xyz,system_call,sys_xyz
中断向量0x80与system_call绑定起来
系统用将xyz与sys_xyz相关联起来

系统调用的传递方法:

使用库函数API和C代码中嵌入汇编代码触发系统调用

c代码中嵌入汇编代码

实验

汇编代码调用系统调用过程分析:

  • 首先将ebx寄存器清零,表示无参数传入
  • 然后将0x31放入eax,表示需要调用的系统调用号49
  • 执行int 0x80来执行系统调用
  • 之后eax寄存器保存了返回值,将它赋值给输出uid变量
  • 完成整个汇编代码的系统调用

总结:

在Linux系统中是通过激活0x80中断来触发系统调用的,需要调用的系统调用号实现赋值给eax存储器,如果有传入参数可赋值给ebx寄存器,如果多于1个则按顺序赋值给ebx、ecx、edx、esi、edi、ebp,如果超过6个则通过指针变量指向另一片堆栈区,如果无参数传入则赋值为0。并且也学到了可以通过库函数API使用系统调用或者用汇编方式触发系统调用。

最新文章

  1. 表值函数与JS中split()的联系
  2. 利用模板将HTML从JavaScript中抽离
  3. 日期关联取最近日期的SQL
  4. linux下将不同线程绑定到不同core和cpu上——pthread_setaffinity_np
  5. iOS GCD学习笔记
  6. 006_Salesforce Sharing 使用说明
  7. 【HDU 5833】Zhu and 772002(异或方程组高斯消元)
  8. ASP.NET页面传值不使用QueryString
  9. yii和php的一些细节
  10. qml 封装技巧-利用数据来进行适配
  11. [SAP ABAP开发技术总结]OK_CODE
  12. office文件密码破解方法及软件
  13. 数据操作So easy-LINQ解析
  14. 圣诞节来了,雪花纷飞的CSS3动画,还不首页用起来
  15. XML的基本操作
  16. cocos2d-x 定时器selector的使用 :schedule的使用
  17. java中的GC(gabage collection)如何工作
  18. 停止预览时调用Camera.release(), 出现Method called after release()异常问题原因及解决办法
  19. flume原理
  20. Ubuntu composer 安装thinkphp5 失败,报错:[ErrorException] mkdir(): Permission denied

热门文章

  1. Beta 冲刺 (7/7)
  2. Linux vsftpd 配置文件详解
  3. java多重转型问题
  4. JAVA框架:hibernate
  5. Android自定义布局的背景在多分辨率的情况下设置fill_parent时背景不能够横向全屏的问题解决
  6. python_基础硬件知识
  7. iscsi target IET架构
  8. SAP函数 LAST_DAY_OF_MONTHS 获取月末最后一天日期
  9. Vue 使用细节收集
  10. 查询表的DDL