由一段代码解析系统调用的原理

朱宇轲 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

  在本次的实验中,我们将通过用C和汇编实现的同样一段代码来解析系统调用的过程。

废话少说,开始实验!

C语言程序如下所示:

/*test.c*/#include<sys/types.h>
#include<sys/stat.h>
int main()
{
	int status;
	int type=S_IRWXG;
	char string[]="./newdir";
	status=mkdir(string,type);
	return 0;
}

  汇编语言程序如下所示:

/*test2.c*/#include<sys/types.h>
#include<sys/stat.h>
int main()
{
	int status;
	int type=S_IRWXG;
	char string[]="./newdir2";
	asm volatile(
		"mov $0x27,%%eax\n\t"
		"int $0x80\n\t"
		"mov %%eax,%0\n\t"
		:"=m"(status)
		:"b"(string),"c"(type)
	);
	return 0;
}

  我们本次使用的API是mkdir函数,它是Linux下的创建目录函数。它的函数原型是:

int mkdir(const char *path, mode_t mode);

参数:

path是目录名

mode是目录权限

返回值:

返回0 表示成功, 返回 -1表示错误,并且会设置errno值。

执行C程序后的运行结果是:

  可以看见编译执行text.c后,home中多出了newdir目录。

  执行汇编程序后的结果是:

  可以看见编译执行text2.c后,home中多出了newdir2目录。

接下来分析汇编程序。

	asm volatile(
		"mov $0x27,%%eax\n\t"
		"int $0x80\n\t"
		"mov %%eax,%0\n\t"
		:"=m"(status)
		:"b"(string),"c"(type)
	);

  首先,将存储着目录名与权限的变量string和type存入ebx与ecx中,当做mkdir的参数传入(代码第六行)。

之后,将要调用的系统调用号0x27(十进制的话就是39,对应mkdir函数)传入eax中,然后通过int命令触发中断,进入中断处理程序。带中断处理结束后,再讲eax的内容返回至status变量,这样mkdir就算是调用完成了。

  系统调用的执行过程实际上就是像老师课上讲的那样,分为API->中断处理程序->系统调用三个层次。注意系统调用和API并不是一一对应的,有可能一个API对应多个系统调用,也有可能一个系统调用对应多个API。我个人理解,API实际上可以算是对系统调用的封装。具体的执行过程,如下所示。

  

  本次就分析到这里,谢谢大家。

时间: 2024-07-30 04:10:52

由一段代码解析系统调用的原理的相关文章

用Alamofire进行网络请求的一段代码解析(二)

/* Router路由器,这个枚举类型采用了URLRequestConvertible协议.采用这个协议的类型,是用来构造URL请求的.这个协议只有一个只读属性URLRequest,它是NSURLRequest类型的. */ enum Router: URLRequestConvertible { static let baseURLString = "https://api.500px.com/v2" static let consumerKey = "4qf9GGuzHw

用Alamofire进行网络请求的一段代码解析

/* 向服务器发送请求: request实际上有四个参数,但是后两个参数都设定为了默认值,所以在调用的时候只要初始化前两个参数就可以. 第一个参数是设定向服务器发起的请求的方法,通常为GET方法和POST方法. 第二个参数就是URL地址. 第三个参数是填写一些必要的信息,比如说使用密钥. 该方法返回一个Alamofire.Request对象 responseJSON方法有一个必包作为参数.这个必包有四个参数,没有返回值.但是responseJSON有一个Alamofire.request的返回值

【原创】大数据基础之Spark(4)RDD原理及代码解析

一 简介 spark核心是RDD,官方文档地址:https://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds官方描述如下:重点是可容错,可并行处理 Spark revolves around the concept of a resilient distributed dataset (RDD), which is a fault-tolerant colle

一段BGR2Y的SIMD代码解析。

一个同事在github上淘到一个基于SIMD的RGB转Y(彩色转灰度或者转明度)的代码,我抽了点时间看了下,顺便学习了一些SIMD指令,这里把学习过程中的一些理解和认识共享给大家. github上相关代码见链接:https://github.com/komrad36/RGB2Y,这哥们还有其他一些SIMD的代码,也是相当不错的可以借鉴的. 我们首先说说普通的RGB2Y的代码: void RGB2Y(unsigned char *Src, unsigned char *Dest, int Widt

[nRF51822] 10、基础实验代码解析大全 &#183; 实验15 - RTC

一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻转状态, 即指示灯D1 以8Hz 的速率翻转状态 COMPARE0 中断中点亮指示灯D2 二.nRF51822的内部RTC结构: NRF51822 有两个RTC 时钟:RTC0,RTC1.两个RTC 均为24 位,使用LFCLK 低频时钟,并带有12 位分频器,可产生TICK.compare 和溢出

解析 iOS 动画原理与实现

这篇文章不会教大家如何实现一个具体的动画效果,我会从动画的本质出发,来说说 iOS 动画的原理与实现方式. 什么是动画 动画,顾名思义,就是能“动”的画.人的眼睛对图像有短暂的记忆效应,所以当眼睛看到多张图片连续快速的切换时,就会被认为是一段连续播放的动画了. 比如,中国古代的“走马灯”,就是用的这个原理.有些人还会在一个本子每页上手绘一些漫画,当快速翻页的时候,也会看到动画的效果,比如: 图片来自网络 计算机动画的实现方式 动画是由一张张图片组成的,在计算机中,我们称每一张图片为 一帧画面 .

操作系统原理(一)——系统调用的原理及实现

系统调用:原理及实现 1. 什么是系统调用 在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向操作系统内核请求需要更高权限运行的服务.系统调用提供了用户程序与操作系统之间的接口(即系统调用是用户程序和内核交互的接口). 操作系统中的状态分为管态(核心态)和目态(用户态).大多数系统交互式操作需求在内核态执行.如设备IO操作或者进程间通信.特权指令:一类只能在核心态下运行而不能在用户态下运行的特殊指令.不同的操作系统特权指令会有所差异,但是一般来说主要

[nRF51822] 12、基础实验代码解析大全 &#183; 实验19 - PWM

一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指在一个周期内,信号处于高电平的时间占整个信号周期的百分比,方波的占空比是50%. 2) 调制频率:周期的倒数. 3) 脉冲宽度:信号处于高电平的时间. 二.nRF51822的PWM产生: NRF51822 通过Timer.PPI 和GPIOTE 的配合实现PWM 的功能,由Timer 产生一个事件,

java集合框架之java HashMap代码解析

 java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/article/java-hashmap-java-collection.html 签名(signature) public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Se