2019-2020-1 20199303《Linux内核原理与分析》第五周作业
2024-08-27 11:36:12
系统调用的三层机制
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;
}
执行结果如下:
最新文章
- iOS开发系列--Objective-C之类和对象
- poj 2104 K-th Number (划分树入门 或者 主席树入门)
- 如何在 ASP.NET MVC 中集成 AngularJS(1)
- ComboBoxEdit设置选项值(单选 多选)
- [转载] leveldb日知录
- 在MyEclipse上搭建web服务器
- Android 高级UI设计笔记16:ViewStub的应用
- 通过Java SE 7自带的监控服务(WatchService API)实现类似.NET FileWatcher的功能
- C# 委托与事件详解(二)
- java实现单链接的几种常用操作
- Hadoop下WordCount程序
- mysql批量查询
- js立即执行函数用法
- Elasticsearch深入搜索之全文搜索及JavaAPI使用
- Redis 数据结构的实现
- ABAP-面向对象的开发
- [Andrew Stankevich&#39;s Contest#21] Lempel-Ziv Compression
- springmvc freemarker 全局变量的三种配置方式
- 树莓派开启wlan功能
- classpath: spring 中的查找方式
热门文章
- 【宇哥带你玩转MySQL】索引篇(一)索引揭秘,看他是如何让你的查询性能指数提升的
- MATLAB——文件读写(2)
- Android ConstraintLayout 构建自适应界面
- 《Three.js 入门指南》3.1.1 - 基本几何形状 -圆环结(TorusKnotGeometry)
- 浅谈C++三种传参方式
- MyBatis(二):基础CRUD
- 使用mpvue开发小程序如何定义全局变量
- 学习《深入应用c++11》2
- template_homepage
- AJ学IOS(27)UI之iOSUIKit字符属性NSAttributedString概述