4_用户态与核心态-用两种C代码实现Linux的某个系统调用
2016-03-14 20:29
369 查看
版权声明:陈诚
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
==========================================================================
程序员编程不可能很健壮,会出bug,假如写的程序可以任意控制计算机的资源会很危险,所以产生了OS内核态和
用户态两个概念。我们[b]这周的实验就是关于操作系统的用户态、内核态切换以及中断。[/b]
先谈几点理解:
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进入中断处理程序,此时进入内核态。
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- 神器SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程