20135130王川东

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

CPU的几种不同的执行级别:

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

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

例:intel x86 CPU有四种不同的执行级别0-3,Linux只使用其中的0级和3级分别来表示内核态和用户态。

区分用户态和内核态:

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

CPU每条指令的读取都是通过cs:eip两个寄存器:cs:代码选择寄存器,eip:偏移量寄存器。

0xc0000000以上的地址空间只能在内核态下访问,

0x0000000-0xbfffffff的地址空间在二者状态下都可以访问(注:这里的地址空间是逻辑地址不是物理地址)

中断处理是从用户态进入内核态主要的方式

    系统调用只是一种特殊的中断

寄存器上下文

—从用户态切换到内核态时,

必须保存用户态的寄存器上下文,同时内核态的相应寄存器的相应的值

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

中断发生和结束:

中断发生后第一件是保存现场(进行中断程序 保存 需要用到的寄存器的数据)

 中断处理结束前最后一件事是恢复现场(退出中断程序恢复保存寄存器的数据)

二、系统调用概述

  意义:操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用

API -:应用编程接口

与系统调用区别:

  API只是一个函数定义

 系统调用是通过软中断向内核发出一个明确的请求。

不是每一个API都对应一个系统调用:

  API可能直接提供用户态服务。如一个数学函数
  一个单独的API可能调用几个系统调用
  不同的API可能调用了同一个系统调用

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

 -1在大多数情况下表示内核不能满足进程的请求
Libc中errno变量包含特定出错码
传参:
内核实现很多不同的系统调用,需要传递一个名为系统调用号的参数,
使用eax寄存器传递
实验:
选用24号系统调用:getuid。
代码如下:
1、使用库函数API:

2,嵌入汇编代码:

最新文章

  1. Netty 实现 WebSocket 聊天功能
  2. [Asp.net 5] Logging-日志系统的基本架构(上)
  3. Linux中Main函数的执行过程
  4. ACM2 斐波那契数列
  5. Win7 64位 VS2013环境编译boost1_58_0
  6. hdu 2051
  7. esriSRProjCSType Constants
  8. Android开发-API指南-Intent和Intent过滤器
  9. yii2 model常用验证规则
  10. 【实习记】2014-08-22试用SSH客户端XShell与SecuretyCRT与MobaXterm总结
  11. 把aspx页面输出成xml的方法注意事项
  12. 学习笔记TF027:卷积神经网络
  13. dnsmasq 做 DHCP 服务器
  14. golang:一个高性能低精度timer实现
  15. 网站开发进阶(十三)window.onload用法详解
  16. Java基础-变量常量
  17. LintCode: Maximum Subarray
  18. MySql和Sql的单行注释和多行注释的区别
  19. rotate-function
  20. 洛谷P2336 [SCOI2012]喵星球上的点名(后缀数组+莫队)

热门文章

  1. 【学时总结】 ◆学时·III◆ 二分图
  2. Java---Huffman树的实现
  3. 【Linux】进程管理
  4. MySQL----navicat for mysql(破解版)可视化数据库操作
  5. 前端基础-jQuery的动画效果
  6. Spring Web Async异步处理#Callable #DeferredResult
  7. python 爬虫基础知识(继续补充)
  8. SQL学习笔记:函数
  9. 20155213 实验一《Java开发环境的熟悉》实验报告
  10. 20145209 实验二 《Java面向对象程序设计》 实验报告