《Linux内核与分析》第四周

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Linux内核与分析》第四周相关的知识,希望对你有一定的参考价值。

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内核与分析》第四周的主要内容,如果未能解决你的问题,请参考以下文章

20135201李辰希 《Linux内核分析》第四周 扒开系统调用的“三层皮”

《Linux内核分析》第四周笔记 扒开系统调用的三层皮(上)

Linux内核设计第四周——扒开系统调用三层皮

Linux内核分析(第四周)

《Linux内核分析与实现》 第四周 读书笔记

20169217 linux内核原理与分析 第四周作业