“平安的祝福 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”

一、基本概念

1.1API和系统调用区别:

API只是一个函数定义;系统调用通过软中断向内核发出一个明确的请求。

Libc库定义的一些API引用了封装例程(wrapper routine,唯一目的就是发布系统调用):一般每个系统调用对应一个封装例程;库再用这些封装例程定义出给用户的API

1.2大部分封装例程返回一个整数,其值的含义依赖于相应的系统调用。

所有的系统调用都返回一个整数值。这些返回值与封装例程返回值的约定是不同的。在内核中,正数或0表示系统调用成功结束,而负数表示一个出错条件。在后一种情况下,这个值就是存放在errno变量中必须返回给应用程序的负出错码。内核没有设置或使用errno变量,而封装例程从系统调用返回之后设置这个变量。

Libc标准库中的封装例程定义的errno变量包含特定的出错码;

1.3应用程序、封装例程、系统调用处理程序及系统调用服务例程之间的关系

1.4当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。

在Linux中是通过执行int $0x80来执行系统调用的,这条汇编指令产生向量为128的编程异常

1.5传参:

内核实现了很多不同的系统调用,进程必须指明需要哪个系统调用,这需要传递一个名为系统调用号的参数,使用eax寄存器

1.6系统调用也需要输入输出参数,例如

实际的值,用户态进程地址空间的变量的地址,甚至是包含指向用户态函数的指针的数据结构的地址

1.7system_call是linux中所有系统调用的入口点,每个系统调用至少有一个参数,即由eax传递的系统调用号

步骤:1.一个应用程序调用fork()封装例程,那么在执行int $0x80之前就把eax寄存器的值置为2(即__NR_fork)。这个寄存器的设置是libc库中的封装例程进行的,因此用户一般不关心系统调用号。

2.进入sys_call之后,立即将eax的值压入内核堆栈。

二、具体例子

2.1系统调用函数getpid编写的程序:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
    printf("The current process ID is %d\n",getpid());
    return 0;
}

2.2使用嵌入式汇编实现的getpid程序:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
    int t;
    asm volatile(
                "mov $0,%%ebx\n\t"
                "mov $0x14,%%eax\n\t"  //其中getpid的系统调用数是20
                "int $0x80\n\t"
                "mov %%eax,%0"
                :"=m"(t)
                );
    printf("The current process ID is %d\n",t);
    return 0;
}

2.3分析汇编代码系统调用工作过程:

首先将ebx寄存器清空,将getpid的系统调用号传入寄存器eax,然后调用系统软中断。系统中断处理完成后,eax寄存器存储的是系统调用getpid的返回值,将eax寄存器的值赋值给用户空间的参数。

2.4程序的输出结果一样:

三、总结:

通过这次实验,大致了解用户程序如何执行系统调用的。流程:用户程序调用API——》封装例程——》系统调用处理程序——》系统调用服务例程。

API和系统调用实现同一方法的更多相关文章

  1. Web APi之控制器选择Action方法过程(九)

    前言 前面我们叙述了关于控制器创建的详细过程,在前面完成了对控制器的激活之后,就是根据控制器信息来查找匹配的Action方法,这就是本节要讲的内容.当请求过来时首先经过宿主处理管道然后进入Web AP ...

  2. 学习ASP.NET Web API框架揭秘之“HTTP方法重写”

    最近在看老A的<ASP.NET Web API 框架揭秘>,这本书对于本人现阶段来说还是比较合适的(对于调用已经较为熟悉,用其开发过项目,但未深入理解过很多内容为何可以这样“调用”).看到 ...

  3. 优秀的API接口设计原则及方法(转)

    一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的.如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的 ...

  4. Akismet API 密钥(key)免费获取方法

    Akismet插件是用户使用最广泛的垃圾评论插件,也是wordpress的创始人制作的,同时它也毫无疑问的成为wordpress的默认安装插件,这样的插件可以帮助用户解决垃圾评论的烦恼,而且也不用访客 ...

  5. SpringMVC(八):使用Servlet原生API作为Spring MVC hanlder方法的参数

    在SpringMVC开发中,是有场景需要在Handler方法中直接使用ServletAPI. 在Spring MVC Handler的方法中都支持哪些Servlet API作为参数呢? --Respo ...

  6. jquery+asp.net 调用百度geocoder手机浏览器定位--Api介绍及Html定位方法

    原文来自:***/projecteactual/jqueryaspnetbaidugeocodermobilebrowserposition.html 在做一个社区项目中,支持移动浏览器进行选择地区和 ...

  7. API接口安全加强设计方法

    前面两篇相关文章: <Web Api 内部数据思考 和 利用http缓存优化 Api> <Web Api 端点设计 与 Oauth> 1.开放的接口 这样的接口我们天天都在接触 ...

  8. 解决Gradle报错找不到org.gradle.api.internal.project.ProjectInternal.getPluginManager()方法问题

    因为本地的AndroidStudio很久没用了,所以想要研究下github上的某个代码的时候,还得重新配下环境 打开了几个项目,都是提示如下错误 Error:Unable to find method ...

  9. bootstrap Table API和一些简单使用方法

    官网: http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/ 后端分页问题:后端返回”rows”.“”total,这样才能重新赋值 ...

随机推荐

  1. ionic 接触的第一个Hybrid项目

    最近需要维护一个Hybird项目,使用的是ionic,由于是第一个Hybrid项目,在这里记录下基本的知识. 先看一下ionic的最基本介绍: http://my.oschina.net/u/2275 ...

  2. iOS keyChain 的使用

    详细资料,请参看苹果官方文档Keychain Services Reference . ios中的keychain,用于保存用户的机密信息,对keychain的操作有4种,就是 增,删,改,查: Se ...

  3. MongoDB 3.0 用户创建

    摘要: MongoDB 3.0 安全权限访问控制,在添加用户上面3.0版本和之前的版本有很大的区别,这里就说明下3.0的添加用户的方法. 环境.测试: 在安装MongoDB之后,先关闭auth认证,进 ...

  4. Java for LeetCode 215 Kth Largest Element in an Array

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  5. ABAP 内表的行列转换-发货通知单-打印到Excel里-NEW

    *********************************************************************** * Title           : ZSDF002  ...

  6. web开发,关于jsp的常见问题,重复提交,防止后退。

    看了网上的,有几种方法:1 在你的表单页里HEAD区加入这段代码: <META HTTP-EQUIV="pragma" CONTENT="no-cache" ...

  7. 【leetcode】Max Points on a Line(hard)☆

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...

  8. JavaEE编码题

    1.请编写代码实现登录效果(5分) 要求: 1)手写出相应的HTML和CSS代码 2)字体大小12px,表格宽300px,按钮行占两列并水平居中, 3)可以写在style节点内,也可使用行内CSS或者 ...

  9. 命名空间 - PHP笔记

    转: 概述 命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念,比如在操作系统中,目录用来将相关文件分组,对于目录中的文件来说,目录就扮演了命名空间的角色.这个原理应用到程序设计领域就是命 ...

  10. 做一个App前需要考虑的几件事

    本文转载于文章原文链接,版本归原作者所有! 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 App 有了一定规模后, ...