剖析Linux系统调用的过程

假设我们编写应用程序有一个read系统调用,下面来看看是如何从很多file_operations结构中寻找到对应的read。

我们可以利用反汇编arm-Linux-objdump -D -S  xxx >dump,输出到dump文件,打开dump文件,定位到read汇编处,有下面一句:

bl   <_libc_read>

好,接着去_libc_read汇编处,发现最重要的两行汇编语句:

mov r7,#3             //read的系统调用号是3

svc 0x00000000      //系统调用入口

Linux有一个固定的系统调用的入口ENTRY(vector_swi),{可在entry-common.s文件 }

我们看看ENTRY(vector_swi)做了哪些事:

1)获得系统调用号,就是之前 mov r7,#3

2)跳转到sys_call_table表

adr tbl, sys_call_table     @ load syscall table pointer

找到sys_call_table表入口

ENTRY(sys_call_table)

#include "calls.S"                表定义在calls.S 文件中

打开calls.S,

call(sys_read)来调用,而sys_read在read-write.c里面通过宏定义的:

SYSCALL_DEFINE3宏定义作用,将read前面加sys变成sys_read

应用程序调用的open函数会创建一个file结构,然后下面的函数会通过fd,寻找对应file结构

file = fget_light(fd, &fput_needed);      //寻找对应file结构

--------------------------------------------------------------

loff_t pos = file_pos_read(file);            //读取fops,文件指针位置

--------------------------------------------------------------

ret = vfs_read(file, buf, count, &pos);   //调用vfs_read

最有用的是:

if (file->f_op->read)

ret = file->f_op->read(file, buf, count, pos);

找到file结构里面的file_operations函数结构的read

调用完,最后 file_pos_write(file, pos);回写fops保存

时间: 2024-10-08 19:08:05

剖析Linux系统调用的过程的相关文章

《Linux设计与实现》笔记——系统调用工作原理、添加系统调用的过程

系统调用的意义 为了和用户空间上的进程进行交互,内核提供的提供的一组接口. 应用程序通过这组接口访问硬件和其他操作系统资源. 完成对硬件和资源访问的控制.安全.可靠,多任务.虚拟必须 硬件设备的抽象(提供设备的独立性). 异常,陷入,系统调用 : 用户空间进入内核空间的三种方式 原理 sys_write会根据系统write输出的文件,调用相应struct file ,operations中的write方法. 添加系统调用的过程 以kernel 2.6.11为例 long my_syscall(i

深入剖析Linux IO原理和几种零拷贝机制的实现

深入剖析Linux IO原理和几种零拷贝机制的实现 来源 https://zhuanlan.zhihu.com/p/83398714 零壹技术栈      公众号[零壹技术栈] 前言 零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及 CPU 的拷贝时间.它的作用是在数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现 CPU 的零参与,彻底消除 CPU 在这方面的负载.实现零拷贝

动静结合学内核之 linux 系统调用浅析

刘柳 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 直入主题 实验过程1-增加新的菜单 update the menu //git cone Uhange main.c //注册菜单函数 Add the chmodC ,chmodASM //菜单函数的实现 Make rootfs //激动人心的时刻,进入menuos调用我们新函数 chmodASM代码 讲述调用chmod系统调

Linux系统调用探究(上)

:first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 15px; } h1 { text-transform: uppercase; font-weight: bold; border-bottom: 1px solid; } h2 { border-bottom: 1px solid; } h3, h4, h5, h6 { border-bottom: none; } html * { color:

linux文件系统写过程简析

linux写入磁盘过程经历VFS ->  页缓存(page cache) -> 具体的文件系统(ext2/3/4.XFS.ReiserFS等) -> Block IO ->设备驱动 -> SCSI指令(或者其他指令),总体来说linux文件写入磁盘过程比较复杂 1.VFS(虚拟文件系统) Linux中采用了VFS的方式屏蔽了多个文件系统的差别, 当需要不同的设备或者其他文件系统时,采用挂载mount的方式访问其他设备或者其他文件系统(这里可以把文件系统理解为具体的设备).正是

添加新的linux系统调用

上一篇详细解释了linux系统调用的原理,接下来根据上一篇的原理简单介绍如何创建新的linux系统调用 向内核中添加新的系统调用,需要执行3个步骤: 1. 添加新的内核函数 2. 更新头文件unistd.h 3. 针对这个新函数更新系统调用表calls.S 1. 在kernel/sys.c中添加函数: asmlinkage int sysMul(int a, int b) { int c; c = a*b; return c; } 2.在arch/arm/include/asm/unistd.h

[Linux]系统调用理解(1)

本文是Linux系统调用专栏系列文章的第一篇,对Linux系统调用的定义.基本原理.使用方法和注意事项大概作了一个介绍,以便读者对Linux系统调用建立一个大致的印象. 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用程序中调用它们.从某种角度来看,系统调用和普通的函数调用非常相似.区别仅仅在于,系统调用由操作系统核心提供,运行于核心态:而普通的函数调用由函数库或用户自己提供,运行于用户态.二者在使用方式上也有相似之处,

Linux系统调用--getrlimit()与setrlimit()函数详解

http://www.cnblogs.com/niocai/archive/2012/04/01/2428128.html 功能描述:获取或设定资源使用限制.每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值.非授权调 用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制.授权进程可以任意改变其软硬限制.RLIM_INFINITY的 值表示不对资源限制. 用法: #include <sys/resource.h>int getr

linux系统调用、buffered IO、unbuffered IO

1.什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用. Linux的系统调用作为c库的一部分提供,用户可以通过系统调用命令在自己的应用程序中调用它们. #include <linux/unistd.h> /* all system calls need this header */. 2.系统调用与一般库函数的区别 一般库函数始终运行在用户态,而系统调用要通过int 0x80语句陷入内核态,该系统调用实现的功能实际上是由对应的内核的函数来完成. 3.系统调