2019-2020-1 20199318《Linux内核原理与分析》第五周作业

第4章 系统调用的三层机制(上)

一、学习笔记

1. intel处理器一共有四种运行级别,linux使用了0,3两种运行级别,分别为内核态,用户态。
2. 内核态可以访问所有的内存,而用户态只可以访问0x00000000-0xbfffffff之间的内存。
3. 系统调用具有以下功能和特性:
   把用户从底层的硬件编程中解放出来。操作系统为我们管理硬件,用户态进程不用直接与硬件设备打交道。
   极大的提高系统的安全性。如果用户态进程直接与硬件设备打交道,会产生安全隐患,可能引起系统崩溃。
   使用户程序具有可移植性。用户程序与具体的硬件已经耦合并用接口代替了,不会有紧密的关系,便于在不同系统间移植。
4. 系统调用的执行过程:

    API->SYSTEM_CALL->SYS_XXX  其中system_call是运行在内核态的,是所有系统调用在内核的入口点,他在开始的时候保存用户态进程的执行上下文,结束后回复用户态进程的执行上下文,中间通过传入的系统调用号调用对应的中断服务程序。(中断:从用户态进入内核态)   sys_xxx是对应的系统调用封装例程。

二、试验记录

1.使用库函数API触发一个系统调用

C语言代码如下:

运行结果如下:

2.C代码中嵌入汇编代码出发一个系统调用

源代码如下:

运行结果如下:

3.代码分析。

#include <stdio.h>
#include <unistd.h>
int main(void){
    int u_id;
    asm volatile(
            "movl $0x14, %%eax\n\t"   //将系统调用号赋给eax寄存器
            "int $0x80\n\t"           //执行系统调用
            "movl %%eax, %0\n\t"      //将系统调用执行后的返回值赋给变量tt
            :"=m"(u_id)  
            );
    printf("%u\n",u_id);
    return 0;
    }

总结

对系统调用机制的理解

  • 系统调用是用户态进程访问硬件的一种方式,它通过中断(int 0x80)由用户态进入内核态。
  • 当一个用户态程序进行系统调用的时候,CPU进入内核态并执行内核函数。
  • 系统调用的过程:函数库提供的封装函数接口(API)->system_call(是所有系统调用的入口),这个入口会根据系统调用号(eax入栈),调用对应的系统调用例程
  • 系统调用最多使用6个寄存器作为参数(除eax外)-ebx,ecx,edx,esi,edi,ebp,如果超过6个参数,寄存器中将会保存一个指向内核态可以操作的一块的内存,参数保存在内存上面。

posted @ 2019-10-18 21:55  孙茂林  阅读(152)  评论(1编辑  收藏  举报