2019-2020-1 20199301《Linux内核原理与分析》第五周作业
第四章·系统调用的三层机制(上)
本章的重点在于用户态程序如何触发系统调用?
一、用户、内核、中断
IntelX86有四种不同的执行级别。Linux操作系统中只采用了其中的0和3两个特权级别,分别对应内核态和用户态。
用户态和内核态显著的区分方法就是CS:EIP的指向范围,在内核态时CS:EIP的值可以是任意的地址。但在用户态只能访问0x00000000~0xbfffffff的地址空间。也就是0xc0000000以上的地址空间只能在内核态下访问。
系统调用也是一种中断(中断处理是从用户态进入内核态的主要方式)。
进入及内核态是有中断触发,可能是硬件中断,也可能是Trap。
int指令触发中断机制会保存用户态堆栈顶地址、当时的状态字、当时的CS:EIP的值。
中断发生后的第一件事是保存现场刚开始执行SAVE_ALL,中断处理结束前的最后一件事是恢复现场就会执行restore_all和iret。
二、系统调用概述
系统调用的意义是操作系统为用户态进程与硬件设备进行交互提供了一组接口。
一个API可能只对应一个系统调用,也可能内部由多个系统调用实现,一个系统调用也可能被多个API调用。
系统调用的三层机制分别为xyz(),system_call,sys_xyz()。
内核通过给每个系统调用一个编号来区分,即系统调用号,将API函数xyz()和系统调用内核函数sys_xyz()关联起来了。
EAX用于传递系统调用号。
传递参数时参数按顺序赋值给EBX、ECX、EDX、ESI、EDI、EBP。如果参数超过6个,就把某一个寄存器作为指针指向内存,这样可以通过内存来传递更多的参数。
应用程序系统调用(API)和系统调用不同的API知识函数定义。系统调用是通过软中断向内核发出中断请求。
三、实验
###使用库函数API触发rename系统调用
- 代码如下:
#include<stdio.h>
int main()
{
int ret;
char *oldname="hello.c";
char *newname="newhello.c";
ret = rename(oldname,newname);
if(ret == 0)
printf("Renamed successfully\n");
else
printf("Unable to rename the file\n");
return 0;
}
结果:
###嵌入式汇编代码触发rename系统调用
汇编语言代码:
#include<stdio.h>
int main()
{
int ret;
char *oldname="hello.c";
char *newname="newhello.c";
asm volatile(
"movl %2,%%ecx\n\t"
"movl %1,%%ebx\n\t"
"movl $0x26,%%eax\n\t"
"int $0x86\n\t"
"movl %%eax,%0"
:"=m"(ret)
:"b"(oldname),"c"(newname)
);
if(ret == 0)
printf("Renamed successfully\n");
else
printf("Unable to rename the file\n");
return 0;
}
成功改为newhello.c
2019-2020-1 20199301《Linux内核原理与分析》第五周作业的更多相关文章
- 2019-2020-1 20199329《Linux内核原理与分析》第九周作业
<Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业
2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...
- 2017-2018-1 20179215《Linux内核原理与分析》第二周作业
20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...
- 2019-2020-1 20209313《Linux内核原理与分析》第二周作业
2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 《Linux内核原理与分析》第一周作业 20189210
实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...
- 2018-2019-1 20189221《Linux内核原理与分析》第二周作业
读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- appium通过index查找目标控件
2.1 通过判断控件属性获取控件 控件的所有属性都可以用作判断,比如它的text,index,resource-id是否clickable等,例如: 2.1.1 通过文本查找目标控件 1 2 el = ...
- Postman 使用方法详细介绍
1,下载安装: https://www.getpostman.com/apps 2,打开Postman,如图所示: 3,创建一个接口项目 4,新增接口文件 5,下面以登录接口login为例,介绍如何做 ...
- linux U盘 硬盘 unable to mount
转自aaa小菜鸡 出现原因: 上次文件没拷完就拔了U盘 参考: 解决Ubuntu挂载U盘失败的解决方法 Linux下无法挂载U盘 解决: 1.sudo fdisk -l列出当前系统下的文件设备 2.s ...
- SQL——AS别名
一.SQL别名的基本用法 SQL可以为表或者列指定别名. 语法格式如下(表): SELECT 列名1,列名2... FROM 表名 AS 别名; 语法格式如下(列): SELECT 列名1 AS 别名 ...
- 基于卷积神经网络的面部表情识别(Pytorch实现)----台大李宏毅机器学习作业3(HW3)
一.项目说明 给定数据集train.csv,要求使用卷积神经网络CNN,根据每个样本的面部图片判断出其表情.在本项目中,表情共分7类,分别为:(0)生气,(1)厌恶,(2)恐惧,(3)高兴,(4)难过 ...
- 【LEETCODE】41、905. Sort Array By Parity
package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...
- Scratch编程:贪吃鱼(十一)
“ 上节课的内容全部掌握了吗?反复练习了没有,编程最好的学习方法就是练习.练习.再练习.一定要记得多动手.多动脑筋哦~~” 01 — 游戏介绍 这是一个小游戏,通过键盘的方向键控制着大鲨鱼追着吃掉海星 ...
- idea 代码热启动配置方法
Restart Server:代码已更新重启tomcat服务器
- quartz2.3.0(三)cron定义调度周期
cron总结 cron详解参见:<quartz CronExpression表达式> CronTrigger配置完整格式为7个: [秒] [分] [小时] [日] [月] ...
- 玩转Spring全家桶笔记 03 Spring的JDBC操作以及SQL批处理的实现
1 spring-jdbc core JdbcTemplate 等相关核心接口和类(核心) datesource 数据源相关的辅助类(内嵌数据源的初始化) object 将基本的JDBC操作封装成对象 ...