系统调用system_call处理过程

原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

作者:严哲璟

linux的系统调用的过程:

ENtry_32.S

1.enter system_call

2.push eax 保存eax的值,因为此值与系统调用有关

3.SAVE_ALL  ,保存现场

4.比较系统调用号eax和NR_systemcall,如果这是一个合法的系统调用则执行调用符号表syscall_table

5.根据eax寻找到系统调用号对应的系统调用函数,用内核函数进行处理,如sys_time,sys_read等.

6.内核函数返回后,先不急着切换回用户态,而是检查此时是否需要进程调度,如果需要,则跳转进程调度函数.

7.若不需要调度,则返回用户态进程.

原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

作者:严哲璟

linux的系统调用的过程:

ENtry_32.S

1.enter system_call

2.push eax 保存eax的值,因为此值与系统调用有关

3.SAVE_ALL  ,保存现场

4.比较系统调用号eax和NR_systemcall,如果这是一个合法的系统调用则执行调用符号表syscall_table

5.根据eax寻找到系统调用号对应的系统调用函数,用内核函数进行处理,如sys_time,sys_read等.

6.内核函数返回后,先不急着切换回用户态,而是检查此时是否需要进程调度,如果需要,则跳转进程调度函数.

7.若不需要调度,则返回用户态进程.

总结:系统调用是一种特殊的中断,不需要外部硬件等信号即可进入内核态,转入中断服务程序.即system_call,在用户态时处于进程上下文,在内核态调用中断服务程序后,进入中断处理程序,此时处于中断上下文,返回用户态之前需要检查是否需要进程调度,因为此时可能有更需要处理的程序(用户态优先级更高的程序或者是内核强制抢占)需要处理.

时间: 2025-01-02 03:58:38

系统调用system_call处理过程的相关文章

通过系统调用分析system_call中断处理过程

罗冲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1. 实验准备 1.1 环境准备 下载linux3.18.6的源代码. 按照http://mooc.study.163.com/learn/USTC-1000029000?tid=2001214000#/learn/content?type=detail&id=2001400011给出步骤进行编译 # 下载内核源代码编

实验5 :分析system_call中断处理过程

分析system_call中断处理过程 上周我们使用gcc内嵌汇编调用系统调用,这次我们具体分析下过程. 将getpid嵌入menuos 代码从github下载,步骤如下: 1. 增加一个函数,getpid 2. 在main中添加MenuConfig("getpid","Show Pid", Getpid); 3. 重新编译 make roofs 4. 此时启动 执行getpid就可以看到打印出pid为1   menuos的原理 其实这个很简单,在上上周我们分析过l

实验五:分析system_call中断处理过程

原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 题目自拟,内容围绕系统调用system_call的处理过程进行: 博客内容中需要仔细分析system_call对应的汇编代码的工作过程,特别注意系统调用返回iret之前的进程调度时机等. 总结部分需要阐明自己对“系统调用处理过程”的理解,进一步推广到一般的中断处理过程. 实验报告: 1.将myfork()和

Linux内核分析—实验五分析system_call中断处理过程

郑斌 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验要求: 使用gdb跟踪分析一个系统调用内核函数(您上周选择的那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl ,推荐在实验楼Linux虚拟机环境下完成实验. 根据本周所学知识分析系

《Linux内核分析》 week6作业-Linux内核fork()系统调用的创建过程

一.进程控制块PCB-stack_struct 进程在操作系统中都有一个结构,用于表示这个进程.这就是进程控制块(PCB),在Linux中具体实现是task_struct数据结构,它主要记录了以下信息: 状态信息,例如可执行状态.就绪状态.阻塞状态等. 性质,由于unix有很多变种,进行有自己独特的性质. 资源,资源的链接比如内存,还有资源的限制和权限等. 组织,例如按照家族关系建立起来的树(父进程.子进程等). task_struct结构体内容非常庞大,暂时没有去分析源代码,以后有时间再去研究

系统调用system_call的处理过程

朱秀秀 原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 通常,在OS的核心中都设置了一组用来实现各种系统功能的子程序(过程),并把它们提供给用户调用,每当用户在需要系统提供某种服务的时候,就可以利用系统调用指令去调用系统过程.在调用系统过程之后,程序运行就由用户态转到内核态,相应的栈也由用户栈,转到内核栈,并且进行了相当于保护现场的工作,把当前的状态,栈顶指针,cs:eip保存到内核栈

分析system_call中断处理过程

李亚健    <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程: 使用gdb跟踪分析一个系统调用内核函数(上周选择的那一个系统调用) 1.进入实验楼环境,进入LinuxKernel: rm menu -rf git clone https://github.com/mengning/menu.git  从github中克隆 cd menu make rootfs 2.给menuOS增加自己的内容:

system_call中断处理过程

使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl ,推荐在实验楼Linux虚拟机环境下完成实验. 根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图,

Linux内核system_call中断处理过程

在相应的test.c中添加getpid和getpid-asm的函数,使Menu实现getpid和getpid-asm的命令. 添加完成后,修改menu目录下的Makefile文件中的 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img变为qemu-system-i386 -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 然后执行在menu目录