zoukankan      html  css  js  c++  java
  • 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
    	"   //将系统调用号赋给eax寄存器
                "int $0x80
    	"           //执行系统调用
                "movl %%eax, %0
    	"      //将系统调用执行后的返回值赋给变量tt
                :"=m"(u_id)  
                );
        printf("%u
    ",u_id);
        return 0;
        }
    

    总结

    对系统调用机制的理解

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

  • 相关阅读:
    迭代器设计模式
    python中的turtle库绘制图形
    Tesseract-OCR4.0识别中文与训练字库实例
    java图片处理
    Tess4J OCR简单使用教程
    C++ 排列最优解算法思想
    Swing使用JavaFXweb组件
    java专业术语
    java的分数类
    System Rules 更好的测试
  • 原文地址:https://www.cnblogs.com/SunMaolin/p/11701071.html
Copyright © 2011-2022 走看看