2021-2022-1 20212822《Linux内核原理与分析》第五周作业

2021-2022-1 20212822《Linux内核原理与分析》第五周作业

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

  • 实验要求

    • 选择一个系统调用(13 号系统调用 time 除外),系统调用列表参见 torvalds/linux
    • 参考视频中的方式使用库函数 API 和 C 代码中嵌入汇编代码两种方式使用同一个系统调用
  • 实验基础知识

    • 用户态、内核态和中断
      • 宏观上Linux操作系统的体系架构分为用户态内核态

      • 用户态:处于低的执行级别,代码能够掌控的范围会受到限制,不能使用特权指令

      • 内核态:处于高的执行级别,可以访问任意的物理内存,可以执行特权指令

      • 在这里插入图片描述

      • 中断:指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行

      • 在这里插入图片描述

  • 实验过程

    • rename系统调用的API的使用
      • 首先打开实验楼平台,创建一个myrename.c文件,键入如下代码:
#include<stdio.h>
int main(){
	int ret;
	char *oldname = "myrename.c";
	char *newname = "20212822_myrename.c"
	ret = rename(oldname, newname);
	if(!ret)
		printf("Renamed successfully!\n");
	else
		printf("Unable to rename the file!\n");
	return 0;
}
  • 接着用gcc编译该代码运行尝试,结果如下图所示:
    • 在这里插入图片描述
    • 以上使用API使用了rename系统调用
    • rename系统调用的C代码内嵌汇编使用
      • 重新打开一个实验楼环境,创建myrename_volatile.c文件,键入如下代码:
#include<stdio.h>
int main(){
	int ret;
	char *oldname = "myrename.c";
	char *newname = "20212822_myrename.c";
	asm volatile(
		"movl %2,%%ecx\n\t"
		"movl %1,%%ebx\n\t"
		"movl $0x26,%%eax\n\t"
		"int $0x80\n\t"
		"movl %%eax,%0"
		:"=m"(ret)
		:"b"(oldname),"c"(newname)
	);
	if(!ret)
		printf("Renamed successfully!\n");
	else
		printf("Unable to rename the file!\n");
	return 0;
}
  • 接着用gcc编译该代码运行尝试,结果如下图所示:
    • 在这里插入图片描述

    • 以上使用的C代码内嵌汇编方式

  • 对实验过程的理解

    • 本次实验较为容易,过程中没有发生代码无法编译运行的情况。下面谈一谈对rename系统调用过程的理解:
    • 有两个参数oldname和newname,oldname是第一个传给EBX寄存器的参数,newname是第二个传给ECX寄存器的参数,因为参数是字符串,所以实际传递的是指针变量。把系统调用号38(16进制是0x26)存入EAX寄存器,将oldname存入EBX寄存器,将newname存入ECX寄存器,通过执行int $0x80来执行系统调用陷入内核态。system_call根据传入的系统调用号在系统调用列表中查找到对应的系统调用内核函数,然后根据EBX寄存器和ECX寄存器中保存的参数调用用内核函数sys_rename,执行完成后将执行结果存放到EAX寄存器中,将EAX寄存器的值传给ret。以上为rename系统调用在C语言中内嵌汇编代码的过程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值