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


    使用库函数API获取当前时间

    #include  <stdio.h>
    #include  <time.h>
    int main()
    {
     time_tt tt;
     struct tm *t;//输出时变成可读的
     tt = time(NULL);//time系统调用
     t=localtime(&tt);
     printf("time:%d:%d:%d:%d:%d:%d
    ",t->tm_year+1900,t->tm_mon,t->tm_mdata,t->tm_hour,t->tm_min,t->tm_sec);
     return 0;
    }
    

    系统调用概述

    1. 系统调用的意义:操作系统为用户进程与硬件设备之间进行交互提供一组接口------系统调用
    • 把用户从底层的硬件编程中解放出来
    • 极大的提高了系统的安全性
    • 使用户程序具有可移植性
    1. 应用编程接口API和系统调用是不同的 只是一个函数定义 通过软中断向内核发出一个明确的指令
    2. Libc库定义的一些API引用了封装例程

    系统调用的三层皮

    当用户态进程调用一个系统调用时,cPU切换带内核态开始执行内核函数
    系统调用号,系统调用参数,函数调用时

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

    1. 区分用户态和内核态
    • 一般现代CPU都有集中不同的指令执行级别
    • 高执行级别下:该级别指令下,可以执行特权指令
    • linux 0级用户态 3级内核态
    • cs寄存器的最低的两位表明了代码的级别
    • cs时代码段选择寄存器,eip是偏移量寄存器
    • 0xc0000000以上的空间只有在内核状态下访问,都可以访问0x00000000-0xbffffffff的地址空间

    中断处理时用户态进入内核态的主要方式。
    系统调用是一种特殊的中断

    寄存器上下文
    从用户态切换到内核态是必须保存用户态的寄存器上下文 中断/int指令会在堆栈上保存一些寄存器的值 如:用户态的栈顶地址、当时的状态子、当时的cs:eip的值

    保护现场 就是 进入中断程序 保存需要用到的寄存器的数据包
    恢复现场 就是 退出中断程序 恢复保存

    C语言代码中嵌入汇编代码

    • “asm” 表示后面的代码为内嵌汇编,“asm”是“asm”的别名。
    • “volatile” 表示编译器不要优化代码,后面的指令保留原样,“volatile”是它的别名。
      内嵌汇编语法如下:
      asm(
      汇编语句模板:
      输出部分:
      输入部分:
      破坏描述部分)
      一个简单的汇编模板:
    • 表示C语言里的“b=a;”的代码:
    int a=10,b;
    asm("movl %1, %%eax;
         movl %%eax, %0;"
        :"=r"(b)          /*输出部分*/
        :"r"(a)           /*输入部分*/
        :"%eax"           /*毁坏部分*/
       );
    

    里边r表示使用任意寄存器,%0、%1表示使用两个寄存器,一般只能%0~%9共十个操作数,按输入输出部变量出现顺序进行映射。
    寄存器用两个百分号,是因为使用了%0%1这些数字使百分号有了特殊意义,所以在操作数出现的寄存器必须用双百分表示。
    毁坏部里边的%eax表示eax寄存器在汇编代码块执行过程中会被改写,在执行前要保护好,这是提交给编译器决定的。

  • 相关阅读:
    hive同环比实现
    hive中的to_date和to_char
    正则表达式匹配一个独立的字符
    Mysql Explain用法详解
    hadoop安装踩坑
    hadoop ssh localhost无密码登录
    Node.js第十二篇:图片随机验证码
    Node.js第十一篇:Koa框架基础
    Ajax第五篇:JQuery中使用Ajax
    Ajax第四篇:跨域JSONP、CORS
  • 原文地址:https://www.cnblogs.com/banpingcu/p/11697014.html
Copyright © 2020-2023  润新知