在用户程序调用read、write等系统调用时,linux内核发生了哪些动作呢。下面以write为例:

调用write系统调用,进入C库执行write函数,就是产生了一个int 0X80的一个中断,这样程序就会进入内核态,中断会根据_NR_name来判断执行那个内核函数,他其实就是int 0X80的一个参数。处理好现场后进入系统调用表:

所以wirte函数,具体的功能就是,触发int80中断,进行系统调用,调用号是__NR_write(#define __NR_write 4),最终会调用数组sys_call_table[4], 也就是sys_write

### int 0x80 - linux系统调用入口点(调用中断int 0x80,eax 中是调用号)
.align 2
system_call:cmpl $nr_system_calls-1,%eax    # 调用号如果超出范围的话就在eax中置-1并退出ja bad_sys_callpush %ds                        # 保存原段寄存器值push %espush %fs
# 一个系统调用最多可带有3个参数,也可以不带参数。下面入栈的ebx、ecx和edx中放着系统
# 调用相应C语言函数的调用函数。这几个寄存器入栈的顺序是由GNU GCC规定的,
# ebx 中可存放第1个参数,ecx中存放第2个参数,edx中存放第3个参数。
# 系统调用语句可参见头文件include/unistd.h中的系统调用宏。pushl %edxpushl %ecx      # push %ebx,%ecx,%edx as parameterspushl %ebx       # to the system callmovl $0x10,%edx     # set up ds,es to kernel spacemov %dx,%dsmov %dx,%es
# fs指向局部数据段(局部描述符表中数据段描述符),即指向执行本次系统调用的用户程序的数据段。
# 注意,在Linux 0.11 中内核给任务分配的代码和数据内存段是重叠的,他们的段基址和段限长相同。movl $0x17,%edx      # fs points to local data spacemov %dx,%fs
# 下面这句操作数的含义是:调用地址=[_sys_call_table + %eax * 4]
# sys_call_table[]是一个指针数组,定义在include/linux/sys.h中,该指针数组中设置了所有72
# 个系统调用C处理函数地址。call sys_call_table(,%eax,4)        # 间接调用指定功能C函数pushl %eax             
//系统调用表
fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,
sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,
sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,
sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,
sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,
sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,
sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,
sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,
sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,
sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,
sys_setreuid,sys_setregid };
#define __NR_setup  0   /* used only by init, to get system going */
#define __NR_exit   1
#define __NR_fork   2
#define __NR_read   3
#define __NR_write  4
#define __NR_open   5
#define __NR_close  6
#define __NR_waitpid    7
#define __NR_creat  8
#define __NR_link   9
#define __NR_unlink 10
#define __NR_execve 11
#define __NR_chdir  12
#define __NR_time   13
#define __NR_mknod  14
#define __NR_chmod  15
#define __NR_chown  16
#define __NR_break  17
#define __NR_stat   18
#define __NR_lseek  19
#define __NR_getpid 20
#define __NR_mount  21
#define __NR_umount 22
#define __NR_setuid 23
#define __NR_getuid 24
#define __NR_stime  25
#define __NR_ptrace 26
#define __NR_alarm  27
#define __NR_fstat  28
#define __NR_pause  29
#define __NR_utime  30
#define __NR_stty   31
#define __NR_gtty   32
#define __NR_access 33
#define __NR_nice   34
#define __NR_ftime  35
#define __NR_sync   36
#define __NR_kill   37
#define __NR_rename 38
#define __NR_mkdir  39
#define __NR_rmdir  40
#define __NR_dup    41
#define __NR_pipe   42
#define __NR_times  43
#define __NR_prof   44
#define __NR_brk    45
#define __NR_setgid 46
#define __NR_getgid 47
#define __NR_signal 48
#define __NR_geteuid    49
#define __NR_getegid    50
#define __NR_acct   51
#define __NR_phys   52
#define __NR_lock   53
#define __NR_ioctl  54
#define __NR_fcntl  55
#define __NR_mpx    56
#define __NR_setpgid    57
#define __NR_ulimit 58
#define __NR_uname  59
#define __NR_umask  60
#define __NR_chroot 61
#define __NR_ustat  62
#define __NR_dup2   63
#define __NR_getppid    64
#define __NR_getpgrp    65
#define __NR_setsid 66
#define __NR_sigaction  67
#define __NR_sgetmask   68
#define __NR_ssetmask   69
#define __NR_setreuid   70
#define __NR_setregid   71

根据参数得到调用的sys_write执行。之后根据fd来找到文件的inode节点,判断是哪种文件,执行相应的操作。

int sys_write(unsigned int fd,char * buf,int count)
{struct file * file;struct m_inode * inode;if (fd>=NR_OPEN || count <0 || !(file=current->filp[fd]))return -EINVAL;if (!count)return 0;inode=file->f_inode;if (inode->i_pipe)return (file->f_mode&2)?write_pipe(inode,buf,count):-EIO;if (S_ISCHR(inode->i_mode))return rw_char(WRITE,inode->i_zone[0],buf,count,&file->f_pos);if (S_ISBLK(inode->i_mode))return block_write(inode->i_zone[0],&file->f_pos,buf,count);if (S_ISREG(inode->i_mode))return file_write(inode,file,buf,count);printk("(Write)inode->i_mode=%06o\n\r",inode->i_mode);return -EINVAL;
}

总结如下图:

linux系统调用过程相关推荐

  1. 详解Linux系统调用过程

    Linux系统调用的层次如下: 用户程序-------->C库(即API):INT 0x80------------>system_call------------>系统调用服务例程 ...

  2. Linux系统调用过程(Linux0.11内核实验)

    什么是系统调用呢? 系统调用和普通函数调用得区别: 普通函数调用:调用自定义函数是通过call指令直接跳转到该函数的地址,继续运行. 系统调用:调用一个系统得API(Application progr ...

  3. 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )

    文章目录 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) 二.内存管理流程 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) " 堆内存 " ...

  4. Linux 系统调用的执行过程

    什么是系统调用 系统调用 (在 Linux 中常称为 syscalls ) 是应用程序访问硬件设备之间的桥梁. 系统调用层为用户空间提供一种硬件的抽象接口,使得用户不用关注设备的具体信息,同时系统调用 ...

  5. 操作系统原理,系统调用,系统调用与库函数API等函数之间的调用关系,功能与机制设计,系统调用的执行过程与Linux系统调用执行示例,不同操作系统下的PCB

    操作系统原理,系统调用,功能与机制设计,系统调用的执行过程与Linux系统调用执行示例,不同操作系统下的PCB 一.系统调用:操作系统功能调用,用户在编程时可以调用的操作系统功能. 1.系统调用是操作 ...

  6. linux 系统调用 hook 总结

    1. 系统调用Hook简介 系统调用属于一种软中断机制(内中断陷阱),它有操作系统提供的功能入口(sys_call)以及CPU提供的硬件支持(int 3 trap)共同完成. 我们必须要明白,Hook ...

  7. Linux系统调用的实现机制分析

    [摘要]本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口有怎样的关系.然后,我们考察了内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递系统调用号和 ...

  8. linux系统调用挂钩方法总结

    相关学习资料 http://xiaonieblog.com/?post=121 http://hbprotoss.github.io/posts/li-yong-ld_preloadjin-xing- ...

  9. Linux系统调用及其效率

    操作系统相关概念: 操作系统---管理计算机硬件与软件资源的软件,是用户与系统操作交互的接口,为在它上面运行的程序提供服务. 操作系统内核 ----操作系统的核心.负责管理系统的进程.内核.设备驱动程 ...

最新文章

  1. 33 张图详解 RSTP 、MSTP、替代技术
  2. tomcat启动卡死在: Initializing Spring root WebApplicationContext的解决办法
  3. express细节点注意
  4. Android不是内部或外部指令
  5. [改善Java代码]覆写equals方法必须覆写hashCode方法
  6. [转载]LEB128格式简介(CN)
  7. [SQLite]使用记录
  8. 多功能视频光端机_多业务光端机的功能特性
  9. java写入carbondata_Carbondata使用过程中遇到的几个问题及解决办法
  10. 前端工程化-webpack-cli(官方开发中。。。)
  11. Atitit 软件开发基本法 目录 1. 第一章 总纲(包含各大原则 定律 法则) 1 2. 爱提拉的原则 3 2.1. 简单原则 KISS 3 2.2. 提升可读性 面向人类编程 而不是面向机
  12. 机械相关专业词汇集锦
  13. 主成分分析spss_主成分分析
  14. 数据杂谈:大数据之ETL(数据抽取,转换何加载)
  15. 是什么门的缩写_什么是FBA
  16. [复现论文程序图]High Speed Continuous Variable Source-Independent Quantum Random Number Generation...
  17. 关于嵌入式高端ARM核心板设计风格优缺点分析(作者:gooogleman)
  18. Python制作动态桌面壁纸程序-摆脱付费-Mili_Wallpaper
  19. linux命令中 root@ubuntu:/# 与 root@ubuntu:~# 区别
  20. nifty_Nifty JUnit:在方法和类级别上使用规则

热门文章

  1. 扫雷游戏分析实现(完整代码)
  2. 使用 Styled Components 编写样式化组件
  3. Eclipse SWT StyleTextProgressBar(八)
  4. nodejs有对表格进行美化的库吗
  5. qt中实现防止重复点击的操作
  6. 加菲猫语录,只准笑不准学
  7. 聊天机器人伪装成真人的10种伎俩
  8. 浙江大学计算机学院合作框架,中国农科院与浙江大学“云签署”战略合作框架协议...
  9. SDF(Signed-distance-field: 有向距离场)(6): 空间复制(repeat)(生成大规模显示对象)
  10. 什么是脚本,脚本是什么