2019-2020-1 20199318《Linux内核原理与分析》第五周作业
第4章 系统调用的三层机制(上)
一、学习笔记
1. intel处理器一共有四种运行级别,linux使用了0,3两种运行级别,分别为内核态,用户态。
2. 内核态可以访问所有的内存,而用户态只可以访问0x00000000-0xbfffffff之间的内存。
3. 系统调用具有以下功能和特性:
把用户从底层的硬件编程中解放出来。操作系统为我们管理硬件,用户态进程不用直接与硬件设备打交道。
极大的提高系统的安全性。如果用户态进程直接与硬件设备打交道,会产生安全隐患,可能引起系统崩溃。
使用户程序具有可移植性。用户程序与具体的硬件已经耦合并用接口代替了,不会有紧密的关系,便于在不同系统间移植。
4. 系统调用的执行过程:
API->SYSTEM_CALL->SYS_XXX 其中system_call是运行在内核态的,是所有系统调用在内核的入口点,他在开始的时候保存用户态进程的执行上下文,结束后回复用户态进程的执行上下文,中间通过传入的系统调用号调用对应的中断服务程序。(中断:从用户态进入内核态) sys_xxx是对应的系统调用封装例程。
二、试验记录
1.使用库函数API触发一个系统调用
C语言代码如下:
运行结果如下:
2.C代码中嵌入汇编代码出发一个系统调用
源代码如下:
运行结果如下:
3.代码分析。
#include <stdio.h>
#include <unistd.h>
int main(void){
int u_id;
asm volatile(
"movl $0x14, %%eax\n\t" //将系统调用号赋给eax寄存器
"int $0x80\n\t" //执行系统调用
"movl %%eax, %0\n\t" //将系统调用执行后的返回值赋给变量tt
:"=m"(u_id)
);
printf("%u\n",u_id);
return 0;
}
总结
对系统调用机制的理解
- 系统调用是用户态进程访问硬件的一种方式,它通过中断(int 0x80)由用户态进入内核态。
- 当一个用户态程序进行系统调用的时候,CPU进入内核态并执行内核函数。
- 系统调用的过程:函数库提供的封装函数接口(API)->system_call(是所有系统调用的入口),这个入口会根据系统调用号(eax入栈),调用对应的系统调用例程
- 系统调用最多使用6个寄存器作为参数(除eax外)-ebx,ecx,edx,esi,edi,ebp,如果超过6个参数,寄存器中将会保存一个指向内核态可以操作的一块的内存,参数保存在内存上面。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探