zoukankan      html  css  js  c++  java
  • Linux内核分析第四周学习总结——系统调用的工作机制

    Linux内核分析第四周学习总结——系统调用的工作机制

    内核态

    执行级别高,可以执行特权指令,访问任意物理地址,在intel X86 CPU的权限分级为0级。

    用户态

    执行级别低,只能访问0x00000000-0xbfffffff之间的逻辑地址,权限分级为3级。

    区分与切换

    CS:eip(代码段选择寄存器/偏移量寄存器)中,CS寄存器最低两位表示特权级。状态通过中断来切换,包括硬件中断和系统调用两种方式。

    寄存器上下文

    从用户态切换到内核态时,int指令会保存用户态的寄存器上下文到内核堆栈中,同时会把当前内核态的一些信息加载,例如cs:eip指向中断处理程序入口。

     用户态栈顶地址

     当时状态字

     当时cs:eip

    系统调用三层皮(以API xyz为例)

     API xyz

     中断向量system_call

     中断服务程序sys_xyz

    系统调用号通过eax寄存器传递,将API xyz和中断服务程序sys_xyz关联起来。

    Linux也可以通过int $128来执行系统调用

    实验过程:

    选用第2号调用fork

    1.使用库函数API()

    2.内嵌汇编

    原理分析:通过将调用号$0x2传入寄存器%eax,然后使用int指令执行系统调用。

    运行结果

    总结:

    对于系统调用的工作机制,我觉得我们可以将诸多系统调用视作按照序号排好顺序的黑箱,只要知道了一个系统调用的号,按照其API或者汇编格式的调用方法,我们就可以使用这个黑箱的功能,完成一定的任务,而黑箱的内容正是系统给我们提供的服务,帮我们从硬件操作中抽离出来,提高系统的安全性。

    zl + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

  • 相关阅读:
    日志记录到txt文件
    使用NuGet安装EntityFramework4.2
    Redis 安装与简单示例 <第一篇>
    时间加减时间段(年、月、日、分、秒)
    控件属性设置
    window.showModalDialog 与window.open传递参数的不同?
    如何进行js动态生成option?如何实现二级连动?
    System.Data.SqlClient.SqlError: 备份集中的数据库备份与现有的 'XXX' 数据库不同
    如何激发手机的高分辨率
    PHP--正则表达式和样式匹配--小记
  • 原文地址:https://www.cnblogs.com/20135319zl/p/5292048.html
Copyright © 2011-2022 走看看