IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 2021-2022-1 20212804《Linux内核原理与分析》第五周作业 -> 正文阅读

[系统运维]2021-2022-1 20212804《Linux内核原理与分析》第五周作业

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

一、知识积累

1、
内核态:高执行级别下,代码可以执行特权指令,访问任意物理地址,CPU执行级别就对应内核态。
用户态:低级别指令,只能在对应级别允许的范围内活动。
中断处理是从用户态进入内核态主要的方式
2、寄存器上下文

  • 从用户态切换到内核态时,必须保存用户态的寄存器上下文。
  • 中断/int指令会在堆栈上保存一些寄存器的值,如:用户态栈顶地址、当时的状态字、当时的CS:eip的值。
    3、应用编程接口API和系统调用是不同的
    API只是一个函数定义。
    系统调用通过软中断向内核发出明确请求。
    4、系统调用的三层皮
    API XYZ,中断向量system_call,中断服务程序sys_xyz

在这里插入图片描述

二、实验楼实验

使用库函数 API 和 C 代码中嵌入汇编代码两种方式使用同一个系统调用

1、查看系统调用号信息
在这里插入图片描述

在这里插入图片描述
选择getuid进行此次实验,其系统调用号为102,即0x66。
2、通过man getuid查看getuid系统调用相关信息,可以看到其功能是返回当前调用进程的用户ID:
在这里插入图片描述
3、库函数API的方式进行系统调用
编写getuid.c文件,通过getuid()方法获取用户ID:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
    int usrid;
    usrid=getuid();
    printf("The user id is %d\n",usrid);
    return 0;
}

在这里插入图片描述
编译执行
在这里插入图片描述
4、C 代码中嵌入汇编代码方式进行系统调用
修改getuid.c,嵌入汇编代码,将系统调用号0x66赋给eax寄存器,系统调用后将返回值赋给变量usrid

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
    int usrid;
    asm volatile(
        "mov $0,%%ebx\n\t"
        "mov $0x66,%%eax\n\t"
        "int $0x80\n\t"
        "mov %%eax,%0\n\t"
        :"=m"(usrid)
    );
    printf("The user id is %d\n",usrid);
    return 0;
}

在这里插入图片描述
编译执行
在这里插入图片描述
这里出错了,查询资料后发现,linux系统中64位汇编和32位汇编的系统调用主要有以下不同:
(1)系统调用号不同.linux系统调用号实际上定义在/usr/include/asm/unistd_32.h和/usr/include/asm/unistd_64.h中。
(2)系统调用所使用的寄存器不同,x86_64中使用与eax对应的rax传递系统调用号,但是 x86_64中分别使用rdi/rsi/rdx传递前三个参数,而不是x86中的ebx/ecx/edx。
(3)系统调用使用“syscall”而不是“int 80”。
修改成32位汇编系统下的调用

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
    int usrid;
    asm volatile(
        "mov $0,%%ebx\n\t"
        "mov $0x18,%%eax\n\t" #getuid在32位系统下系统调用号为24,即0x18
        "int $0x80\n\t"
        "mov %%eax,%0\n\t"
        :"=m"(usrid)
    );
    printf("The user id is %d\n",usrid);
    return 0;
}

在这里插入图片描述

三、总结

本节主要学习了系统调用机制,通过分别使用库函数 API 和 C 代码中嵌入汇编代码两种方式使用同一个系统调用,来进行练习。
系统调用流程:第一步,代码调用系统调用( xyz ),该函数是一个包装系统调用的库函数;库函数 ( xyz )负责准备向内核传递的参数,并触发软中断,切换到内核;CPU被软中断打断后,执行中断处理函数 ,即系统调用处理函数 ( system_call);系统调用处理函数调用系统调用服务例程 (sys_xyz ),真正开始处理该系统调用。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 12:18:43  更:2021-10-19 12:20:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 19:54:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码