首页
学习
活动
专区
圈层
工具
发布

【高级编程】Linux read系统调用

最近一个项目做了一个模拟u盘的设备,但是在read虚拟u盘的内容时必须每次都从磁盘内读取,而不是从系统的cache中读取,由于这个问题,就查资料看了下read的系统调用,以及文件系统的一些内容。...一句话,系统调用是内核给用户空间提供的一个可以访问内核资源的一个接口。 另外多说一句,从用户进程切换到内核进程只有两种方式,一种就是系统调用,另一种是中断。...例如read系统调用,0x80 中断处理程序接管执行后,先检查其系统调用号,然后根据系统调用号查找系统调用表,并从系统调用表中得到处理 read 系统调用的内核函数 sys_read ,最后传递参数并运行...至此,内核真正开始处理 read 系统调用(sys_read 是 read 系统调用的内核入口)。...之后,函数 sys_read 可以返回了。最终 read 系统调用也可以返回了。 至此, read 系统调用从发出到结束的整个处理过程就全部结束了。

7.1K110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    GDB调试-从入门实践到原理

    写在前面 在我的工作经历中,前几年在Windows上进行开发,使用Visual Studio进行调试,简直是利器,各种断点等用鼠标点点点就能设置;大概从12年开始转Linux开发了,所以调试都是基于GDB...为了支持多进程调试,从GDB版本7.0开始支持单独调试(调试父进程或者子进程)和同时调试多个进程。 那么,我们该如何调试子进程呢?我们可以使用如下几种方式进行子进程调试。...:子进程,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在Linux系统中fork()系统调用成功会返回两次,一次在父进程,一次在子进程 (gdb) show follow-fork-mode...gdb 通过系统调用 ptrace 来接管一个进程的执行。ptrace 系统调用提供了一种方法使得父进程可以观察和控制其它进程的执行,检查和改变其核心映像以及寄存器。...❝本文从构思到完成,大概用了三周时间,写作过程是痛苦的(需要整理资料以及构建各种场景,以及将各种现场还原),同时又是收获满满的。通过本文,进一步加深了对GDB的底层原理理解。

    3.9K30

    GDB 调试 .NET 程序实录 - .NET 调用 .so 出现问题怎么解决

    p=1388 https://www.geeksforgeeks.org/core-dump-segmentation-fault-c-cpp/ 由于这个问题是内核级别的,所以可以从系统日志中找到详细的日志信息....so 文件剥调试信息 在 linux中, strip 命令具体就是从特定文件中剥掉一些符号信息和调试信息,可以使用以下步骤的命令,将调试信息从 .so 文件中剥出来。...gdb --args dotnet /***/***.dll 或者 gdb dotnet ... # 进入GDB 后 set args /***/***.dll 查看调用栈信息 以下两个 gdb 命令都可以查看当前调用堆栈信息...,如果程序在调用某个函数时崩溃退出,则执行这些命令,会看到程序终止时的函数调用堆栈。...发现还是结果还是一样~~~没办法了,算了~ 查看所有线程的调用堆栈信息 gdb 的下 thread 命令可以查看所有线程调用堆栈的信息。 thread apply all bt ?

    1.8K40

    从源码透析gRPC调用原理

    其中,greet_client和greet_server文件中分别是grpc客户端和服务端的业务调用代码,包含了一个标准的gRPC调用过程。...总的来看,调用的过程基本就是分为三步: 创建connection 创建业务客户端实例 调用RPC接口 { ... // 创建connection conn, err := grpc.Dial(address...func WithBalancer() DialOption func WithInsecure() DialOption func WithCodec() DialOption 根据client的需求,调用方在调用...: grpc server graph.jpg 总结 上面的就是关于gRPC调用逻辑的分析,gRPC中的代码十分复杂,本文只涉及了其调用逻辑的分析,在分析展示源码时,省略的一些错误处理或者数据处理的代码...,而侧重于逻辑调用的过程,从而在使用gRPC的时候可以更好的理解其原理。

    19K126

    从栈上理解 Go语言函数调用

    0x000f 00015 (main.go:3) SUBQ $32, SP 在执行栈上调用的时候由于栈是从内存地址高位向低位增长的,所以会根据当前的栈帧大小调用SUBQ $32...综上在函数调用中,关于参数的传递我们可以知道两个信息: 参数完全通过栈传递 从参数列表的右至左压栈 下面是调用 add 函数之前的调用栈的调用详情: [call stack] 当我们准备好函数的入参之后...小结以下栈的调用规则: 参数完全通过栈传递 从参数列表的右至左压栈 返回值通过栈传递,返回值的栈空间在参数之前 函数调用完毕后,调用方(caller)会负责栈的清理工作 结构体方法:值接收者与指针接收者...AX 里读到内存地址,从内存地址里拿到值,再读到AX 0x0011 00017 (main.go:22) ADDQ "".factor+16(SP), AX ;;...AX 里读到内存地址值+8 ,然后从内存地址里拿到值,再读到AX 0x002b 00043 (main.go:23) ADDQ "".factor+16(SP), AX

    2.8K30

    Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试

    这篇文章旨在为读者提供一站式的 Linux 工具指南,从软件包管理 (apt) 到编译器 (gcc/g++)、自动化构建工具 (make),再到调试器 (gdb),我们将以清晰、系统化的方式为您逐步解析这些工具的功能和使用方法...rz (receive zmodem): 用于从本地上传文件到远程服务器。 sz (send zmodem): 用于从远程服务器下载文件到本地。...n(next):逐过程,单条执行,当有函数调用时,不会进入函数内部。 我们接着上面的代码走。 s(step):逐语句,进入函数调用。 p 变量:打印变量的值。...4.3 常用 GDB 指令表 命令 缩写 功能描述 示例 运行与调试控制 run r 启动程序并运行 run arg1 arg2 start 无 从程序入口运行并暂停在main start continue...c 恢复程序运行直到下一个断点 continue step s 单步执行(进入函数调用) step next n 单步执行(跳过函数调用) next finish 无 运行到当前函数返回 finish

    1K10

    Linux内核级木马与病毒攻防:基础工具介绍

    我们后面开发代码或调试分析其他病毒或木马的设计模式和原理时,必须使用gdb作为手术刀,对要研究的病毒和木马进行”剖尸检验“,通过gdb调查木马或病毒的代码设计方法,同时也使用gdb加载恶意代码,研究其运转流程...还有一个强力工具叫strace,它能追踪程序对系统API的调用情况,甚至能发现程序从文件中读取了那些数据,首先构建一个名为hello.txt的文本文件,里面包含一行字符串:“hello world!”...,然后创建sys_read.c,在里面调用系统接口open和read来读取文件内容: void main() { int fd = open("hello.txt", O_RDONLY);...如前那样将其编译成格式为elf的可执行文件sys_read,接着调用如下命令: strace -c ..../sys_read 然后可以看到如下信息,其中展示了程序对系统接口的调用情况统计: ? 使用如下命令可以查看程序在调用系统API Read 时读入的数据: strace -e read .

    1.9K10

    GDB的那些奇淫技巧

    这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程。...这两种方式是有区别的,注意示例程序中 read 调用会提前返回,所以如果我们想要第一次读取3个字符,第二次读取4个字符的话,就不能一次性全部输入。...) argv[0] = /pwn/demo first read: 7 second read: 0 正确的方式应该是这样: $ gdb demo (gdb) run < <(echo -n 111;...杀死某个进程 set detach-on-fork on/off 设置当进程调用fork时gdb是否同时调试父子进程 set follow-fork-mode parent/child 设置当进程调用...define command ... end 定义用户命令 直接按回车执行上一条指令 shell {command} [args] 执行 shell 命令 source {file} 从文件加载

    1.9K20

    MySQL DBA如何利用stracepstackgdb来定位问题

    strace简介 strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用。 Strace是一个简单的跟踪系统调用执行的工具。...在其最简单的形式中,它可以从开始到结束跟踪二进制的执行,并在进程的生命周期中输出一行具有系统调用名称,每个系统调用的参数和返回值的文本行。...常用命令 info threads:查看全部线程 thread n:指定某个线程 b:在某处打断点 c:继续往下走 s:执行一行代码,如果代码函数调用,则进入函数 n:执行一行代码,函数调用不进入 p:...info thread查看所有线程,这个时候我从另外一个会话连接到了MySQL,我从pfs.threads查寻到这个会话的LWP值为513,那么我可以通过thread 41切换到这个线程 (gdb) info...*/ (gdb) n 1056 MYSQL_NET_READ_DONE(0, len); (gdb) n 1058 } (gdb) n Protocol_classic::read_packet

    2.5K40
    领券