标签:实时 ace int open 动作 sys 工作 ddr 模块
Linux内核主要由以下几个功能:进程管理、文件系统、IO体系结构和设备驱动程序、内存管理等。
在Linux中, 进程是系统资源分配的基本单位,也是使用CPU运行的基本调度单位。它实现了对进程的控制和调度。
进程管理的核心功能大致分为四类:控制,同步,通信,调度。
1.进程控制包括:
进程的创建、进程的终止、进程的阻塞与唤醒;
2.进程调度:先到先服务算法、最短作业优先调度、优先级调度、 轮转法调度、多级队列调度、多级队列反馈调度等。
一个进程的上下文(context)包括进程的状态、有关变量和数据结构的值、机器寄存器的值和PCB以及有关程序、数据等。
一个进程的执行是在进程的上下文中执行。
当正在执行的进程由于某种原因要让出处理机时,系统要做进程上下文切换,以使另一个进程得以执行。
当进行上下文切换时系统要首先检查是否允许做上下文切换(在有些情况下,上下文切换是不允许的,例如系统正在执行某个不允许中断的原语时)。然后,系统要保留有关被切换进程的足够信息,以便以后切换回该进程时,顺利恢复该进程的执行。在系统保留了CPU现场之后,调度程序选择一个新的处于就绪状态的进程、并装配该进程的上下文,使CPU的控制权掌握在被选中进程手中。
1.广义中断分为中断(也称硬件中断)和异常(也称软件中断)。
1.1中断来自来自 I/O 设备的信号,分为可屏蔽中断和不可屏蔽中断。
1.2异常分为陷阱 (trap),故障 (fault),终止 (abort)。
陷阱是有意的异常,如系统调用。故障是潜在可恢复的错误,如缺页异常,除0操作。
什么是(硬件)中断上半部和下半部?
将硬件中断处理分离成"上半部"和"下半部"两个阶段的机制:上半部指的是中断处理程序,在屏蔽中断的上下文中运行,用于完成关键性的处理动作;下半部指一种推后执行任务,不在中断服务上下文中执行。通常,下半部会在中断处理程序返回时立即执行。
软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果。很多情况下,软中断和"信号"有些类似,同时,软中断又是和硬中断相对应的,"硬中断是外部设备对CPU的中断","软中断通常是硬中断服务程序对内核的中断","信号则是由内核(或其他进程)对某个进程的中断"(《Linux内核源代码情景分析》第三章)。
软中断
1.通常是硬中断服务程序对内核的中断;
2.为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。
3. 软中断的处理非常像硬中断。然而,它们仅仅是由当前正在运行的进程所产生的。
硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。
硬中断是可屏蔽的,软中断不可屏蔽。硬中断处理程序称为上半部。
软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。
Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。
进程上下文是把系统提供给进程的处于动态变化的运行环境总和。
中断上下文它是一个内核控制路径,代表了中断发生时正在运行的进程执行。
//系统调用属于异常处理程序,运行在进程上下文。
//系统调用是通过叫software interruppt的软件中断(一种异常)来实现的,跟软中断(softirq)没有关系。
系统调用的过程:
xyz
,该函数是一个包装系统调用的库函数xyz
;xyz
负责准备向内核传递的参数,并触发软中断以切换到内核态;system_call
;sys_xyz
,真正开始处理该系统调用。在Linux中,一切都是文件,通过对文件的定义和操作来控制设备的执行和数据的存储。并且使用VFS虚拟文件系统,实现对多种文件系统的兼容。
要实现操作系统对其它各种不同文件系统的支持,就要将对各种不同文件系统的操作和管理纳入到一个统一的框架中。 对用户程序隐去各种不同文件系统的实现细节,为用户程序提供一个统一的、抽象的、虚拟的文件系统界面,这就是所谓的虚拟文件系统(VFS)。
Linux支持多种文件系统,包括ext2、ext3、 vfat、 ntfs、 iso9660、 jffs、 romfs和nfs等,为了对各类文件系统进行统一管理, Linux引入了虚拟文件系统VFS。
虚拟文件系统 VFS:
文件打开流程:
(1)打开文件即使用 open 函数,它首先通过按名查找,看在高速缓存中有没有查找的 inode,如果有那么对其进行引用并加 1。如果没有将创建新的 vfs的 inode 对象和目录项对象等;
(2)Open 函数调用的系统服务例程是 sys_open 函数,其接受的参数为文件目录和访问的模式。如果文件存在则返回一个文件描述符fd,如果不存在则返回-1.;
(3)Read 和write 函数分调用的服务例程是 sys_read 和 sys_write,接受三个参数。分别是一个文件描述符 fd,一个对数据缓存的地方buf,和需要传输的数据的多少 count。Read 对将文件读入缓存区。Write 则相反。
文件关闭流程:
(1)用户程序通过close ( )系统调用关闭打开的文件,该函数接收的参数为要关闭文件的文件描述符;
(2)内核调用sys_close ( )函数。
读文件的过程:
进程调用库函数向内核发起读文件请求;
内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;
调用该文件可用的系统调用函数read()。read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;
在inode中,通过文件内容偏移量计算出要读取的页;
通过inode找到文件对应的address_space;
在address_space中访问该文件的页缓存树,查找对应的页缓存结点:
如果页缓存命中,那么直接返回文件内容;
如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页;重新进行第6步查找页缓存;
文件内容读取成功。
标签:实时 ace int open 动作 sys 工作 ddr 模块
原文地址:https://www.cnblogs.com/Teresa-Chenchen/p/13274270.html