20135337朱荟潼 Linux第四周学习总结——扒开系统调用的三层皮(上)

本文深入探讨了Linux系统调用的基本原理,包括用户态与内核态的转换、中断处理流程、系统调用的实现机制及其与API的关系,还介绍了通过C代码与汇编代码混合编程实现系统调用的具体方法。

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

知识点梳理

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

1.级别、如何区分

2.中断处理,用户态到内核态

744834-20160315154450037-986305207.jpg

3.保护现场和恢复现场

744834-20160315154500115-964564142.jpg

二、系统调用概述

1.操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用

1.把用户从底层硬件编程中解放;
2.提高系统安全性;
3.用户程序具有可移植性;

2.API(应用编程接口)和系统调用关系

1.API是函数定义;
2.系统调用时通过软中断向内核发出明确请求;

3.a.API可直接提供用户态服务(如:数学函数);b.一个API调用几个系统调用;c.不同API可调用同一个系统调用;

3.Libc库

1.定义了一些API引用了封装例程;
2.目的发布系统调用;
3.一般每个系统调用对应一个封装例程,库再用这些封装例程定义出给用户的API;

4.返回值

1.大多封装例程返回一个整数,其值依赖于相应的系统调用;
2.-1表示内核不能满足进程的请求;
3.Libc定义的errorno变量包含特定出错码;

5.处理应用程序、封装例程、系统及系统调用服务例程关系

744834-20160315144237396-1870377064.jpg

三层皮:API xyz,中断向量system_call,中断服务程序sys_xyz

6.系统调用号将xyz和sys_xyz关联起来;用eax寄存器来传递参数;

7.系统调用的传递参数方法

1.实际的值;
2.用户态进程地址空间的变量的地址;
3.包含指向用户态函数的指针的数据结构的地址;
寄存器传递参数的限制

744834-20160315144426131-1848521033.jpg

8.system_call是linux所以系统调用的入口

744834-20160315144615318-2128027261.jpg

三、使用库函数API和C代码中嵌入汇编代码

1.C代码中嵌入汇编代码

详细见第二周学习总结 (http://www.cnblogs.com/zzzz5/p/5232145.html

2.获取系统当前时间

 asm volatile(
        "mov $0,%%ebx\n\t"     ;系统调用传递第一个参数使用ebx,把ebx清零
        "mov $0xd,%%eax\n\t"   ;time的系统调用号是13
        "int $0x80\n\t"
        "mov %%eax,$0\n\t"     ;eax放入tt变量中,返回值
        :"=m"(tt)
    );
系统调用号如:

744834-20160315144654443-511407163.png

具体系统调用号参见:http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl

3.实践(11号——fork)

源代码fork.c
744834-20160319101512146-40243316.png
744834-20160319101545099-1642017552.png

嵌入式汇编代码fork_asm.c
744834-20160319101620928-630611648.png
744834-20160319101632912-403533740.png

总结

1.API是一个函数概念,它可能会使用系统调用(系统调用是用户态程序操作硬件的接口)。每次系统调用都会向内核请求软中断,即执行int $0x80指令。

2.int 0x80该指令的作用是找到系统调用处理程序(中断处理程序)。

3.使用iret指令返回到用户态。

4.系统是通过中断的方式将用户态转换为内核态,并通过调用系统函数来实现系统功能。当系统中断出现时,CPU保护现场和上下文切换来保护目前用户态所运行的状态,并通过返回系统调用函数的值来让用户判断是否已经有效地调用,结果如何。

5.系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。通过int 0x80,触发系统调用。

转载于:https://www.cnblogs.com/zzzz5/p/5279112.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值