Linux系统调用如何实现
发布时间 - 2023-05-18 00:00:00 点击率:次一、通过 glibc 提供的库函数
glibc 是 linux 下使用的开源的标准 c 库,它是 gnu 发布的 libc 库,即运行时库。glibc 为程序员提供丰富的 api(application programming interface),除了例如字符串处理、数学运算等用户态服务之外,最重要的是封装了操作系统提供的系统服务,即系统调用的封装。那么glibc提供的系统调用api与内核特定的系统调用之间的关系是什么呢?
通常情况,每个特定的系统调用对应了至少一个 glibc 封装的库函数,如系统提供的打开文件系统调用 sys_open 对应的是 glibc 中的 open 函数;
其次,glibc 一个单独的 api 可能调用多个系统调用,如 glibc 提供的 printf 函数就会调用如 sys_open、sys_mmap、sys_write、sys_close 等等系统调用;
另外,多个 api 也可能只对应同一个系统调用,如glibc 下实现的 malloc、calloc、free 等函数用来分配和释放内存,都利用了内核的 sys_brk 的系统调用。
举例来说,我们通过 glibc 提供的chmod 函数来改变文件 etc/passwd 的属性为 444:
#include#include #include #include int main() { int rc; rc = chmod("/etc/passwd", 0444); if (rc == -1) fprintf(stderr, "chmod failed, errno = %d\n", errno); else printf("chmod success!\n"); return 0; }
在普通用户下编译运用,输出结果为:
chmod failed, errno = 1
上面系统调用返回的值为-1,说明系统调用失败,错误码为1,在 /usr/include/asm-generic/errno-base.h 文件中有如下错误代码说明:
#define eperm 1 /* operation not permitted */
即无权限进行该操作,我们以普通用户权限是无法修改 /etc/passwd 文件的属性的,结果正确。
二、使用 syscall 直接调用
使用上面的方法有很多好处,首先你无须知道更多的细节,如 chmod 系统调用号,你只需了解 glibc 提供的 api 的原型;其次,该方法具有更好的移植性,你可以很轻松将该程序移植到其他平台,或者将 glibc 库换成其它库,程序只需做少量改动。
但有点不足是,如果 glibc 没有封装某个内核提供的系统调用时,我就没办法通过上面的方法来调用该系统调用。如我自己通过编译内核增加了一个系统调用,这时 glibc 不可能有你新增系统调用的封装 api,此时我们可以利用 glibc 提供的syscall 函数直接调用。该函数定义在 unistd.h 头文件中,函数原型如下:
long int syscall (long int sysno, ...)
每个系统调用都有一个独特的sysno系统调用号来进行标识。在sys/syscall.h中,所有可能使用的系统调用号都被定义为宏。
... 为剩余可变长的参数,为系统调用所带的参数,根据系统调用的不同,可带0~5个不等的参数,如果超过特定系统调用能带的参数,多余的参数被忽略。
返回值 该函数返回值为特定系统调用的返回值,在系统调用成功之后你可以将该返回值转化为特定的类型,如果系统调用失败则返回 -1,错误代码存放在 errno 中。
还以上面修改 /etc/passwd 文件的属性为例,这次使用 syscall 直接调用:
#include#include #include #include int main() { int rc; rc = syscall(sys_chmod, "/etc/passwd", 0444); if (rc == -1) fprintf(stderr, "chmod failed, errno = %d\n", errno); else printf("chmod succeess!\n"); return 0; }
在普通用户下编译执行,输出的结果与上例相同。
三、通过 int 指令陷入
如果我们知道系统调用的整个过程的话,应该就能知道用户态程序通过软中断指令int 0x80 来陷入内核态(在intel pentium ii 又引入了sysenter指令),参数的传递是通过寄存器,eax 传递的是系统调用号,ebx、ecx、edx、esi和edi 来依次传递最多五个参数,当系统调用返回时,返回值存放在 e
ax 中。
仍然以上面的修改文件属性为例,将调用系统调用那段写成内联汇编代码:
#include#include #include #include int main() { long rc; char *file_name = "/etc/passwd"; unsigned short mode = 0444; asm( "int $0x80" : "=a" (rc) : "0" (sys_chmod), "b" ((long)file_name), "c" ((long)mode) ); if ((unsigned long)rc >= (unsigned long)-132) { errno = -rc; rc = -1; } if (rc == -1) fprintf(stderr, "chmode failed, errno = %d\n", errno); else printf("success!\n"); return 0; }
如果 eax 寄存器存放的返回值(存放在变量 rc 中)在 -1~-132 之间,就必须要解释为出错码(在/usr/include/asm-generic/errno.h 文件中定义的最大出错码为 132),这时,将错误码写入 errno 中,置系统调用返回值为 -1;否则返回的是 eax 中的值。上面程序在 32位linux下以普通用户权限编译运行结果与前面两个相同!
# linux
# define
# 封装
# include
# printf
# 字符串
# errno
# int
# Interface
# Generic
# gnu
# 的是
# 返回值
# 放在
# 值为
# 你可以
# 多个
# 只需
# 为例
# 直接调用
# 将该
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在七牛云存储上搭建网站并设置自定义域名?
如何在IIS中新建站点并配置端口与物理路径?
网站建设保证美观性,需要考虑的几点问题!
打造顶配客厅影院,这份100寸电视推荐名单请查收
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
Android仿QQ列表左滑删除操作
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel模型事件有哪些_Laravel Model Event生命周期详解
EditPlus中的正则表达式 实战(4)
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
JavaScript如何实现音频处理_Web Audio API如何工作?
英语简历制作免费网站推荐,如何将简历翻译成英文?
如何快速搭建高效可靠的建站解决方案?
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
图册素材网站设计制作软件,图册的导出方式有几种?
如何在阿里云通过域名搭建网站?
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
如何正确下载安装西数主机建站助手?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
JavaScript模板引擎Template.js使用详解
怎么用AI帮你为初创公司进行市场定位分析?
千库网官网入口推荐 千库网设计创意平台入口
如何在Windows环境下新建FTP站点并设置权限?
用v-html解决Vue.js渲染中html标签不被解析的问题
如何在橙子建站中快速调整背景颜色?
如何用腾讯建站主机快速创建免费网站?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
手机网站制作与建设方案,手机网站如何建设?
微信小程序 scroll-view组件实现列表页实例代码
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
在线制作视频网站免费,都有哪些好的动漫网站?
Python并发异常传播_错误处理解析【教程】
Swift中循环语句中的转移语句 break 和 continue
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
网站制作价目表怎么做,珍爱网婚介费用多少?
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
电商网站制作价格怎么算,网上拍卖流程以及规则?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
Android 常见的图片加载框架详细介绍
Laravel如何使用Gate和Policy进行授权?(权限控制)
,网页ppt怎么弄成自己的ppt?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
深圳网站制作培训,深圳哪些招聘网站比较好?
无锡营销型网站制作公司,无锡网选车牌流程?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup

