10-5 Linux操作系统 - 中断、异常及系统调用
Linux 操作系统错误代码解释

OS error code 81: .lib section in a.out corrupted
操作系统错误代码81: a. out文件中的.lib段损坏。
OS error code 82: Attempting to link in too many shared libraries
操作系统错误代码22:无效参数
OS error code 23: Too many open files in system
操作系统错误代码23:打开太多的文件系统
OS error code 24: Too many open files
操作系统错误代码24:打开的文件太多
OS error code 25: Inappropriate ioctl for device
操作系统错误代码47:3级复位
OS error code 48: Link number out of range
操作系统错误代码48:链接数超出范围
OS error code 49: Protocol driver not attached
操作系统错误代码49:协议驱动程序没有连接
OS error code 50: No CSI structure available
操作系统错误代码66:对象是远程的
OS error code 67: Link has been severed
操作系统错误代码67:链接被切断
OS error code 68: Advertise error
操作系统错误代码68:广告错误
OS error code 69: Srmount error
系统调用的处理过程及cpu工作状态的转换

系统调用的处理过程及cpu工作状态的转换系统调用的处理过程通常涉及以下步骤:1. 用户程序发起系统调用:当用户程序需要操作系统提供的某些功能时,它会通过特定的指令(如int指令或syscall指令)触发系统调用。
2. 保存用户程序的上下文:在进入系统调用之前,操作系统需要保存用户程序的上下文,包括程序计数器(PC)、寄存器的内容和其他必要的状态。
3. 切换到内核空间:为了执行系统调用,操作系统需要在用户空间和内核空间之间进行切换。
这通常涉及到从用户栈切换到内核栈,并加载内核的代码和数据段。
4. 执行系统调用处理程序:操作系统会根据用户程序所请求的系统调用类型,调用相应的系统调用处理程序。
这些处理程序通常是操作系统内核的一部分,并包含了实现系统调用功能的代码。
5. 处理系统调用:在系统调用处理程序中,会根据系统调用的类型,执行相应的操作。
这可能涉及到访问设备、文件、内存等资源,进行数据传输、操作等操作。
6. 返回结果和恢复用户程序状态:系统调用处理完毕后,需要将结果返回给用户程序。
操作系统会保存系统调用返回值,并恢复用户程序的上下文,包括寄存器的内容、程序计数器以及其他状态。
7. 返回用户空间并继续执行:最后,操作系统会将控制权从内核空间切换回用户空间,并从系统调用指令之后的位置开始,继续执行用户程序。
在系统调用的处理过程中,CPU的工作状态会发生转换。
当进入系统调用时,CPU需要从用户态切换到内核态,进入特权模式执行内核代码。
这涉及到修改CPU控制寄存器的值,使得CPU能够访问内核空间和相关的资源。
在系统调用处理完成后,CPU会从内核态切换回用户态,恢复用户程序的执行。
这种状态切换涉及到保存和恢复CPU寄存器的内容,以及修改相应的寄存器和标志位。
国家开放大学《操作系统》章节测试参考答案

国家开放大学《操作系统》章节测试参考答案第1章操作系统概述一、单项选择题1.操作系统的基本职能是()。
A. 提供用户界面,方便用户使用B. 提供方便的可视化编辑程序C. 提供功能强大的网络管理工具D. 控制和管理系统内各种资源,有效地组织多道程序的运行2.按照所起的作用和需要的运行环境,操作系统属于()。
A. 应用软件B. 系统软件C. 支撑软件D. 用户软件3.在计算机系统中,操作系统是()。
A. 处于裸机之上的第一层软件B. 处于系统软件之上的用户软件C. 处于应用软件之上的系统软件D. 处于硬件之下的低层软件4.现代操作系统的基本特征是()、资源共享和操作的异步性。
A. 程序的并发执行B. 实现分时与实时处理C. 多道程序设计D. 中断处理5.以下不属于操作系统具备的主要功能的是()。
A. 中断处理B. CPU调度C. 内存管理D. 文档编辑6.为用户分配主存空间,保护主存中的程序和数据不被破坏,提高主存空间的利用率。
这属于()。
A. 存储管理B. 作业管理C. 文件管理D. 处理器管理7.操作系统对缓冲区的管理属于()的功能。
A. 设备管理B. 存储器管理C. 文件管理D. 处理器管理8.操作系统内核与用户程序、应用程序之间的接口是()。
A. shell命令B. C语言函数C. 图形界面D. 系统调用9.系统调用是由操作系统提供的内部调用,它()。
A. 与系统的命令一样B. 直接通过键盘交互方式使用C. 是命令接口中的命令D. 只能通过用户程序间接使用10.在下列操作系统中,强调吞吐能力的是()。
A. 多道批处理系统B. 实时系统C. 网络系统D. 分时系统11.批处理系统的主要缺点是()。
A. CPU的利用率不高B. 系统吞吐量小C. 不具备并行性D. 失去了交互性12.为了使系统中所有的用户都能得到及时的响应,该操作系统应该是()。
A. 分时系统B. 网络系统C. 实时系统D. 多道批处理系统13.下面不属于分时系统特征的是()。
Linux中断处理流程

Linux中断处理流程1. 中断处理流程 当中断发⽣时,Linux系统会跳转到asm_do_IRQ()函数(所有中断程序的总⼊⼝函数),并且把中断号irq传进来。
根据中断号,找到中断号对应的irq_desc结构(irq_desc结构为内核中中断的描述结构,内核中有⼀个irq_desc结构的数组irq_desc_ptrs[NR_IRQS]),然后调⽤irq_desc中的handle_irq函数,即中断⼊⼝函数。
我们编写中断的驱动,即填充并注册irq_desc结构。
2. 中断处理数据结构:irq_desc Linux内核将所有的中断统⼀编号,使⽤⼀个irq_desc[NR_IRQS]的结构体数组来描述这些中断:每个数组项对应着⼀个中断源(也可能是⼀组中断源),记录中断⼊⼝函数、中断标记,并提供了中断的底层硬件访问函数(中断清除、屏蔽、使能)。
另外通过这个结构体数组项中的action,能够找到⽤户注册的中断处理函数。
struct irq_desc {unsigned int irq;irq_flow_handler_t handle_irq;struct irq_chip *chip;struct msi_desc *msi_desc;void *handler_data;void *chip_data;struct irqaction *action; /* IRQ action list */unsigned int status; /* IRQ status */unsigned int depth; /* nested irq disables */unsigned int wake_depth; /* nested wake enables */unsigned int irq_count; /* For detecting broken IRQs */unsigned long last_unhandled; /* Aging timer for unhandled count */unsigned int irqs_unhandled;spinlock_t lock;const char *name;} ____cacheline_internodealigned_in_smp;(1)handle_irq:中断的⼊⼝函数(2)chip:包含这个中断的清除、屏蔽、使能等底层函数struct irq_chip {const char *name;unsigned int (*startup)(unsigned int irq);void (*shutdown)(unsigned int irq);void (*enable)(unsigned int irq);void (*disable)(unsigned int irq);void (*ack)(unsigned int irq);void (*mask)(unsigned int irq);void (*mask_ack)(unsigned int irq);void (*unmask)(unsigned int irq);void (*eoi)(unsigned int irq);void (*end)(unsigned int irq);void (*set_affinity)(unsigned int irq,const struct cpumask *dest);int (*retrigger)(unsigned int irq);int (*set_type)(unsigned int irq, unsigned int flow_type);int (*set_wake)(unsigned int irq, unsigned int on);/* Currently used only by UML, might disappear one day.*/#ifdef CONFIG_IRQ_RELEASE_METHODvoid (*release)(unsigned int irq, void *dev_id);#endif/** For compatibility, ->typename is copied into ->name.* Will disappear.*/const char *typename;};(3)action:记录⽤户注册的中断处理函数、中断标志等内容struct irqaction {irq_handler_t handler;unsigned long flags;cpumask_t mask;const char *name;void *dev_id;struct irqaction *next;int irq;struct proc_dir_entry *dir;};3. 中断处理流程总结(1)发⽣中断后,CPU执⾏异常向量vector_irq的代码;(2)在vector_irq⾥⾯,最终会调⽤中断处理C程序总⼊⼝函数asm_do_IRQ();(3)asm_do_IRQ()根据中断号调⽤irq_des[NR_IRQS]数组中的对应数组项中的handle_irq();(4)handle_irq()会使⽤chip的成员函数来设置硬件,例如清除中断,禁⽌中断,重新开启中断等;(5)handle_irq逐个调⽤⽤户在action链表中注册的处理函数。
Linux 的异常处理

.endm
name:要生成的 vector_xxx 中的 xxx,比如 vector_stub irq, IRQ_MODE, 4,生成 vector_irq, 即 Exception 向量中 IRQ 对应的跳转地址。
mode:设定 CPU 模式位(CPSR 的 M[4:0]),从而可以操作对应模式的特殊寄存器。
图中显示,所有 7 种类型的 Exception 的跳转地址按顺序从基地址开始排列,被称
为 Exception 向 量 。 ARMv6 支 持 两 种 基 地 址 ( Normal:0x00000000,High vector:0xFFFF0000),具体使用哪个基地址,由 ARMv6 内部的 Control Register 的 bit13(V bit)设定。Linux 使用 High vector,需要注意的是,Exception 向量地址也是 虚拟地址(如果使用了虚拟地址机制)。
bl trace_hardirqs_off
#endif
get_thread_info tsk
#ifdef CONFIG_PREEMPT
ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
add r7, r8, #1
简述系统调用的过程

简述系统调用的过程系统调用是操作系统提供给应用程序的一种接口,通过系统调用,应用程序可以请求操作系统执行特定的操作,例如读写文件、创建进程、网络通信等。
系统调用的过程可以分为以下几个步骤:1. 应用程序发起系统调用请求应用程序通过调用特定的系统调用函数向操作系统发起请求。
在Linux 系统中,系统调用函数通常以“sys_”开头,例如“sys_read”、“sys_write”等。
2. 系统调用函数转换参数系统调用函数将应用程序传递的参数转换为操作系统内部使用的格式。
例如,在读取文件时,应用程序传递的参数包括文件描述符、缓冲区地址和读取字节数,系统调用函数需要将这些参数转换为操作系统内部使用的数据结构。
3. 系统调用函数触发中断系统调用函数通过软中断或硬中断的方式触发操作系统内核的中断处理程序。
在Linux系统中,系统调用函数通过int 0x80指令触发软中断,或者通过SYSENTER指令触发硬中断。
4. 中断处理程序处理系统调用请求操作系统内核的中断处理程序接收到系统调用请求后,会根据请求的类型调用相应的系统调用处理函数。
系统调用处理函数会根据请求的参数执行相应的操作,并将结果返回给中断处理程序。
5. 中断处理程序返回结果中断处理程序将系统调用处理函数返回的结果传递给系统调用函数。
系统调用函数将结果转换为应用程序可以使用的格式,并返回给应用程序。
6. 应用程序处理结果应用程序接收到系统调用函数返回的结果后,根据返回值判断系统调用是否执行成功。
如果执行成功,应用程序可以继续执行下一步操作;如果执行失败,应用程序需要根据错误码进行相应的处理。
总的来说,系统调用是应用程序与操作系统之间的桥梁,通过系统调用,应用程序可以利用操作系统提供的各种功能,实现更加复杂和强大的应用。
系统调用的过程虽然比较复杂,但是对于应用程序开发者来说,只需要调用相应的系统调用函数即可,无需关心具体的实现细节。
面向OBE_理念的课程教学探讨——以“操作系统”课程为例

2023年第30期教育教学SCIENCE FANS 面向OBE 理念的课程教学探讨——以“操作系统”课程为例王 正,石兵华,邸 忆(湖北经济学院信息工程学院,湖北 武汉 430205)【摘 要】在工程教育认证背景下,如何将OBE理念贯彻到具体课程教学中。
文章以“操作系统”课程为例,研究专业培养目标、毕业要求指标点与课程目标的关联,并从课堂教学、实践教学、线上线下混合教学的模式中凝炼出OBE人才培养的要素;从面向产出的内部评价机制中提炼“操作系统”课程的具体考核方式,建立考核项目与课程目标的联系,进而依据毕业生外部评价机制对课程进行持续改进,助力新工科背景下传统专业课程的改革与创新。
【关键词】OBE理念;课程教学;“操作系统”课程【中图分类号】G642 【文献标识码】A 【文章编号】1671-8437(2023)30-0005-03OBE(Outcome Based Education)理念强调以学生为中心,以产出为导向,其核心即反向设计培养目标,构建培养目标、毕业要求、课程体系、课程教学四个环节的支撑体系(如图1所示)。
OBE教学理念的实施依赖于面向内外部的多重评价机制,以及涉及人才培养的全过程制度文件和持续改进 措施。
“操作系统”是高等院校计算机及其相关专业的一门重要的主干课程,其课程教学的目标旨在使学生系统科学地接受分析问题和解决问题的训练,从而具备分析、设计、开发操作系统的能力,进一步增强学生的计算思维、程序设计与实现能力、算法设计与分析能力[1]。
本文围绕这一目标,探索OBE理念在该课程中的具体实施途径。
1 结合内外部评价机制的课程目标修正与制定“操作系统”的课程目标服务于专业要求,而专业要求支撑学科的培养目标。
课程目标与专业要求相互支持,从而形成内外评价系统。
OBE理念依据内外部评价机制逆向建立课程目标,其内部评价机制涵盖课程体系合理评价、课程目标达成评价、毕业要求达成评价,主要是采用学生自我评价(主观定性评价)和关联课程群分目标达成值加权计算(定量评价)相结合的办法,对应届毕业生的能力进行内部达成性评价[2]。
论述linux操作系统处理中断的过程。

论述linux操作系统处理中断的过程。
Linux操作系统是一种开源的、自由的、类Unix操作系统,它的内核是由Linus Torvalds和全球志愿者团队开发的。
Linux内核的一个重要功能是处理中断,它可以使操作系统在执行某个任务时,直接响应外部的事件,如键盘输入、网络数据传输等。
本文将详细介绍Linux操作系统处理中断的过程。
1. 中断的概念中断是指计算机在执行某个任务时,被外部事件所打断,暂停当前任务的执行,转而去处理其他任务的一种机制。
中断可以分为硬件中断和软件中断两种。
硬件中断是指计算机硬件设备发出的中断信号,如键盘、鼠标、网络接口卡等。
当硬件设备发出中断信号时,CPU会暂停当前任务的执行,跳转到中断服务程序中去执行处理,处理完中断后再返回原来的任务。
软件中断是指操作系统内核发出的中断信号,可以通过系统调用的方式触发,如定时器中断、系统调用等。
软件中断和硬件中断的处理方式是相同的。
2. 中断的分类根据中断的优先级,中断可以分为以下几类:① 外部中断:由硬件设备发出,如键盘输入、鼠标移动、网络数据传输等,优先级最高。
② 内部中断:由软件程序触发,如定时器中断、系统调用等,优先级次之。
③ 异常中断:由于程序执行错误或硬件故障等原因而发生的中断,优先级最低。
3. 中断的处理过程在Linux操作系统中,中断处理的过程可以分为以下几个步骤:① 中断请求:当硬件设备发出中断请求信号时,会将中断请求信号发送给中断控制器,中断控制器会将中断请求信号发送给CPU。
② 中断响应:CPU接收到中断请求信号后,会暂停当前任务的执行,跳转到中断服务程序中去执行处理。
在跳转之前,CPU会将当前任务的上下文保存到内存中,以便后续恢复任务的执行。
③ 中断处理:中断服务程序会根据中断类型进行相应的处理,如读取键盘输入、发送网络数据等。
在处理过程中,中断服务程序可以访问进程内存空间、内核内存空间等,并可以与其他设备进行交互。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10.5.4 中断上半部分的处理 一、 中断控制器 •每个硬件设备控制器都能通过中断请求线 发出中断请求(简称IRQ) •所有设备的中断请求线又连到中断控制器 的输入端。 •在x86单CPU的机器上采用两个8259A芯片作 为中断控制器,一主一从。
•当8259A有中断信号输入同时中断信号不被 屏蔽时,主8259A向CPU发出 INT信号,请求 中断。这时如果CPU是处于允许中断状况, CPU就会发信号给8259A进入中断响应周期。 •在对8259A芯片的初始化过程中,第n号中 断在IDT表中的向量号为 n+32
•IDT中向量号的使用情况如下: 0-31 异常与非屏蔽中断使用。 32-47 可屏蔽中断使用32至47 128(0x80)实现系统调用。 其余 未使用 •保存现场 发生异常时在核心栈的程序计数器eip的 值取决于具体情况。一般情况下eip保存的 下一条指令的地址,但对于页面异常,保存 的产生异常的这条指令的地址而不是下一条 指令的地址
中断向量表IDT •IDT是中断/异常处理在内核的入口。IDT表 项还记录了一些其它信息用以安全检查。 •IDT在系统初始化时创建。 •每个中断/异常都有一个向量号,该号的值 在0-255之间,该值是中断/异常在IDT中的 索引。 •每个中断/异常均有其相应的处理函数,中 断/异常在使用前必须在IDT中注册信息以保 证发生中断/异常时能找到相应的处理函数。
struct hw_interrupt_type { const char * typename; unsigned int (*startup)(unsigned int irq); void (*shutdown)(unsigned int irq); void (*enable)(unsigned int irq); void (*disable)(unsigned int irq); void (*ack)(unsigned int irq); void (*end)(unsigned int irq); void (*set_affinity)(unsigned int irq, unsigned long mask); };
(2) 软中断 一般是绝大部分中断处理在这里完成。 注意下半部分是可以在开中断的情况下运 行,并且第二步并不一定紧接着第一步运行。 如此便保证了中断的响应速度。 2.4 内核软中断形式
•软中断处理总控可以并发执行, 相同的与不同的 软中断都可以在不同的CPU上同时执行。 •tasklet,相同的tasklet不会同时在不同的CPU 上运行,不同的tasklet可以在不同CPU上运行。 •Bottom Half(BH) 系统中最多只能有一个CPU运 行BH 三者的约束从松到紧
对于8259A芯片来讲,它的具体成员如下:
static struct hw_interrupt_type i8259A_irq_type = { "XT-PIC", startup_8259A_irq, shutdown_8259A_irq, enable_8259A_irq, disable_8259A_irq, mask_and_ack_8259A, end_8259A_irq, NULL }; typedef struct hw_interrupt_type hw_irq_controller;
irq_desc_t irq_desc [NR_IRQS];
irqaction结构记录当中断发生时具体的处 理函数
struct irqaction { void (*handler)(int, void *, struct pt_regs *); /*具体的处理函数*/ unsigned long flags; unsigned long mask; const char *name; void *dev_id; struct irqaction *next; /*利用该成员形成链表*/ };
从ret_from_exception处返回用户空 间时,将会检查进程是否有信号等待处理。 如果有,则看进程是否有自己的信号处理 函数,有则调用它,否则采用内核对信号 的缺省处理,一般是将该进程杀死。
10.5.3 系统调用
用户程序通过系统调用切换到核心态从 而可以访问相应的资源。这样做的好处是: • 使编程更加容易。 • 有利于系统安全。 • 接口统一有利于移植。 系统调用的执行过句: int $0x80 指令是所有系统调用的统一入 口,fork()系统调用的编号为2。
(4) 最后do_IRQ()函数要检查是否有软中断,如 有则调用do_softirq()执行软中断。 (5)跳转到 ret_from_intr退出,恢复中断前的 现场。
10.5.5 软中断──中断处理的下半部分 问题背景: 在响应中断并进行处理的时候往往会关闭 中断,而在此期间完全可能有多个设备 发出中断请求,所以希望能够尽快地响 应中断以免中断丢失。 Linux的解决办法──中断处理分为两部分 (1)硬中断 (做最关键的事情) CPU响应中断。关闭中断,确认中断,把 中断设备的数据包从硬件缓冲拷贝到内 核空间(如果有的话),做标记用来激活 下半部分,开中断。
系统预定义了四个软中断: HI_SOFTIRQ 用于实现BH TASKLET_SOFTIRQ 对应于tasklet NET_TX_SOFTIRQ 用于发送网络数据 NET_RX_SOFTIRQ 接受网络数据 软中断的相关处理函数 •open_softirq()函数定义软中断及其处 理函数
open_softirq(NET_RX_SOFTIRQ,net_rx_action,NULL);
irq_desc_t 结 构 用 来 描 述 中 断 源 , 数 组 irq_desc[ ]描述所有的中断源。
typedef struct {
unsigned int status;
/* IRQ 状态 */
hw_irq_controller *handler; /*该中断所属的中断控 制器*/ struct irqaction *action; unsigned int depth; spinlock_t lock; } ____cacheline_aligned irq_desc_t;
irq_desc_t 的 action 成 员 实 际 是 一 个 irqaction结构的链表,因为多个设备可能 共享一个中断源,每个设备都必须提供一个 irqction结构挂入action链表。
设备通过函数request_irq()注册一个 IRQ号,并提供相应的处理函数。 下面是软驱驱动程序初始化时的代码:
movl int $2, %eax $0x80
系统在初始化设臵了0x80号异常的处理函 数为sys_call(),该函数执行下面一条语句:
call *SYMBOL_NAME(sys_call_table)(,%eax,4)
sys_call_table为系统调用表,该表保 存的是各个系统调用的入口地址,下面列出 了系统调用表的最前面三项:
中断 分为可屏蔽的和不可屏蔽的两类,由一些
硬件设备产生,可以在指令执行的任意时刻产生
•中断/异常的发生都将导致核心态代码的运行 •中断即可能发生在用户态,也可能发生在核心态, 并且中断的嵌套发生往往是允许的。 •异常大部分发生在用户态,但是页面异常可能发 生在核心态。异常也最多可能两层嵌套,绝大多 数情况是只有一级异常 •异常的处理过程中可能产生中断,反之则不可能
ENTRY(sys_call_table) .long SYMBOL_NAME(sys_ni_syscall)/*第0号 */ .long SYMBOL_NAME(sys_exit) .long SYMBOL_NAME(sys_fork)
从 而 fork ( ) 函 数 对 应 的 系 统 调 用 为 sys_fork(),该函数又调用do_fork()完 成具体的工作
10.5
内容
中断、异常及系统调用
• 中断/异常的基本知识 • 异常的处理 • 系统调用
• 中断的处理
• 软中断
10.5.1 中断/异常的基本知识 异常 由CPU产生,同步中断产生的通常情况是执
行指令却遇上异常情况,常见的异常有除零、溢 出及页面异常等。另一种情况种是使用int 指令, Linux使用该指令来实现系统调用。
三、 中断的处理过程
(1)中断信号由外部设备发送到中断控制器,中断 控制器根据IRQ号转换成相应的中断向量号传给 CPU 。
(2)CPU接收中断后,保存现场,根据中断向量号 到IDT中查找相应的处理函数。对于IRQ n的中断, 它的处理函数IRQn_interrutp()。 (3)调用do_IRQ()函数。该函数完成对中断控制器 确认、设臵中断源状态等动作,接着它会根据IRQ 号找到描述中断具体动作的irqaction结构变量 action,执行如下代码:
10.5.2 异常的处理函数 异常处理的一般流程如下: (1)保存大多数寄存器的值到核心模式栈上。
(2)调用相应的处理函数。 (3)跳转到ret_from_exception标号处退出。
大多数异常处理函数的过程是:
(1)硬件错误码和异常向量号存入当前进程。 (2)发出一个相应的信号给当前进程
非上述情况的例子:页面异常
用于处理软中断,它发现那 个软中断的标志位被设臵,就调用相应的软 中断处理函数。
•do_softirq()
do_softirq()有4个执行时机 从系统调用中返回(ret_from_sys_call) 从异常中返回(ret_from_exception) 调度程序中(schedule()) 处理完硬中断之后(do_IRQ())
struct task_struct *tsk = current; /*current 为当 前进程*/ tsk->thread.error_code = error_code; /*error_code 为硬件错误码*/ tsk->thread.trap_no = trapnr; /* trapnr为异常 向量号*/ if (info) force_sig_info(signr, info, tsk); else force_sig(signr, tsk);