实验四:使用库函数 API 和 C 代码中嵌入汇编代码两种方式使用同一个系统调用
一、实验要求
1.选择一个系统调用(13 号系统调用 time 除外),系统调用列表参见 torvalds/linux。
2.参考视频中的方式使用库函数 API 和 C 代码中嵌入汇编代码两种方式使用同一个系统调用。
二、实验过程
1.基础知识
Linux整体架构图如下
1)系统调用:组成了用户态跟内核态交互的基本接口。
2)库函数:它对系统调用进行封装,提供简单的基本接口给用户,增强了程序的灵活性。
3)Shell:命令行。方便用户和系统交互,呈现给用户交互窗口。
4)用户态:处于低的执行级别,代码能够掌控的范围会受到限制,不能使用特权指令。
5)内核态:处于高的执行级别,可以访问任意的物理内存,可以执行特权指令。
2.实验过程
打开实验楼的shell环境
编译并运行
编写如下汇编C代码
编译+运行
3.实验原理
三、实验总结
系统调用是用户态进程访问硬件的一种方式,它通过中断(int 0x80)由用户态进入内核态。当一个用户态程序进行系统调用的时候,CPU进入内核态并执行内核函数。
系统调用的过程为:函数库提供的封装函数接口(API)->system_call(是所有系统调用的入口),这个入口会根据系统调用号(eax入栈),调用对应的系统调用例程。系统调用最多使用6个寄存器(ebx,ecx,edx,esi,edi,ebp)作为参数,如果超过6个参数,寄存器中将会保存一个指向内核态可以操作的一块的内存,参数保存在内存上面。本次实验,我学习了Linux系统调用的使用方法,对于系统调用过程有了更深刻的了解。