码迷,mamicode.com
首页 > 系统相关 > 详细

《Linux内核与分析》第四周

时间:2016-03-17 19:29:58      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

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,嵌入汇编代码:
技术分享

《Linux内核与分析》第四周

标签:

原文地址:http://www.cnblogs.com/dvew/p/5285685.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!