linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道
用户态:低级别执行状态,代码的掌控范围会受到限制。
内核态:高执行级别,代码可移植性特权指令,访问任意物理地址
为什么划分级别:如果全部特权,系统容易崩溃。。。可以让系统更稳定,
Linux 只有0和3级
如何区分:cs和eip
0x0000000以上地址空间仅有内核态可以访问,0x00000000——0xbffffff两种状态都可访问
中断处理是从用户态进入内核态的主要方式
切换时,保存用户态寄存器上下文,int指令在堆栈保存一些寄存器的值(用户态栈顶地址、当时的状态字、当时cs:eip的值)
中断发生后的第一件事就是保存现场,中断处理结束前最后一件事是恢复现场
系统调用的意义
把用户从底层硬件编程解放出来;极大提高了系统的安全性;使用户程序具有可移植性
API(应用编程接口):只是一个函数定义
系统调用是通过软中断向内核发出一个明确的请求
不是每个API都对应一个特定系统调用,
三层皮:API,中断向量,sys_xyz
当用户态进程调用一个系统调用,CPU切换到内核态并开始执行一个内核函数。指令:Int $0x80
系统调用参数传递:每个参数长度不能超过寄存器长度(32位);参数个数不能超过6个(ebp,ecx,edx,esi,edi,ebp)
实验四 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
使用了122号系统调用uname来获取当前UNIX系统的名称、版本和主机等信息。
一、实验过程
1、使用库函数API进行调用的代码【namel.c】如下:
#include <sys/utsname.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct utsname testbuff;
int fb=0;
fb=uname(&testbuff);
if(fb<0)
{
perror("uname");
return 0;
}
else
{
printf("sysname:%s\n nodename:%s\n release:%s\n version:%s\n machine:%s\n\n ",testbuff.sysname,testbuff.nodename,testbuff.release,testbuff.version,testbuff.machine);
#if _UTSNAME_DOMAIN_LENGTH - 0
# ifdef __USE_GNU
printf(" domainame:%s\n ",testbuff.domainname);
# else
printf(" __domainame:%s\n ",testbuff.__domainname);
# endif
#endif
}
return 0;
}
编译后输出结果为:
2、然后将部分代码修改之后变为使用汇编方式触发系统调用,部分代码【namel-asm.c】如下:
int fb;
asm volatile(
"mov $0,%%ebx\n\t"
"mov $0x7A,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
: "=m" (testbuff)
);
fb=uname(&testbuff);
l 下面来分析汇编代码调用系统调用的工作过程。
第一个move是先将ebx清零,即令ebx为NULL;
第二个move是将0x7A(uname是122号系统调用)放到eax中(eax是传递系统调用号的),即用eax传递参数;
执行int $0x80指令开始进行系统调用,返回值用eax存储;
然后将eax放到%0(即变量testbuff)中。
编译后输出结果为:
总结
系统调用可以通过已经封装的库函数进行,同时操作系统提供的API和系统调用的关系,API中封装了一个系统调用,这个系统调用会触发一个int0x80的中断,这个0x80的中断向量就对应着system_call这一个内核代码的入口起点,其中可能有例如sys_xyz()这样的中断服务程序,在中断服务程序执行完之后可能会ret_from_sys_call。在ret时候可能会发生进程调度,若没有,则会iret返回到用户态,接着执行
李海空原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”
linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用的更多相关文章
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...
- 实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光 学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...
- 实验四——使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...
- 通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制
作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用A ...
- Linux内核分析-两种方式使用同一个系统调用
实验部分 根据系统调用表,选取一个系统调用.我选得是mkdir这个系统调用,其系统调用号为39,即0x27 由于mkdir函数的原型为 int mkdir (const char *filename, ...
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call. 系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变 ...
- 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...
- linux内核分析第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量 ...
随机推荐
- Mac Pro 安装 Sublime Text 3,个性化设置,主题 和 插件 收藏
1.到官网下载安装包 http://www.sublimetext.com/3 2.附注册码一枚 Sublime Text 3 3126 —– BEGIN LICENSE —– Alexey Plut ...
- 完整的PHP MYSQL数据库类
<?php class mysql { private $db_host; //数据库主机 private $db_user; //数据库用户名 private $db_ ...
- PHP中计划任务
PHP不支持多线程,有时候处理问题不是那么爽,今天谈论一下PHP定时执行的方法 PHP定时执行的三种方式实现 .windows 的计划任务 .linux的脚本程序 .让web浏览器定时刷新 windo ...
- Eclipse自动编译问题
今天遇到一个很郁闷的问题,在程序中修改了一个String字符串,结果打断点是发现,还是修改之前的值,一点都没有变,最终发现该类在tomcat中的class的大小一直都没有变,只有修改时间在变,这才意识 ...
- SQLServer 事务隔离级别与锁的申请和释放
脏读:当一个事务开始更新数据,但是这个事务并没有完全提交,这个时候第二个事务开始读取数据,把第一个事务所更改的数据读了出来, 第二个事务读取的数据时临时的,因为有可能第一个事务最终有可能做回滚操作 不 ...
- 启动Tomcat报异常host-manager does not exist or is not a readable directory
前几天重新安装了Tomcat6,安装完Tomcat6后在wepapps下面会有一些tomcat自带的项目(root.manager.host- manager等几个),这几天项目没什么用我就删掉了,后 ...
- iOS深入学习(Block全面分析)
本文翻译自苹果的文档,有删减,也有添加自己的理解部分. 如果有Block语法不懂的,可以参考fuckingblocksyntax,里面对于Block 为了方便对比,下面的代码我假设是写在ViewCon ...
- iOS 两行代码解决数据持久化
在实际的iOS开发中,有些时候涉及到将程序的状态保存下来,以便下一次恢复,或者是记录用户的一些喜好和用户的登录信息等等. 这就需要涉及到数据的持久化了,所谓数据持久化就是数据的本地保存,将数据从内存中 ...
- 数学 SRM 690 Div1 WolfCardGame 300
Problem Statement Wolf Sothe and Cat Snuke are playing a card game. The game is played with exa ...
- Page-encoding specified in XML prolog (UTF-8) is different from that specified in page directive (utf-8)
org.apache.jasper.JasperException:xxx.jsp(1,1) Page-encoding specified in XML prolog (UTF-8) is diff ...