2018-2019-1 20189210 《LInux内核原理与分析》第五周作业
一、系统调用实验
1、库函数将系统调用封装起来,大多数程序员使用库函数进行系统调用。
2、Linux操作系统的体系架构分为用户态和内核态。CPU的执行级别对应的就是内核态,所有指令都可以执行。用户态对应的就是低级别指令。
3、系统调用也是一种中断,中断处理是从用户态进入内核态的主要方式,系统调用是一种特殊的中断。
4、库函数就是操作系统提供的API(应用程序编程接口),API只是函数定义。系统调用是通过软中断向内核发出了中断请求,int指令的执行就会触发一个中断请求。libc函数库定义的一些API内部使用了系统调用的封装例程(用于发布系统调用),使程序员不需要汇编指令来触发系统调用。
5、大部分的系统调用的封装例程会返回一个整数,其值的含义依赖于对应的系统调用,返回值-1表示内核不能满足进程的请求,0表示能够满足。
6、系统调用的三层机制:xyz()(API)、system_call(所有系统调用的入口) 、 sys_xyz()(中断服务程序)。
7、系统调用是用户进入内核的接口,并非内核函数。用户程序通过某个系统调用进入内核后,会接着去执行这个系统调用对应的内核函数。这个内核函数 sys_xyz() 称为系统调用的服务例程。
8、系统调用号将 xyz() 与 sys_xyz() 关联起,系统调用号由 eax 寄存器传递。
本实验使用的是系统调用号为 38 的 sys_rename(),功能实现设计为将hello.c 文件重新命名 newhello.c




(1)库函数API实现:
系统调用rename,在内核中的系统调用处理函数为 sys_rename,其 函数原型:
asmlinkage long sys_rename(const char __user *oldname,const char __user *newname);
可以看出需要传递两个参数,一个是旧文件名,一个是新文件名。由于是指针类型,所以此时的文件名也代表该文件,也就是说,先找到叫 oldname 的文件,然后把其名改为 newname。rename() 是 glibc 对sys_rename 的封装,用户在用户态调用 rename(),将 oldname和newname 参数传入,系统会产生中断陷入内核态执行sys_rename。当重命名成功时,函数返回0。
(2)嵌入汇编代码实现:
asm volatile("movl %2,%%ecx\n\t" //newname存入ecx
"movl %1,%%ebx\n\t" //oldname存入ebx
"movl $0x26,%%eax\n\t" //系统调用号存入eax
"int $0x80" //执行系统调用
:"=a"(ret)
:"b"(oldname),"c"(newname)
);
把系统调用号38(16进制是0x26)存入 eax,将 oldname 存入 ebx,将 newname 存入 ecx,通过执行 int $0x80 来执行系统调用,使应用程序陷入内核态,system_call 根据传入的系统调用号在系统调用列表中查找对应的内核函数,根据 ebx 和 ecx 中保存的参数调用内核函数 sys_rename,执行完后将执行结果存放到 eax 中,最后返回 eax 中的值。
2、将“=a”换成 “=m“。


可以看出helko.c确实变成了newhello.c,但却显示没有修改成功,即ret不等于0.既然确实执行了sys_rename,返回值0就应该保存在eax中,返回采用的是“=m”,并没有将0保存进内存。

API方法实现系统调用实现非常便捷,只需知道函数原型即可,有很好的移植性。但是,如果 glibc 没有封装某个内核提供的系统调用时,就没办法通过此方法来调用内核函数。我可以利用 glibc 提供的syscall 函数直接调用。函数原型为long int syscall (long int sysno, ...)sysno 是系统调用号,在 sys/syscall.h 中有所有可能的系统调用号的宏定义。代码改为(SYS_rename换成38也正确):

小结:
本周学习了系统调用的原理和实验,如果用户态要涉及内核态的操作,就需要通过系统调用来实现。应用程序在用户态调用 API 函数,系统调用号和参数保存到 eax,ebx 等寄存器中,通过 0x80 中断向量触发中断陷入内核态,中断服务程序根据系统调用号调用并执行对应的内核函数,执行完毕后将结果存放的 eax 中并返回给程序,程序返回用户态。
2018-2019-1 20189210 《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语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- 源码来袭:bind手写实现
JavaScript中的this指向规则 源码来袭:call.apply手写实现与应用 理解建议:如果对this指向规则不了解的话,建议先了解this指向规则,最好还能对call和apply的使用和内 ...
- JN_0001:在微信朋友圈分享时长大于10s的视频
1,先在聊天窗口里发送视频. 2,长按视频点击”收藏“. 3,进入微信收藏管理页面,播放视频. 4,点击右上角三点按钮,选择“转存为笔记”. 5,于是在收藏页面中会生成一个新的收藏笔记链接,打开链接再 ...
- CSS 水平垂直居中的几种实现方法
前言 项目中经常碰到需要实现水平垂直居中的样式.下面就总结几种常用的方法 水平对齐+行高 [思路一]text-align + line-height实现单行文本水平垂直居中 <style> ...
- 如何清理Docker占用的磁盘空间?(转载)
本文转载自https://blog.fundebug.com/2018/01/10/how-to-clean-docker-disk/ , 感谢原作者. 摘要:用了Docker,好处挺多的,但是有一个 ...
- Redis学习之二 数据类型和相关命令
原文:https://www.cnblogs.com/lonelyxmas/p/9073928.html 如果还不懂安装的,请看 Windows环境下安装Redis Redis一共支持五种数据类型 1 ...
- day3-->深浅拷贝
import copy #浅拷贝 #copy.copy() #深拷贝 #copy.deepcopy() #赋值 #a = '123' #b = a a1 = 123123 a2 = 123123 #查 ...
- .NET垃圾回收机制(二)
一.GC的必要性 1.应用程序对资源操作,通常简单分为以下几个步骤:为对应的资源分配内存 → 初始化内存 → 使用资源 → 清理资源 → 释放内存. 2.应用程序对资源(内存使用)管理的方式,常见的一 ...
- Mockito框架入门教程(二)
接上一篇,继续学习其它的.... 8.找出冗余的互动(即未被验证到的) @Test(expected = NoInteractionsWanted.class) public void find_re ...
- 解决 Composer-Setup.exe 安装过程中的报错
问题 在 Windows 7 执行 Composer-Setup.exe 以安装 Composer 过程中 上图中点击[Next]时,出现如下报错信息 原因分析 由上述提示信息,可推测两方面原因: 1 ...
- Flask开发微电影网站(八)
1.后台管理之电影预告管理 1.1 定义电影预告表单 在app的admin目录的forms.py文件中,定义电影预告表单 # 预告表单 class PreviewForm(FlaskForm): ti ...