系统调用:库函数封装了系统调用,通过库函数和系统调用打交道

用户态:低级别执行状态,代码的掌控范围会受到限制。

内核态:高执行级别,代码可移植性特权指令,访问任意物理地址

为什么划分级别:如果全部特权,系统容易崩溃。。。可以让系统更稳定,

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代码中嵌入汇编代码两种方式使用同一个系统调用的更多相关文章

  1. LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...

  2. Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...

  3. 实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)

    使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...

  4. 实验四——使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...

  5. 通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制

    作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用A ...

  6. Linux内核分析-两种方式使用同一个系统调用

    实验部分 根据系统调用表,选取一个系统调用.我选得是mkdir这个系统调用,其系统调用号为39,即0x27 由于mkdir函数的原型为 int mkdir (const char *filename, ...

  7. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call. 系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变 ...

  8. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...

  9. linux内核分析第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量 ...

随机推荐

  1. JDK source 之 ArrayList 需要注意事项

    线程安全 ArrayList内部没有实现原子性操作,所以是非线程安全的.如果需要在线程安全的环境下使用List的话,需要使用Vector 或者CopyOnWriteArrayList,具体场景,自行深 ...

  2. .NET工程师面试宝典

    .Net工程师面试笔试宝典 传智播客.Net培训班内部资料 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面试现场带过来的真实笔试面试题,覆盖了主流的 ...

  3. 【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别

    From the previous posts, I have analysed 4 different Docker multi-host network solutions - Calico, F ...

  4. display_inline-block_table-cell

    1.display:inline-block; 兼容性:兼容到IE7+,Chrome,Firefox html: <ul class="list"> <li> ...

  5. request getParameter getAttribute

    在浏览器地址输入,表示传入一个参数test,值为123 http://localhost:8888/Test/index.jsp?test=123 在index.jsp中尝试使用EL表达式取出,代码如 ...

  6. hdu 1358 Period

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 思路:Next数组的用法,在第i个位置上如果有i%(i-Next[i])==0的话最小循环节就是 ...

  7. MIS系统开发利器,快速的字典录入解决方案,另类的、可管理的.NET DataWindow

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  8. [译]:Orchard入门——使用标签管理内容

    原文链接:Organizing Content Using Tags 在Orchard中,内容项可以使用标签来分类,同时,通过格式为 ~/tags/tag-name 的url可以直接查看包含对应标签关 ...

  9. redis数据类型之—Sorted set

    (1)sorted set 简单介绍 有序集合,在集合类型的基础上为集合中的每个元素都关联了一个分数,这样可以很方便的获得分数最高的N个元素. (2)sorted set 常用命令

  10. sqlmap的安装方法

    1.安装Python2.7,设置Python环境变量