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

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 《Linux内核分析》笔记 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 《Linux内核分析》笔记内核态和系统调用操作系统将进程划分为内核态和用户态,用户的程序运行在用户态下,而涉及低级和设备资源的调用在内核态中完成。为了方便用户程序使用各种系统资源,操作系统为我们提供了系统调用,而避免用户之间操作各种系统资源所带来的隐患。实验原理使用系统调用的方式通常有使用库函数调用和中断传入系统调用号的方式两种。库函 阅读详情

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


首先我选择的系统调用是122号系统调用——uname

简单的介绍一下uname,它的功能是获取当前内核名称和其他信息。


用法:
#include <sys/utsname.h>


/* Put information about the system in NAME.  */
extern int uname (struct utsname *__name) __THROW;
参数:
__name:指向存放系统信息的缓冲区,原型如下

/* Structure describing the system and machine. */
struct utsname
  {
    /* Name of the implementation of the operating system. */
    char sysname[_UTSNAME_SYSNAME_LENGTH];   //当前操作系统名

    /* Name of this node on the network. */
    char nodename[_UTSNAME_NODENAME_LENGTH]; //网络上的名称

    /* Current release level of this implementation. */
    char release[_UTSNAME_RELEASE_LENGTH];   //当前发布级别


    /* Current version level of this release. */
    char version[_UTSNAME_VERSION_LENGTH];   //当前发布版本

    /* Name of the hardware type the system is running on. */
    char machine[_UTSNAME_MACHINE_LENGTH];   //当前硬件体系类型

#if _UTSNAME_DOMAIN_LENGTH- 0
    /* Name of the domain of this node on the network. */
# ifdef __USE_GNU
    char domainname[_UTSNAME_DOMAIN_LENGTH];  //当前域名
# else
    char __domainname[_UTSNAME_DOMAIN_LENGTH];
# endif
#endif
  };

返回说明:
成功执行时,返回0。失败返回-1,errno被设为EFAULT,表示buf无效。

根据相关例程很容易的就写出了一个c语言的应用。


编译运行。


正确的显示了系统的信息。


但是当我使用汇编编写时,一开始也是参照老师的方法去写,也就是定义一个指向struct utsname的指针,并作为汇编中系统调用的返回值,结果什么也没显示出来。

后来我发现了问题所在,关注一下uname的api函数的原型 extern int uname (struct utsname *__name) __THROW;

很明显他的返回值并不是系统讯息的内容,而是成功执行时,返回0。失败返回-1,errno被设为EFAULT,表示buf无效。系统信息的指针是作为函数的输入参数。豁然开朗

既然eax存的是系统调用编号,ebx是第一个输入参数,那么我将指针存进ebx不就ok了?同时为了验证eax内是返回值的猜想,我定义了一个int变量k,并且将其赋值为-1,,通过if判断如果在系统调用后uname不返回0,就无法打印出内容。

可以看到在嵌入式汇编语句中不单单有输出参量,还有了输入参量 u,后面的(b)就是存入ebx的意思了。

编译执行

结果是确实有显示了,但是那个段错误是什么鬼?代码泄漏? 这里我真的没太明白了,希望大家能够帮我指出问题所在。

但另一方面能能打印出东西说明k值改变了,后来我打印了k,确实k值为0。

这说明在int 0x80时此时输入的参量将在ebx中(我觉得其实调用号也可以理解成一种输入参量吧,它存在eax中),在int后,返回值就存在eax中。


经高人指点我发现了问题所在

对指针的理解还是太年轻,我光定义指针 但实际上根本没有开辟空间存uname的东西,指针是野指针能不出问题吗!

改为这样就ok了,定义结构体变量,将结构体的地址作为参数传进去就好了。



改为这样就ok了(可看到sysnamne左边的那个就是k,确实返回了0)




具体的调用过程这里借用课件中的一张图


显然在调用之前,先保存了现场(SAVE_ALL具体内容课上已讲),再根据eax中的调用号和调用表(sys_call_table)进行调用,然后将返回值保存在eax中。最终离开系统调用并恢复现场,同时根据任务是否满足运行条件来调度任务(call schedule)。

总结一下,其实这种软中断非常像单片机中各种”软中断“,而系统调用的整个过程就是一种”中断响应“只不过,中断源并不是外部设备的信号或是定时器/计数器产生的信号而是由软件代码产生的中断信号,而系统调用号就是一种中断向量,它指向了该系统调用服务程序的入口。

也就是第一层皮:程序的入口API。

第二层:系统调用的handle。

第三层:系统调用的服务程序。




STM32-V3.5固件库函数调用说明(中文版).pdf 使用stm32单片机有两种方式:库函数 与 直接操作寄存器,这两种方式我们都可以去使用。我接触stm32是有一段时间的,我自己的感觉是库函数是比较适用的,直接操作继续存器我们就得随时得知道寄存器的某一位是干什么的,或者一开始我们不知道就得去看参考手册什么的,个人感觉不是很方便。 库函数实际上是通过官方给的API函数来操作寄存器,其实归根结底,就是不管什么单片机或者什么硬件,你操作的都是寄存器,只是操作的方式不一样而已,这一点一定要清楚。 作者:你的优先级最高 链接:https://www.jianshu.com/p/a21666f65805 来源:简书 著作权归作者所有。商业转载请联系作者 立即下载

相关推荐

Prometheus-2.53.1安装

Prometheus+Grafana安装

qlj062127的博客 1787

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

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

NaiveOrange的博客 1345

什么事LLVM和Clang?Clang与GCC有什么区别?Clang如何使用?

这个问题主要讲Xcode编译器的认知,在学习iOS之前有必要学习一下Objective-C的编译环境。 在了解LLVM和Clang之前,先得了解一下什么是编译器。 编译器是一种计算机程序,它将某种编程语言(高级编程语言)写成的源代码转换成另一种编程语言(低级编程语言)。一个现代编译器的主要工作流程为:源代码->预处理器->编译器->目标代码->链接器->可执行程序...

Welcome~ 9723

程序员节开心的学习使用两种方式进行同一系统调用

库函数 API 和 C 代码中嵌入汇编代码两种方式使用同一个系统调用C语言库函数号使用库函数API实现需要用到的函数和头文件说明代码实现过程复现使用C语言中嵌入汇编实现系统调用代码实现过程复现汇编代码调用系统调用的工作过程总结 C语言库函数号 以下是基于linux/x86/arch下的系统调用 系统调用 比如1号就是退出,2号就是read等等。一般要引入库文件比如经典的库文件time.h,math.h,string.h等。 使用库函数API实现 需要用到的函数和头文件说明 接下来我要实现第20号的调用(注

weixin_44240981的博客 330

gm/ID设计方法实践指南:从理论曲线到电路优化的关键步骤

本文详细介绍了gm/ID设计方法在模拟IC设计中的实践指南。该方法通过直接利用工艺模型数据,将设计焦点从盲目调整晶体管尺寸转向选择关键的gm/ID工作点,从而在先进工艺下实现功耗、增益和带宽等性能的精准权衡与优化。文章从理论曲线生成到具体电路设计步骤,提供了完整的实战流程。

pandas7gardener的博客 479

西门子1500T系列凸轮同步(CAMIN指令用法)

添加凸轮工艺对象(TO_CAM),也就是凸轮表。开始编程,先写2个轴的使能、回原点与主轴的定位。监控主轴与从轴的位置、速度关系是否满足实验要求。1.添加工艺对象(1个定位轴,1个同步轴)调用CAMIN指令 ,凸轮耦合。主轴为旋转轴且为模数轴。3.调用插补凸轮盘指令。4.仿真、监控、调试。

gyxgyx789的博客 1万+

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

直接调用库函数API 首先,进入github的torvalds/linux页面进行syscall_32.tbl文件的查看。该文件即是系统调用列表文件,包含了一系列的定义,例如系统调用的编号、名称、参数列表和实现方法等等内容。在本实验,选择了getpid和getppid系统调用来实现直接调用库函数API。 getpid用于获取调用进程的进程标识号(Process ID,PID),而getppid用于获取调用进程的父进程的进程标识号(Parent Process ID,PPID)。getpid可以帮助进

weixin_67677183的博客 564

从原理到代码:拆解UniFormer中动态位置嵌入(DPE)的3D卷积实现

本文深入解析了UniFormer模型中动态位置嵌入(DPE)模块的3D卷积实现原理与代码。DPE通过一个轻量的3D深度可分离卷积,替代传统静态位置编码,使模型能自动学习视频数据的时空位置关系。文章对比了其与Swin Transformer相对位置偏置的优劣,并提供了PyTorch实现代码与高级定制方案,为视频理解任务提供了高效灵活的动态位置编码解决方案。

weixin_29207149的博客 309

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

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

weixin_34178244的博客 263

vue2/3 - H5 移动端网页中调用手机摄像头扫描二维码 / 条形码功能,在h5手机网页里调起相机摄像头进行二维码或条形码扫描效果详细教程(详细示例组件源码,一键复制开箱即用!)

vue扫描二维码条形码,vue网页调用摄像头扫二维码条形码,vue移动端如何实现调用相机扫描二维码,vue移动端扫一扫功能,vue怎么做移动端h5扫一扫功能,vue识别二维码和条形码,vue实现点击按钮调用摄像头扫码,vue调用本地摄像头实现拍照功能,Vue中如何进行二维码生成与扫描,如何实现vue在手机浏览器中调用摄像头实现扫描二维码功能,VUE项目移动端H5调用摄像头扫码,vue项目中实现H5调取摄像头,网页调用摄像头实现二维码扫描功能,vue调用手机摄像头,vue在调用摄像头扫码,vue自定义打开摄像

✅ 精选推荐文章 1万+

K-Core, K-Shell & K-Crust傻傻分不清楚

K-Core(K-核)就是所有大于等于K的K-Shell的并集;K-Crust(K-皮)就是所有小于等于K的K-shell的并集。

欢迎订阅 -- 小源笔迹 2255

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

贺邦+原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,理解系统调用的工作机制。 实验过程: 本文实验选择24号和47号系统调用,分别获取当前用户uid(用户ID)和gid(组ID),即模拟...

diluxiao0876的博客 584

Flutter应用安卓逆向之hook分析研究---附dart版本对照表(必看篇)

搜索md5、rsa、aes等关键字分析要破解的加密算法,使用frida进行hook可疑函数的偏移地址。,双击进去找到ssl_crypto_x509_session_verify_cert_chain函数的偏移地址进行hook掉;Flutter应用是内置进行ssl证书校验的,无法通过常规方法抓到包,需要通过frida把它内置的ssl校验hook掉。重构完成后会生成新的apk,把它安装到模拟器或者真机中并打开运行,此时系统会在。关键字的函数进行hook(因为其返回的是字符串类型)中,拖进ide搜索字符串。

云霄IT的博客 8440

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

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

vincent_up的专栏 638

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

《Linux操作系统分析》之使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

本篇文章分析的是使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,来说明在Linux系统中,系统调用的实现机制。

WSYW126的博客 1630

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

第4节 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用【Linux内核分析】

原创作品转载请注明出处 +《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000一、实验要求 选择一个系统调用(13号系统调用time除外),系统调用列表参见Cross Reference: syscall_32.tbl 参考视频中的方式使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 二、基础知识 系统调用

林沐风的技术学习专栏 673
上一篇: 跟踪分析Linux内核的启动过程(从start_kernel到init进程)
下一篇: 使用gdb跟踪分析一个系统调用内核函数
oCoreCode
博客等级 码龄14年 1粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值