linux/arch/arm/kernel/call.S

...
CALL(sys_read)
CALL(sys_write)
CALL(sys_open)
CALL(sys_close)
...
 
以read,write接口举栗子:
linux/fs/read_write.c
 
SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
     struct file *file;
     ssize_t ret = -EBADF;
     int fput_needed;

file = fget_light(fd, &fput_needed);     // 获取到  struct file
     if (file) {
          loff_t pos = file_pos_read(file);          //获取文件指针的position
          ret = vfs_read(file, buf, count, &pos);     // read file
          file_pos_write(file, pos);                    //保存文件指针的position
          fput_light(file, fput_needed);          // 写回 struct file
     }

return ret;
}

SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#ifdef CONFIG_FTRACE_SYSCALLS
     ...
#else
#define SYSCALL_DEFINEx(x, sname, ...)                    \
     __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
#endif
 
===SYSCALL_DEFINEx(3, _read, unsigned int, fd, char __user *, buf, size_t, count)
===__SYSCALL_DEFINEx(3,_read, unsigned int, fd, char __user *, buf, size_t, count)
 
#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
     ......
#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */

#define SYSCALL_DEFINE(name) asmlinkage long sys_##name
#define __SYSCALL_DEFINEx(x, name, ...)                         \
     asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))

#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */

 
===asmlinkage long sys_read(__SC_DECL3(unsigned int, fd, char __user *, buf, size_t, count))
 
#define __SC_DECL1(t1, a1)     t1 a1
#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__)
#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__)
#define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__)
#define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__)
#define __SC_DECL6(t6, a6, ...) t6 a6, __SC_DECL5(__VA_ARGS__)
 
===__SC_DECL3(unsigned int, fd, char __user *, buf, size_t, count)
     ===>unsigned int fd, __SC_DECL2(char __user *, buf, size_t, count)
     ===>unsigned int fd, char __user * buf,  __SC_DECL1(size_t, count)
     ===>unsigned int fd, char __user * buf,  size_t count
 
===asmlinkage long sys_read(__SC_DECL3(unsigned int, fd, char __user *, buf, size_t, count))
     ===>asmlinkage long sys_read(unsigned int fd, char __user * buf,  size_t count)
 
===============
ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
{
     ssize_t ret;

if (!(file->f_mode & FMODE_READ))     //权限检测
          return -EBADF;
     if (!file->f_op || (!file->f_op->read && !file->f_op->aio_read)) //检测fop是否存在,驱动read接口是否实现
          return -EINVAL;
     if (unlikely(!access_ok(VERIFY_WRITE, buf, count)))     //检测用户空间的buf是否可写
          return -EFAULT;

ret = rw_verify_area(READ, file, pos, count);     //检测file文件,pos开始的count个字节的区域是否可读
     if (ret >= 0) {
          count = ret;
          if (file->f_op->read)
               ret = file->f_op->read(file, buf, count, pos);     //调用相应驱动注册的read接口
          else
               ret = do_sync_read(file, buf, count, pos);
          if (ret > 0) {
               fsnotify_access(file);
               add_rchar(current, ret);
          }
          inc_syscr(current);
     }

return ret;
}

文件操作接口的系统调用分析---SYSCALL_DEFINEx的更多相关文章

  1. Linux 文件操作接口

    目录 Linux 文件操作接口 C语言文件操作接口 C语言文件描述 fopen() r模式打开文件 w模式打开文件 a模式打开文件 其他模式类似 fclose() fwrite() fread() 系 ...

  2. 关于文件的INode与Java中的文件操作接口

    本文由作者周梁伟授权网易云社区发布. 近日做的项目中涉及到多进程共同读写多个文件的问题,文件名和最后修改时间都是可能会被频繁修改的,因而识别文件的唯一性会产生相当的麻烦,于是专门再学习了一下文件系统对 ...

  3. ioctl、文件操作接口函数以及nand的升级模式的操作过程详解

    概述 内核中驱动文件的操作通常是通过write和read函数进行的,但是很多时候再用户空间进行的操作或许不是内核中公共代码部分提供的功能,此时就需要使用一种个性化的方法进行操作--ioctl系统调用. ...

  4. 【Python】 高级文件操作 shutil

    shutil 很多时候,我想要对文件进行重命名,删除,创建等操作的时候的想法就是用subprocess开一个子进程来处理,但是实际上shutil可以更加方便地提供os的文件操作接口,从而可以一条语句搞 ...

  5. day4-基础 字符串操作,文件操作,字符转编码

    1.字符串用法 name = 'daniel' print(name.capitalize()) #首字母大写 >>>daniel print(name.count('a')) #统 ...

  6. python3.x Day3 文件操作

    文件操作:操作文件实际是4步骤1.描述文件是哪个 2.打开文件 3.操作文件 4.关闭文件 1.打开文件使用open方法,代码举例: data=open("wait_you",en ...

  7. (六)文件操作的主要接口API

    1.什么是操作系统API (1)API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用. (2)应用层程序通过调用API来调用操作系统中的各种功能,来干活. (3)学习一个操作系统 ...

  8. Linux C高级编程——文件操作之系统调用

    Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神是无限的.           库函数是一些完毕特定功能的函数.一般由某个标准组织制作公布,并形成一定的标准.使用库函数编 ...

  9. Linux C 文件操作,系统调用 -- open()、read() 和 标准I/O库 -- fopen()、fread()

    函数汇总: open().write().read().close() fopen().fwrite().fread().fclose() 一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件 ...

随机推荐

  1. [BZOJ 1499] 瑰丽华尔兹

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 Solution : 能立即发现这是和动态规划相关的题目 令f[t][i][j]表 ...

  2. 【单调队列】bzoj2096 [Poi2010]Pilots

    用两个单调队列维护序列中的最大值和最小值即可. poi~ #include<cstdio> #include<algorithm> using namespace std; i ...

  3. Matlab设置Legend横排、分块

    高级用法1:指定legend显示的位置: legend({'str1','str2','strn'},'Location','SouthEast'); 比较鸡肋,画好图后树手动拖动就好了 高级用法2: ...

  4. SpringBoot定时任务(Spring Schedule )实现方法

    FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss"); fdf.format(new Dat ...

  5. 修改nvm镜像地址

    最近几个项目切换开发要求Node版本不一样,没法运行.需要用nvm或n等来管理node版本,选谁见仁见智了,反正我选了nvm. 下载个node慢得要死,等半天结果还失败,真是窝火.官方文档又详细过了一 ...

  6. 12、Django简易框架

    安装:  tar -zxvf Django-1.5.1.tar.gz   cd Django-1.5.1 [root@likun Django-1.5.1]# ls [root@likun Djang ...

  7. Unity Low-level Native Plugin Interface

    https://docs.unity3d.com/Manual/NativePluginInterface.html 拿unity底层graphics device

  8. 蒙皮 skin

    http://help.autodesk.com/view/MAYAUL/2016/CHS/?guid=GUID-EFE68C08-9ADA-4355-8203-5D1D109DCC82 skin:顶 ...

  9. RDD编程 上(Spark自学三)

    弹性分布式数据集(简称RDD)是Spark对数据的核心抽象.RDD其实就是分布式的元素集合.在Spark中,对数据的操作不外乎创建RDD.转化已有RDD以及调用RDD操作进行求值.而在这一切背后,Sp ...

  10. autoconfig.xml与antx.properties一级application.properties之间的关系

    Java web项目中一般都有配置文件,文件中包含一些配置信息供Java工程启动和运行时使用,这些常见的配置文件大都是一些以.properties后缀的文件,比如常见的antx.properties以 ...