4_用户态与核心态-用两种C代码实现Linux的某个系统调用
来源:互联网 发布:怎样延长淘宝收货时间 编辑:程序博客网 时间:2024/06/05 06:49
版权声明:陈诚
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
==========================================================================
程序员编程不可能很健壮,会出bug,假如写的程序可以任意控制计算机的资源会很危险,所以产生了OS内核态和
用户态两个概念。我们这周的实验就是关于操作系统的用户态、内核态切换以及中断。
先谈几点理解:
1)OS采用系统调用实现用户态进程与I/O进行交互,用户态下调用系统资源须采用系统调用。
2)从用户态进入内核态有2种方式:系统调用(trap陷入)、中断。
3)状态切换时会保存寄存器上下文,如用户态堆栈顶地址、当时的状态字、当时的cs:eip值。
4)system_ call是linux中所有系统调用的入口点,系统调用的参数由eax传递。
实验过程:
下面分别用两种不同的c代码,实现0x20号系统调用getpid来获取当前内核名称。
1.直接调用库函数API
#include <stdio.h>#include <unistd.h>void main() { pid_t tt; tt = getpid(); printf("%u\n", tt); }
2.使用内嵌汇编的c代码
#include <stdio.h>#include <unistd.h>void main() { pid_t tt; asm volatile ( "movl $0x20, %%eax\n\t" "int $0x80\n\t" "movl %%eax, %0\n\t" :"=m"(tt) ); printf("%u\n", tt);}
分析:
API函数getpid()中将系统调用封装好,执行int 0x80语句后即进入内核态中的System_call()。
System_call()中会执行中断服务程序sys_getpid(),中断服务完成后如没有进程间调度,则执行iret返回用户
态继续执行,如有进程间调度,则执行进程间调度。
总结:
通过本周的学习,了解了系统调用与中断的关系,即系统调用的三层皮:xyz( API )、system_call( 中断
向量 )和sys_xyz( 服务程序 )。系统调用是一种特殊的中断,用eax放调用号码,ebx、ecx等放参数,eax放
返回值,int 0x80进入中断处理程序,此时进入内核态。
- 4_用户态与核心态-用两种C代码实现Linux的某个系统调用
- 用户态调用Xen超级调用与Linux内核系统调用
- Linux 系统调用的实现及其汇编代码的嵌入到C中
- linux内核学习(4)_库函数API和C代码嵌入汇运用用系统调用
- 【C#】登录系统时判断是否是合法用户的核心代码
- Linux用户进程与系统调用
- 核心态与用户态
- 核心态与用户态
- 深入理解linux下用户态与核心态切换
- 深入理解linux下用户态与核心态切换
- nc7下某个用户某个节点有多个模板,可以通过代码实现通过选择不同的业务流程来调用不同的模板吗?
- 5.4 系统调用_系统调用的实现
- 用户态、核心态详解及进程切换和系统调用原理
- linux系统调用实现代码分析
- linux系统调用实现代码分析
- linux系统调用实现代码分析
- linux C库函数与系统调用的区别
- linux C库函数与系统调用的区别
- leetcode笔记:House Robber III
- easyUI Layout
- android中handler的使用
- Python-MongoDB官方文档翻译
- GitExtension推送pull本地数据到远程仓库
- 4_用户态与核心态-用两种C代码实现Linux的某个系统调用
- 链接静态文件 + flask-moment的本地化时间和日期
- hdu 5247 找连续数(思维)
- Android Studio配置问题
- eclipse环境搭建之五:Scala
- UIView 实现渐变色 CAGradientLayer
- 【NOIP2012提高组】国王游戏
- 利用java实现简单租车系统(控制台程序版)
- Swift--UINavigationController