库函数API和C语言汇编语言混合式编程
C语言代码内嵌汇编的方法:
#include<stdio.h>
#include <unistd.h>
int main()
{
int a,b;
pid_t t,asm_t;
t =getpid();
a = t;
printf("pid = %d\n",a);
asm volatile(
"mov $0x14,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(asm_t)
);
b = asm_t;
printf("asm_t = %d\n",b);
return ;
}
- 应用程序通过调用C语言函数库中的外壳函数(wrapper),发起系统调用
- 外壳函数必须保证所有的系统调用参数可用,这些参数通过堆栈传入外壳函数,内核希望将这些参数置入通用寄存器。因此,外壳函数会将上述参数复制到寄存器,个数不超过6个(ebx,ecx,edx,esi,edi,ebp)每个参数长度不超过寄存器的位数--32位。
- 为了 让内核能区分每个系统调用,外壳函数会将系统调用编号复制到特定的通用寄存器中-->%eax
- 在此之后,外壳函数执行一条中断指令,引发用户态到核心态的切换,并执行系统中断0x80(128d)的中断矢量所指向的代码
- 内核调用system_call以响应0x80中断,过程如下:
- 在内核栈中保存寄存器值
- 审核调用编号的有效性
- 以系统调用编号对存放所有调用服务程序的列表(sys_call_table)进行索引,查找并调用相应的系统调用服务程序。若服务程序需要参数,则检查参数的有效性。
- 从内核栈中恢复各寄存器值,将系统调用返回置于栈中。
- 返回至外壳函数,同时将处理器切换回用户态
- 若系统调用的返回值表明调用有误,外壳函数会使用该值设置全局变量errno,无误则返回调用程序,并返回一个整型值,表明系统调用是否成功。

by 昆仑雪狐
原创作品转载请注明出处
《Linux内核分析》
MOOC课程http://mooc.study.163.com/course/USTC-1000029000
库函数API和C语言汇编语言混合式编程的更多相关文章
- 单片机C 语言与汇编语言混合编程
在单片机应用系统设计中,过去主要采用汇编语言开发程序. 汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统 ...
- 通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制
作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用A ...
- 实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光 学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...
- C语言之基本编程思想与基本概念扫盲
前言:C语言是包含了很多编程的基本思想,理解C能够有助于理解其他高级语言,深刻理解编程很多基本思想:这对新手入门是有很多好处的,正所谓磨刀不误砍柴工,内功与基础修炼扎实了,才能开始盖高楼大厦. 这篇文 ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- 【算法】C语言趣味程序设计编程百例精解
C语言趣味程序设计编程百例精解 C/C++语言经典.实用.趣味程序设计编程百例精解(1) https://wenku.baidu.com/view/b9f683c08bd63186bcebbc3c. ...
- 【转】VxWorks中高精度实时时钟的实现及C语言汇编混合编程
最近一个项目中需要在VxWorks下使用一个高精度实时时钟,要求精度为1ms,溢 出时间大于5小时.VxWorks提供系统时钟,该时钟在操作系统启动后开始计数,精度为1个tick,可以通过tickGe ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- 实验四——使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...
随机推荐
- 《精通C#》第十七章
进程简单的说就是一个正在运行的程序,包含了运行该程序所需要的一切资源以及内存分配.线程是进程的基本执行单元,在进程的入口点(类似main())创建的第一个线程称之为主线程.只有一个主线程的进程是线程安 ...
- 简单的例子 关于Java内存管理的讲解
我想做的是,逐行读取文件,然后用该行的电影名去获取电影信息.因为源文件较大,readlines()不能完全读取所有电影名,所以我们逐行读取. 就这段代码,我想要在位置二处使用base64,然后结果呢? ...
- jquery1:
在jquery中:1.window.onload: --->$();所以一般jquery用如下开头: $(function(){ })2.获取元素:$('#div'):获取id为div的元素$( ...
- WPF MVVM 学习总结(一)
---恢复内容开始--- 1. MVVM简介 在WPF中,MVVM(View-ViewModel-Model)开发模型用的很多,它具有低耦合,可重用行,相对独立的设计和逻辑.所以备受广大开发者的喜爱. ...
- html slelect 标签默认值
<select name="channelCode" id="channelCode" class="all_input" style ...
- uva 10817(状压dp)
题意:就是有个学校要招老师.要让没门课至少有两个老师可以上.每个样样例先输入三个数字课程数量s,已经在任的老师数量,和应聘的老师数量.已经在任的一定要聘请. 思路是参考了刘汝佳书上的,关键如何状压. ...
- SQL server同时删除多个表
) while exists (select name from sys.tables where name like 'se_%') begin @varname = name from sys.t ...
- Lyft押重注于苹果编程语言Swift
Lyft押重注于苹果编程语言Swift 1年后获得丰厚回报BI中文站 8月22日报道 一年多以前,打车应用Lyft做出重大决定,决心押重注于苹果开发的编程语言Swift,用这种编程语言重写其所有iPh ...
- Python future模块
今天看到了Pyhon中的模块__future__,查了一下资料,感觉这个module很有用. 从python2.1开始以后, 当一个新的语言特性首次出现在发行版中时候, 如果该新特性与以前旧版本pyt ...
- E. Vasya and Beautiful Arrays
http://codeforces.com/contest/355/problem/E 每个数都可以变成段 [a-k,a], 某一个因子是否被所有的段包含,就是把这个因子以及它的所有倍数看成点, 看是 ...