zoukankan      html  css  js  c++  java
  • 2019-2020-1 20199303《Linux内核原理与分析》第五周作业

    系统调用的三层机制

    API:第一层是指Libc中定义的API,这些API封装了系统调用,使用int 0x80触发一个系统调用中断;当然,并非所有的API都使用了系统调用,如完成数学加减运算的API就没有使用系统调用;也有可能某个API使用了多个系统调用;这一层存在的价值就是为应用程序员提供易于使用的API来调用系统调用;

    system_call:运行于内核态。system_call是所有系统调用在内核的入口点,在其中的开始处保护用户态程序执行上下文,结束处恢复用户态程序执行上下文,在中间根据传入的系统调用号对应的中断服务程序;

    sys_xyz 系统调用封装例程:执行具体的系统调用操作,完成用户的系统调用请求;每个系统调用都对应一个封装例程;

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

    一般现代CPU都有几种不同的指令级别,在高执行级别下,代码可以执行特权指令,访问任意物理地址,这种CPU执行级别就对应着内核态。Intel x86 cpu 有四种不同的执行级别0-3,Linux只使用了其中的0级和3级,分别来表示内核态(0级)和用户态(3级)。
    中断处理是从用户态进入内核态的主要方式。
    系统调用只是一种特殊的中断。

    实验过程

    使用c的c代码,可以返回当前的进程号

     #include <stdio.h>
         #include <unistd.h>
     int main(){
     pid_t pid;
     pid=getppid();
     printf("The process number is %d
    ",pid);
    return 0;
    }
    

    转为汇编代码的结果如下

    #include<stdio.h>
    #include<unistd.h>
    
    int main(){
    pid_t pid;
    asm volatile(
    "mov $0,%%ebx
    	"
    "mov $0x40,%%eax
    	"
    "int $0x80
    	"
    "mov %%eax,%0
    	"
    :"=m"(pid)
    );
    
    printf("the process number is %d
    ",pid);
    return 0;
    }
    

    执行结果如下:

  • 相关阅读:
    GitLab的基础使用-汉化配置
    GitLab的基础使用-数据备份与恢复
    Apache Hadoop集群扩容实战案例
    Hadoop 集群-完全分布式模式(Fully-Distributed Mode)
    HDFS参数调优总结
    网站压力测试 工具webbench
    2013年十大必知的大数据分析公司
    做电子商务网上开店应该读的书
    教你用大功率路由器覆盖3平方公里的WiFi广告
    中央推进城镇化建设 六行业分享25万亿蛋糕
  • 原文地址:https://www.cnblogs.com/besti-20199303/p/11708558.html
Copyright © 2011-2022 走看看