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

实验目的:

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,理解系统调用的工作机制。

实验过程:

本文实验选择24号和47号系统调用,分别获取当前用户uid(用户ID)和gid(组ID),即模拟Linux系统“id”命令。

编写两段代码,分别使用库函数API和C代码中嵌入汇编代码,源码如下:

uidgid.c(使用库函数API方式):

程序中通过调用getuid()和getgid()函数来获取当前执行用户uid和gid

参考:《Advanced Programming in the UNIX Environment》

uidgid_asm.c(使用C代码中嵌入汇编代码方式):

内嵌汇编代码版本源码中将原来两行通过API函数获取uid和gid的代码注释掉,用汇编代码替换。

首先将ebx寄存器清零,表示无参数传入。

然后分别将0x18和0x2f(十进制24和47)赋值给eax寄存器,表示需要调用的系统调用号,24为getuid,47为getgid。

执行int 0x80来执行系统调用。

之后eax寄存器保存了返回值,将它分别赋值给输出uid或gid变量。

完成整个汇编代码的系统调用。

分别编译两个源码文件、执行系统id命令以及两个编译好的程序

上面的截图分别表示普通用户ubuntu和管理员用户root分别执行系统自带命令id,库函数API方式uidgid,内嵌汇编方式uidgid_asm这三种方式运行得到的结果是一样的。

实验分析:

通过实验执行结果可知,程序成功完成了系统调用获取当前用户uid和gid的操作,通过内嵌汇编代码可以清晰的看出调用系统调用的工作过程。

首先将ebx寄存器清零,表示无参数传入。

然后分别将0x18和0x2f(十进制24和47)赋值给eax寄存器,表示需要调用的系统调用号,24为getuid,47为getgid。

执行int 0x80来执行系统调用。

之后eax寄存器保存了返回值,将它分别赋值给输出uid或gid变量。

完成整个汇编代码的系统调用。

在Linux系统中是通过激活0x80中断来触发系统调用的,需要调用的系统调用号实现赋值给eax存储器,如果有传入参数可赋值给ebx寄存器,如果多于1个则按顺序赋值给ebx、ecx、edx、esi、edi、ebp,如果超过6个则通过指针变量指向另一片堆栈区,如果无参数传入则赋值为0。

实验总结:

虽然Intel X86 CPU有4种执行级别0~3,但是在Linux系统中仅使用了0和3级,分别表示内核态用户态

一些涉及底层、硬件、核心的操作必须在内核态下才允许执行,为操作系统程序和驱动程序专享,普通程序仅能执行在用户态下。如果普通程序需要涉及内核态的操作,就需要通过系统调用来实现。这样做的好处是屏蔽平台相关操作降低了软件开发难度,增强了系统安全性,使程序具有更好的移植性(Linux系统及其他Unix系统遵循统一标准,系统调用基本一样)。

转载于:https://www.cnblogs.com/L1nke/p/5297663.html

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

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

    实验4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 姓名:李冬辉 学号:20133201 注: 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http ...

  2. 在易语言代码中嵌入汇编/机器码

    在易语言代码中嵌入汇编/机器码                    --"置入代码"的使用方法简介 作者:liigo 原文链接:http://blog.csdn.net/liig ...

  3. c语言清除html标签的方法,去除HTML代码中所有标签的两种方法

    去除HTML代码中所有标签 '****************************** '函数:RemoveHTML_A(strText) '参数:strText,待处理的字符串 '作者:阿里西西 ...

  4. 将Eclipse代码导入到AndroidStudio的两种方式

    实现步骤 1. 从Eclipse中导出Gradle build files 在Eclipse菜单中 File --> Export-->Generate Gradle build file ...

  5. 冒泡排序的两种方式c语言代码,【C语言】两种方式实现冒泡排序算法

    题目要求 编写一个C语言程序,实现基本的冒泡排序算法. 算法 冒泡排序,用一句话来总结: 一组数中,相邻的两个数进行比较.交换,将最大(小)数交换至尾(首)部,即完成了一次冒泡排序 要想对N个数字进行 ...

  6. Java代码实现MD5加密的两种方式

    MD5的全称是Message-Digest Algorithm 5 (信息-摘要算法),在90年代初,由MIT Laboratory for Computer Scientce 和RSA Data S ...

  7. JS-01-在HTML中嵌入JavaScript代码的三种方式

    JS-01-在HTML中嵌入JavaScript代码的三种方式 1.JavaScript概述 Web的组成有HTML.CSS还有即将要学习的JavaScript(简称JS). CSS和JS主要是服务于 ...

  8. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码...

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  9. java操作Excel有两种方式 方式1:jxl操作Excel jxl的API

    java操作Excel有两种方式 方式1:jxl操作Excel 方式2:poi操作Excel 下面介绍jxl API: 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用 ...

最新文章

  1. 用Ajax构建关键任务的企业级Web应用 ——《深入Ajax:架构与最佳实践》
  2. Oracle之物化视图
  3. JQuery学习笔记 [Ajax] (6-2)
  4. 系统安装操作优化:chapter 3 安装windos操作系统。
  5. win7怎么合并计算机窗口,win7 已设置任务栏窗口从不合并,游戏多开,如何固定窗口顺序?...
  6. Powerdesigner设置表字段注释与name相同
  7. 用jquery在一个页面加载另一个页面
  8. 一个简单例子理解连表查询
  9. 【好玩的应用】QQ连连看辅助工具
  10. linux源码编译ipk,openwrt SDK, 利用SDK生成自己的ipk安装包
  11. chrome插件开发之调试
  12. Gif截图工具——GifCam
  13. Java 语言使用 Observer/Observable 实现简单的观察者模式
  14. 《滕王阁序》本周部分GAN论文(0113-0117)
  15. 【数据结构】详解KMP算法
  16. centos使用技巧
  17. Hypervisor介绍(二)
  18. Redis 3.0集群搭建/配置/FAQ
  19. Qt QEvent 介绍
  20. 2012年度IT博客大赛10强诞生了

热门文章

  1. 伍六七带你学算法 进阶篇-生命游戏
  2. Go 学习笔记(72)— Go 第三方库之 pkg/errors 带堆栈的错误处理
  3. Qt---布局,设置控件边距,拉伸因子
  4. 算法最少分组法_数据结构
  5. Pytorch的默认初始化分布 nn.Embedding.weight初始化分布
  6. 最强 NLP 预训练模型库 PyTorch-Transformers 正式开源:支持 6 个预训练框架,27 个预训练模型...
  7. 深度学总结:skip-gram pytorch实现
  8. 梯度提升决策树(GBDT)与XGBoost、LightGBM
  9. LeetCode中等题之区域和检索 - 数组可修改
  10. Deep Learning部署TVM Golang运行时Runtime