《Linux内核原理与分析》第五周作业
课本:第4章 系统调用的三层机制(上)
-用户态、内核态和中断
-用户态:在低的执行级别下,代码能够掌控的范围有所限制,只能访问部分内存。
-内核态:在高的执行级别下,代码可以执行特权指令,访问任意的物理内存。
-中断:从用户态进入内核态的主要方式。
-中断类别
- 硬件中断:在用户态进程执行时,硬件中断信号到来,进入内核态,就会执行这个中断对应的中断服务例程。
- 软中断:在用户态进程执行过程中,调用了一个系统调用(一种特殊中断),进入内核态。
- 寄存器上下文切换
当用户态切换到内核态时,就要把用户态寄存器上下文保存起来,同时把内核态的寄存器的值放到当前CPU中。int指令触发中断机制会在堆栈上保存一些寄存器的值,会保存用户态栈顶地址、当时的状态字、当时的CS:EIP的值。同时会将内核态的栈顶地址、内核态的状态字放入CPU对应的寄存器,并且CS:EIP寄存器的值会指向中断处理程序的入口,对于系统调用来说是指向system_call。int指令或中断信号发生之后,第一件事就是保存现场,进入中断处理程序,执行SAVE_ALL。中断处理程序结束后,中断处理结束前的最后一件事是恢复现场,执行RESTORE_ALL。 - API和系统调用关系
- API:应用程序编程接口,只是函数定义。
- 系统调用:是通过软中断向内核发出了中断请求,int指令的执行就会触发一个中断请求。
libc函数库定义的一些API内部使用了系统调用的封装例程,其主要目的是发布系统调用,使程序员在写代码时不需要用汇编指令和寄存器传递参数来触发系统调用。一个API可能只对应一个系统调用,亦可能内部由多个系统调用实现,一个系统调用也可能被多个API调用。
- Intel x86 CPU定义了4种不同的执行级别0、1、2、3,数字越小特权越高。Linux系统采用了其中的0、3两个特权级别。
实验:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
在实验楼环境中,我使用rename()系统调用来实现了将同目录下的文件更改文件名,C语言代码如下:
在Code文件夹中,我已经建立好一个名为“gzc.c”的文件,如图所示:
gcc执行上述C语言代码,成功改名,如图所示:
经查询,rename()的系统调用号为38:
38的16进制数为0x26。所以,编写汇编代码将其嵌入C语言代码,代码如下:
#include<stdio.h>int main()
{char *old_name = "gzc123.c";char *new_name = "gzc.c";int ret;asm volatile("movl %1,%%ebx\n\t""movl %2,%%ecx\n\t""movl $0x26,%%eax\n\t" //syscall num of rename in HEX is 0x26"int $0x80\n\t":"=a"(ret):"b"(old_name),"c"(new_name));if(ret<0)printf("error!\n");elseprintf("successful!\n");return 0;
}
因为刚才在执行纯C语言程序时已经将文件名改为"gzc123.c",这里的汇编代码嵌入C代码是将“gzc123.c”改为“gzc.c”,程序同样成功执行:
下面对嵌入的汇编代码进行分析:
"movl %1,%%ebx\n\t" //将old_name的值放入ebx
"movl %2,%%ecx\n\t" //将new_name的值放入ecx
"movl $0x26,%%eax\n\t" //syscall num of rename in HEX is 0x26
"int $0x80\n\t" //触发系统调用
:"=a"(ret) //将eax的值写入ret
:"b"(old_name),"c"(new_name) //分别代表上面的%1,%2
总结
本次实验总体来说没有遇到什么编码理解上的问题,仅仅遇到了一个小问题,就是在实验楼环境执行代码编译完成后的可执行程序时提示“权限不足”,解决方法为在执行程序时在前面加上sudo,程序正常运行,如下所示:
本次实验仅使用汇编代码实现了简单的系统调用功能,实验比较容易,但使我对于汇编代码的编写和其执行过程更加熟悉和了解。希望在后面的实验中,理解和编写汇编代码、理解linux内核系统的运行会更加得心应手。
转载于:https://www.cnblogs.com/intoxication/p/9942595.html
《Linux内核原理与分析》第五周作业相关推荐
- 2017-2018-2 20179209《网络攻防》第二周作业
网络攻防学习之绪论 国内外著名黑客 鲁本保罗 鲁本保罗今年才10岁,已经是一名CEO.他从6岁就开始从身为计算机安全专家的父亲那里学习技能,他的公司"慎思游戏"致力于开发网络智力游 ...
- 20189307《网络攻防》第二周作业
1.黑客信息 (1)国内知名黑客: 吴翰青:阿里云首席安全科学家.云盾负责人,也是网络安全领域为人熟知的"刺"."道哥"和"小黑".他要想黑 ...
- 20189311《网络攻防》第二周作业
1.脚本 (1)windows BAT 就是从以下命令中得到当前的ip地址. (2)Shell 可以计算距离下一次生日还有多少天. 2.黑客信息 (1)国内黑客 黄鑫,汉族,毕业于西安电子科技大学,职 ...
- 网络攻防第十一周作业
Burp Suite 官网 使用指南 功能模块有以下几个: - Web vulnerability scanner Web漏洞扫描程序Enterprise Professional 覆盖100多个通用 ...
- 《网络攻防第六周作业》
一.KaliSecurity视频总结(21-25) Kali密码攻击之密码攻击工具 cewl- UI界面,可以爬行网站获取关键信息创建密码字典. 给定url之后将结果返回成为一个字典 cat-很小的安 ...
- 20189320《网络攻防》第一周作业
a. 你对师生关系的理解,希望是哪种关系? 在学习方面,老师是我们在知识道路上的引导者.通过实际与我们自身兴趣的结合,老师向我们提出了研究方向,并通过提供各种参考书籍与资料帮助我们快速入门并对该方向进 ...
- 学号20189220 2018-2019-2 《密码与安全新技术专题》第五周作业
学号20189220 2018-2019-2 <密码与安全新技术专题>第五周作业 课程:<密码与安全新技术专题> 班级: 1892 姓名: 余超 学号:20189220 上课教 ...
- PHP第五周答案,算法设计与分析第五周作业——Word Ladder
算法设计与分析第五周作业--Word Ladder 上周找了一道深度搜索优先搜索的算法题来做,于是这周就选了一道广度优先搜索算法题来试试手. 本周所选题目:原题目链接 题目详情 题目大意:给出一个字符 ...
- Linux创建名为vgtest的分区,第五周作业,
第五周作业, 1.磁盘lvm管理,完成下面要求,并写出详细过程: 1)创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小 为16MB, 而后在卷组中创建大小为5G的逻辑卷t ...
- Python第五周作业
Python第五周作业 1. 一元二次方程求根 2. 百钱买百鸡 3. 鸡兔同笼 4. 最大公约数和最小公倍数 5. 判断三角形并计算面积 6. 判断IP地址合法性 7. 回文素数 8. 反素数 9. ...
最新文章
- linux shell之cut用法
- 存储过程知识总结【一】
- Python 竟能绘制如此酷炫的三维图
- PAT 乙级 1005. 继续(3n+1)猜想 (25) Java版
- ssl证书 所属项目怎么上传_Typora + 七牛云图床快速配置,告别手动上传图片!...
- LayaAir 文本 Text API 详解
- python文件的路径_python3 文件及文件夹路径相关
- 使用FastReport报表工具生成标签打印文档
- 产品思维30讲(梁宁)-- 整体
- H5音频播放功能的实现
- vue打包app网络错误和空白页问题
- pandas之dropna()的用法
- 中国全屋智能行业市场前瞻与投资战略规划分析报告
- Masterboxan INC智能化资产配置模式上线,全方位提升数字化金融服务
- STM32H743Nucleo ADC使用DMA配置无法读取数据的问题及解决
- 风格对照表的制作与使用
- css同时设置最大宽度和最小宽度
- 芯片失效分析常见的分析方法有哪些
- 《网管员必读——网络组建》(第2版)试读样章下载
- windows下oracle启动流程,笔者设置win7系统手动启动Oracle服务的还原步骤
热门文章
- docker 测试mysql_95--Docker案例(redis测试/mysql测试/tomcat测试)
- 生命周期 用户可以操作dom_当面试官问:能否介绍下Vue生命周期时,该如何回答...
- tableau度量值计算_Tableau可视化(雷达图):漫威英雄能力值
- dfmea文件_技术干货合集「失效分析、PFMEA DFMEA关系、文件结果化」
- php防伪溯源x系统_区块链溯源防伪追溯系统开发解决方案
- java foreach多线程_java关键字(一)
- python客户画像_Python数据分析学习笔记05:用户画像
- android 编译 bison,Ubuntu搭建android编译环境问题总结
- pytorch torch.unsqueeze
- docker update