《Linux内核分析》 第四节 扒开系统调用的三层皮(上)

黄胤凯   原创作品转载请注明出处   《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、视频学习

1.系统调用的三层皮:xyz    system_call    sys_xyz

对应的是API,中断向量对应的中断服务程序,系统调用服务程序。

 

API:应用编程接口            

它与系统调用的关系:API可能直接提供用户态的服务,不是一个API都有与之相对应的系统调用。

 

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

通过cs:eip的值判断代码段是在用户态还是内核态

中断处理是一种由用户态进入内核态的方式(系统调用也可以理解为是一种中断)

中断发生后,首先要保存现场,将数值压栈,保存到相应的寄存器中,然后响应中断,将数值弹栈,恢复现场。

 

 

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

  • 实验报告

  • 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl 参考视频中的方式使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

  • 博客内容的具体要求如下:

    1. 题目自拟,内容围绕系统调用的工作机制进行,博客中需要使用实验截图

    2. 博客内容中需要仔细分析汇编代码调用系统调用的工作过程,特别是参数的传递的方式等。

    3. 总结部分需要阐明自己对“系统调用的工作机制”的理解。

 

  • 本次实验选择了2号调用fork调用来做实验:fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID

用实验楼的虚拟机打开shell

Cd Code
Vi forktest.c
Gcc forktest.c -o forktest.o -m32
./forktest.o

fork.c代码如下

复制代码
#include <unistd.h>
#include <stdio.h>
int main ()
{pid_t fpid;int count = 0;fpid = fork();if (fpid < 0)printf("error in fork!");else if (fpid == 0) {printf("i am the child process, my process id is %d\n",getpid());count++;}else {printf("i am the parent process, my process id is %d\n",getpid());count++;}printf("count: %d\n",count);return 0;
}
复制代码

 

 运行结果见截图 

  • 嵌入式汇编代码的执行,fork-asm.c源代码如下(参数的传递方式见注释):

 

复制代码
#include <unistd.h>
#include <stdio.h>
int main ()
{pid_t fpid;int count = 0;


asm volatile ("mov $0, %%ebx\n\t"       "mov $0x2, %%eax\n\t"    // 将fork的系统调用号0x2赋值给eax"int $0x80\n\t"          // 通过0x80中断向量,执行系统调用"mov %%eax, %0\n\t"      // 系统返回的pid号默认储存在eax中: "=m" (fpid)            // 输出操作数0为内存中的fpid。);
if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d\n",getpid()); count++; } else { printf("i am the parent process, my process id is %d\n",getpid()); count++; } printf("count: %d\n",count); return 0; }
复制代码

运行结果见截图

 

转载于:https://www.cnblogs.com/20132109HKK/p/5295680.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Java中获得类似于C的性能

总览 Java有许多可能很慢的领域。 但是&#xff0c;对于每个问题都有解决方案。 许多解决方案/黑客都需要解决Java的保护问题&#xff0c;但是如果您需要低水平的性能&#xff0c;还是可以的。 Java使高级编程变得更简单容易&#xff0c;但代价是使低级编程变得更加困难。 幸…

STARTUPINFO结构

1.结构原型 typedef struct _STARTUPINFO { DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD w…

Spring声明式事务示例

事务是具有ACID &#xff08;原子的&#xff0c;一致的&#xff0c;隔离的和持久的&#xff09;属性的工作单元。 原子意味着所有更改都发生或什么都没有发生。 如果从一个帐户借钱并贷记到另一个帐户&#xff0c;则交易将确保借记和贷项均已完成或均未完成。 一致表示更改使数…

路径 (Path)–nodejs

本模块包含一套用于处理和转换文件路径的工具集。几乎所有的方法只做字符串变换&#xff0c; 不会调用文件系统检查路径是否有效。 通过 require(path) 来加载此模块。以下是本模块所提供的方法&#xff1a; path.normalize(p) 规范化字符串路径&#xff0c;注意 .. 和 . 部分 …

OllyDBG反汇编快速找到程序入口一点分析

出处&#xff1a;http://hi.baidu.com/0soul/blog/item/b62f8f08c2c3c42c6b60fbbe.html 先声明下&#xff1a;这个和脱壳没关系&#xff0c;不是找壳里面的程序入口哦&#xff0c;只是程序本身的入口&#xff0c;个别朋友不要误会哈。其实这个应该是基础&#xff0c;但我经常找…

简单的Twitter:Heroku上的Play框架,AJAX,CRUD

因此&#xff0c;重大的公告发布了– Heroku开始为Play Framework应用程序提供本机支持&#xff01; 如果您还没有听说过&#xff0c;请在Heroku的博客上查看Jesper Joergensen的帖子 。 因此&#xff0c;对于演示&#xff0c;我将建立一个非常基本的Twitter副本&#xff1b; 它…

Cron表达式

CronTrigger CronTriggers往往比SimpleTrigger更有用&#xff0c;如果您需要基于日历的概念&#xff0c;而非SimpleTrigger完全指定的时间间隔&#xff0c;复发的发射工作的时间表。CronTrigger&#xff0c;你可以指定触发的时间表如“每星期五中午”&#xff0c;或“每个工作日…

深入理解JavaScript学习笔记(3)_全面解析Module模式

简介 Module模式是JavaScript编程中一个非常通用的模式&#xff0c;一般情况下&#xff0c;大家都知道基本用法&#xff0c;本文尝试着给大家更多该模式的高级使用方式。 首先我们来看看Module模式的基本特征&#xff1a; 模块化&#xff0c;可重用封装了变量和function&#x…

汇编----乘指令: MUL、IMUL

MUL: 无符号乘 ;影响 OF、CF 标志位;指令格式:;MUL r/m ;参数是乘数;如果参数是 r8/m8, 将把 AL 做乘数, 结果放在 AX;如果参数是 r16/m16, 将把 AX 做乘数, 结果放在 EAX;如果参数是 r32/m32, 将把 EAX 做乘数, 结果放在 EDX:EAX IMUL: 有符号乘 ;影响 OF、CF 标志位;…

Google App Engine Java功能和命名空间API

功能API 使用Capabilities API&#xff0c;您的应用程序可以检测特定API功能的停机和计划停机时间。 您可以使用此API来检测应用程序何时不可用&#xff0c;然后绕过它来减少应用程序的停机时间。 我们该如何处理&#xff0c;这是个折衷方案&#xff1f; 1.优雅&#xff1a;创…

破解key file时经常用到的几个API函数及其用法

CreateFile函数 ================================================================================== CreateFile: Creates or opens a file or I/O device. The most commonly used I/O devices are as follows: file, file stream, directory, physical disk, volume, …

PHP计划任务之关闭浏览器后仍然继续执行的函数

函数名称&#xff1a;ignore_user_abort 本函数配置或取得使用端连接中断后&#xff0c;PHP 程序是否仍继续执行。默认值为中断连接后就停止执行。在 PHP 配置文件中 (php3.ini/php.ini) 的 ignore_user_abort 选项就是配置处。本功能在 PHP 3.0.7 版之后才开始提供。 官方说明…

node--更新数据库问题

昨天测试blog的comment功能&#xff0c;在新增comment相关的代码之后&#xff0c;重启应用&#xff0c;出现Cannot call method forEach of undefined 。反复核对代码&#xff0c;都没发现异常&#xff0c;最后将数据库文件删除之后&#xff0c;再重启数据库&#xff0c;一切正…

U盘做完启动盘,如何恢复原始容量

&#xff08;1&#xff09;右击“我的电脑”&#xff0c;选择“管理”选项&#xff0c;之后选择“磁盘管理”&#xff0c;查看自己U盘的索引&#xff0c;如&#xff1a;Disk 1&#xff08;2&#xff09;在运行窗口&#xff0c;输入cmd&#xff0c;回车&#xff0c;出现Dos运行环…

GWT Spring和Hibernate进入数据网格世界

利用Infinispan数据网格的功能最大化Hibernate性能。 一个GWT &#xff0c; Spring &#xff0c; JPA &#xff0c; Hibernate &#xff0c; Infinispan集成教程。 在本教程中&#xff0c;我们将讨论如何将Infinispan用作Hibernate二级缓存提供程序。 Infinispan是JBoss缓存的…

记对一个key file crackme的破解

crackme下载地址: http://kssd.pediy.com/tutorial/exercise/section04/chap6-1-4-03.zip ------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------…

第八章 CTE 递归 及 分组汇总 高级部分(多维数据集)

UNION 等集合操作符&#xff1a;UNION 等以第一个 SELECT 的 列明 作为 整个结果集的列明&#xff0c;整个结果集 唯一认可的 唯一逻辑处理阶段 是 ORDER BY 这个意思是说 只有 ORDER BY 是对整个结果集作用的&#xff0c;其它都操作都作用在 UINON 两侧的 子集合中。EXCEPT 操…

Java Code Geeks Andygene Web原型

大家好&#xff0c; 我们很高兴地宣布&#xff0c;一组Maven原型的第一个版本已经发布&#xff01;&#xff01;&#xff01; 该集合的目的是提供可以满足各种开发需求的项目模板。 您可以在本文末尾找到JCG路线图。 该第一个发行版旨在提供项目模板-Web应用程序的体系结构。 …

关于如何用od反汇编win32 控制台程序

*********************************************************** 如何用od反汇编win32 控制台程序(类似dos程序&#xff09;呢&#xff1f;*********************************************************** 注&#xff1a;od是用来调试win32程序的 1.反编译win32 控制台程序&…