系统调用的三层机制

API:第一层是指Libc中定义的API,这些API封装了系统调用,使用int 0x80触发一个系统调用中断;当然,并非所有的API都使用了系统调用,如完成数学加减运算的API就没有使用系统调用;也有可能某个API使用了多个系统调用;这一层存在的价值就是为应用程序员提供易于使用的API来调用系统调用;

system_call:运行于内核态。system_call是所有系统调用在内核的入口点,在其中的开始处保护用户态程序执行上下文,结束处恢复用户态程序执行上下文,在中间根据传入的系统调用号对应的中断服务程序;

sys_xyz 系统调用封装例程:执行具体的系统调用操作,完成用户的系统调用请求;每个系统调用都对应一个封装例程;

用户态、内核态和中断处理过程

一般现代CPU都有几种不同的指令级别,在高执行级别下,代码可以执行特权指令,访问任意物理地址,这种CPU执行级别就对应着内核态。Intel x86 cpu 有四种不同的执行级别0-3,Linux只使用了其中的0级和3级,分别来表示内核态(0级)和用户态(3级)。

中断处理是从用户态进入内核态的主要方式。

系统调用只是一种特殊的中断。

实验过程

使用c的c代码,可以返回当前的进程号

 #include <stdio.h>
#include <unistd.h>
int main(){
pid_t pid;
pid=getppid();
printf("The process number is %d\n",pid);
return 0;
}

转为汇编代码的结果如下

#include<stdio.h>
#include<unistd.h> int main(){
pid_t pid;
asm volatile(
"mov $0,%%ebx\n\t"
"mov $0x40,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(pid)
); printf("the process number is %d\n",pid);
return 0;
}

执行结果如下:

最新文章

  1. iOS开发系列--Objective-C之类和对象
  2. poj 2104 K-th Number (划分树入门 或者 主席树入门)
  3. 如何在 ASP.NET MVC 中集成 AngularJS(1)
  4. ComboBoxEdit设置选项值(单选 多选)
  5. [转载] leveldb日知录
  6. 在MyEclipse上搭建web服务器
  7. Android 高级UI设计笔记16:ViewStub的应用
  8. 通过Java SE 7自带的监控服务(WatchService API)实现类似.NET FileWatcher的功能
  9. C# 委托与事件详解(二)
  10. java实现单链接的几种常用操作
  11. Hadoop下WordCount程序
  12. mysql批量查询
  13. js立即执行函数用法
  14. Elasticsearch深入搜索之全文搜索及JavaAPI使用
  15. Redis 数据结构的实现
  16. ABAP-面向对象的开发
  17. [Andrew Stankevich&#39;s Contest#21] Lempel-Ziv Compression
  18. springmvc freemarker 全局变量的三种配置方式
  19. 树莓派开启wlan功能
  20. classpath: spring 中的查找方式

热门文章

  1. 【宇哥带你玩转MySQL】索引篇(一)索引揭秘,看他是如何让你的查询性能指数提升的
  2. MATLAB——文件读写(2)
  3. Android ConstraintLayout 构建自适应界面
  4. 《Three.js 入门指南》3.1.1 - 基本几何形状 -圆环结(TorusKnotGeometry)
  5. 浅谈C++三种传参方式
  6. MyBatis(二):基础CRUD
  7. 使用mpvue开发小程序如何定义全局变量
  8. 学习《深入应用c++11》2
  9. template_homepage
  10. AJ学IOS(27)UI之iOSUIKit字符属性NSAttributedString概述