1.问题描述

在前面的文章中,已经了解了Linux内核源代码的目录结构,并在Oracle VM VirtualBox的Linux环境中构造一个简单的操作系统MenuOS,本文将学习系统调用的相关理论知识,使用库函数API和C代码中嵌入汇编代码两种方式使用getpid()系统调用。

2.解决过程

2.1 系统调用



上图所示,Linux操作系统的体系架构在宏观上分为用户态和内核态。

用户态:在用户态下,代码能够掌握的范围会受到一定限制。

内核态:在内核态下,代码可以执行特权指令,访问任意的物理内存。

系统调用:由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API),是应用程序同系统之间的接口。系统调用也是一种中断,中断处理是从用户态进入内核态的主要方式。

系统调用3层机制:

第一步,系统调用的库函数就是读者使用的操作系统提供的API,调用软中断向内核发出中断请求;

第二步,CPU切换到内核态并开始执行一个system_call和系统调用内核函数,具体通过int $0x80触发系统调用的执行;

第三步,进入内核,通过系统调用号将API函数和系统调用内核函数关联起来进行调用。

参数传递:系统调用中,用户态切换到内核态,两种执行模式使用不同堆栈,参数传递通过特殊寄存器来进行。在x86-32中,EAX用于传递系统调用号,其余参数按顺序赋值给EBX,ECX,EDX,ESI,EDI和EBP,参数个数一般不超过6个。如果超过6个就把一个寄存器作为指针指向内存用于存储参数。

下面小节将通过直接调用库函数和使用汇编语言进行系统调用。

2.2 使用库函数API进行系统调用

根据/usr/include/asm/unistd_32.h,选取调用号为20的库函数getpid(),输入以下代码:

#include<unistd.h>
#include<stdio.h>
int main()
{
int pid;
pid=getpid();
printf("pid=%d\n",pid); return 0;
}

gcc编译后,显示获取的pid如下图所示:

2.3 C代码中嵌入汇编代码进行系统调用

通过objdump -d反汇编查询编译过程,运行以下代码:

#include<unistd.h>
#include<stdio.h>
int main()
{
int pid;
__asm__ __volatile__(
"mov $0,%%ebx\n\t"
"mov $0x14,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax, %0\n\t"
:"=m" (pid)
);
pid=getpid();
printf("pid=%d\n",pid); return 0;
}

显示结果如下:



分析__asm__ __volatile__函数中汇编语言的参数传递方式,首先将EBX置空,然后将系统调用号20传入EAX寄存器,在16进制中,0x14表示十进制的2,然后运行int $0x80指令,产生中断向量为128的编译异常,进入内核后开始执行中断向量128对应的中断服务程序system_call,根据EAX寄存器存储的系统调用号调用getpid(),将返回值传回用户态参数pid。

3.总结

本文主要学习系统调用的相关理论知识,了解了系统调用主要是执行用户态到内核态API的调用。其中有关系统调用引起的中断处理在操作系统的课程学习中有所涉略,本次更加深入了解了系统调用的3层机制,教材中使用库函数API和C代码中嵌入汇编代码两种方式分别对time()和rename()函数进行系统调用,本文根据系统调用号对应表选择getpid()来模拟两种方式的调用,也是在之前学习汇编和反汇编的方法后的一次实践编程,更好地掌握系统调用的精髓知识。

2019-2020-1 20199310《Linux内核原理与分析》第五周作业的更多相关文章

  1. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

  2. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  3. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  4. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  5. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  6. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  7. 2019-2020-1 20209313《Linux内核原理与分析》第二周作业

    2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  10. 2018-2019-1 20189221《Linux内核原理与分析》第二周作业

    读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...

随机推荐

  1. WiX 自定义

    WiX 允许用户做一些自定义操作 用户界面向导 对于安装界面,用户可以用自己的位图.图标和许可证文本替换默认的.它们的路径存储在变量中,您可以在命令行或直接在源代码中指定这些变量: <WixVa ...

  2. C++ 按址操作

    一.指针 二.变量与指针 注意区别char 和char *. !!!!!!! 二.函数与指针 #include<iostream> #include<string> using ...

  3. twoway 系列命令绘制地图

    twoway 系列命令绘制地图 ❝ 在谈到用stata绘制地图时,很多人首先想到的是spmap命令.其实,最常见的twoway系列命令就可以完成我们的大多数绘图需求. 对于spmap命令的使用,在线资 ...

  4. Python第十三章-网络编程

    网络编程 一.网络编程基础 python 的网络编程模块主要支持两种Internet协议: TCP 和 UDP. 1.1通信协议 通信协议也叫网络传输协议或简称为传送协议(Communications ...

  5. Java多线程工具类之循环栅栏计数器

    Java多线程下循环计数器 本文主要内容:CyclicBarrier(下文中凯哥就用cycBar来代替)定义介绍:举例说明:代码演示:从源码来看原理及总结:CyclicBarrier与CountDow ...

  6. 28. 实现 strStr()

    d地址:https://leetcode-cn.com/problems/implement-strstr/ <?php /** 实现 strStr() 函数. 给定一个 haystack 字符 ...

  7. MyBatis 学习笔记(1)

    MyBatis 的基本构成 SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成 SqlSessionFactory(工厂接口) SqlSessionFactor ...

  8. 【高并发】什么是ForkJoin?看这一篇就够了!

    写在前面 在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻辑执行完成后,再将各个结果进行汇总,得出最终的结果数据.有点像Hadoop中的MapRe ...

  9. Zabbix报警机制,Zabbix进阶操作,监控案例

                                                                                                        ...

  10. Hadoop(十一):组合任务概述和格式

    组合任务概述 一些复杂的任务很难由一个MR处理完成,所以一般需要将其拆分成为多个简单的MR子任务来执行. MapReduce框架中对于这类的问题提供了几种方式进行任务执行流程的控制,主要包括以下几种方 ...