深入理解Linux系统调用
1、系统调用号查询
我的学号位数是08,在64位调用表里可以查到对应的系统调用函数是__x64_sys_lseek

2、lseek函数
由于没用过该函数,所以先去了解一下这个函数的作用:

直白的说就是用来移动文件指针,演示一下(c语言调用lseek库函数)

可以看到图片里我输出了两次a.txt文本里的内容
第一次是从头开始输出的,第二次这是将指针从开头移动了30个位移量,返回结果result 也为30,输出的结果自然也和第一次不一样了。
3、汇编语言调用

在64位系统中,参数的传递不再使用ebx ecx edx等寄存器了
而是使用rdi、rsi、rdx寄存器传递参数,
rdi传递第一个参数file,也就是文件描述符,%1表示第一个输入,表示后面的"m"(file)
rsi传递第二个参数offset,我直接设置成了30
rdx传递第三个参数position,传入0表示从文件开始开始移动
后传入系统调用号0x08至eax,并执行syscall
结果返回至result变量中
4、gdb调试和分析
由于要在内核下进行调试分析,所以得使用busybox为内核制作一个根文件系统
并将c文件使用静态编译后
gcc -o myfile myfile.c -static
放入rootfs/home下,以便后续执行

接着先开启一个terminal,输入命令:
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd rootfs.cpio.gz -S -s -nographic -append "console=ttyS0"
然后在开启一个terminal,依次输入
gdb vmlinux target remote:1234
如图,并打上断点:
b __x64_sys_lseek

可以看到这个函数在fs/read_write.c文件里的第322行,用vscode打开查看下函数

可以看见有两个SYSCALL_DEFIND3和一个SYSCALL_DEFIND5,都是lseek相关的
但本次使用的是第322行的SYSCALL_DEFIND3调用(跟后面并无太大区别,后面的SYSCALL_DEFIND3只是使用了宏,有使用条件)
随后执行ksys_lseek函数,该函数执行:
1、检查文件标识符是否存在,其次调用vfs_llseek(....args)函数开始移动文件指针
vfs_llseek(....args)函数如下:

最后返回一个off_t类型的retval结果,off_t在linux64位下即long int类型
从代码中我们可以看出,如果偏移量没有超出文件范围或者第三个参数位置传递无误的话
返回的retval刚好等于我们移动的指针偏移量

在前面的运行结果中也刚好等于30
接着我们运行home文件夹下的myfile可执行文件

可以看到并没有任何输出,被阻塞在了SYSCALL_DEFINE3函数调用上
我们可以使用n 命令单步执行, bt查看堆栈

可以看到程序先去执行了entry_syscall_64函数
后common.c下执行了do_syscall_64函数
最后随着两个popq出栈指令,恢复了rdi和rsp寄存器,系统调用完成。
先来到entry_64.S文件

它在保存上下文信息和传递完参数后随即去执行do_syscall_64
接着去common.c中查看下do_syscall_64函数做了什么

可见它在sys_call_table表中拿到系统调用号后存入regs->ax中,后开始执行系统调用
也就是执行read_write里面的SYSCALL_DEFIND3,调用lseek移动文件指针
执行完后又回到do_syscall_64函数中,接下来要执行的 syscall_return_slowpath 函数要为恢复现场做准备。

执行完后又回到上一层的堆栈即entry_syscall_64函数

继续在vscode中查看entry_syscall_64后续的代码

可见后续的代码是在完成执行现场的恢复
最后的两个popq出栈指令恢复原 rdi 和 rsp的内容,也就是完成了堆栈的切换。
至此系统调用完成。
深入理解Linux系统调用的更多相关文章
- 理解Linux系统调用
目录 1.什么是系统调用 2.linux的系统调用 3.linux系统调用实现 1.什么是系统调用 系统调用,指的是操作系统提供给用户程序调用的一组特殊接口,用户程序可以根据这组接口获得操作系统内核的 ...
- [Linux]系统调用理解(1)
本文是Linux系统调用专栏系列文章的第一篇,对Linux系统调用的定义.基本原理.使用方法和注意事项大概作了一个介绍,以便读者对Linux系统调用建立一个大致的印象. 什么是系统调用? Linux内 ...
- [Linux]Linux系统调用列表
本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...
- 别出心裁的Linux系统调用学习法
别出心裁的Linux系统调用学习法 操作系统与系统调用 操作系统(Operating System,简称OS)是计算机中最重要的系统软件,是这样的一组系统程序的集成:这些系统程序在用户对计算机的使用中 ...
- 关于Linux系统调用,内核函数【转】
转自:http://blog.csdn.net/ubuntulover/article/details/5988220 早上听人说到某个程序的一部分是内核态,另一部分是用户态,需要怎么怎么.当时突然想 ...
- Linux系统调用(转载)
目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...
- 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口
Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...
- 理解 Linux 配置文件分类和使用
理解 Linux 配置文件分类和使用 本文说明了 Linux 系统的配置文件,在多用户.多任务环境中,配置文件控制用户权限.系统应用程序.守护进程.服务和其它管理任务.这些任务包括管理用户帐号.分配磁 ...
- UNIX环境高级编程——Linux系统调用列表
以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...
- Linux系统调用列表(转)
以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...
随机推荐
- MySQL Delete 表数据后,磁盘空间并未释放,为什么?
有开发小哥咨询了一个问题,记录一下处理过程分享给有需要的朋友.问题如下:MySQL数据库中有几张表增删比较频繁.数据变动剧烈且数据量大,导致数据增长过快,磁盘占用多.为了节约成本,定期进行数据备份,并 ...
- gateway 网关接口防篡改验签
gateway 网关接口防篡改验签 背景:为了尽可能降低接口在传输过程中,被抓包然后篡改接口内的参数的可能,我们可以考虑对接口的所有入参做签名验证,后端在网关依照相同的算法生成签名做匹配,不能匹配的返 ...
- Win10微软官方镜像iso文件下载
1.转到下载页面2.按F12后点击小窗口左上角的手机图标3:刷新页面开始下载(win10.iso:链接)
- (转).Net Web开发技术栈
作者:小曾出处:http://www.cnblogs.com/1996V/p/7700087.html 有很多朋友有的因为兴趣,有的因为生计而走向了.Net中,有很多朋友想学,但是又不知道怎么学,学什 ...
- react 富文本编辑器
5大富文本编辑器今天,富文本编辑器被用于许多应用中,包括简单的博客和复杂的内容管理系统.然而,选择一个并不容易,因为有很多具有不同功能的编辑器. 因此,在这篇文章中,我将评估5个React的富文本编辑 ...
- 物流扫码固定式扫描相机BXT-10M 自动分拣读码器 条码识别扫码器
物流扫码固定式扫描相机BXT-10M 自动分拣读码器 条码识别扫码器 VX : orihard2014 标签: 条码识别扫码器, 自动分拣读码器, 物流扫码固定式扫描相机, 物流扫码相机
- windows 批量杀进程
1 import psutil 2 from subprocess import Popen, PIPE 3 4 process_name ="bsmr.exe,fxclient.exe,F ...
- mybati之sql集合
mybatis 详解(五)------动态SQL - YSOcean - 博客园 (cnblogs.com) mybatis参数注入: 根据参数名称 使用#{} 注入参数 <insert id= ...
- python 发送 application/x-www-form-urlencoded 类型的数据包
在网上百度了很多,坑的要死,基本不咋好用,自己多尝试了几遍,成功实现了. data 的构建方式 data = f"page={page}&sign={sign}&t={t}& ...
- get 和 post 请求在缓存方面的区别
get 请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以 使用缓存. post 不同,post 做的一般是修改和删除的工作,所以必须与数据库交互,所以不能使用 缓存.因此 ge ...