在Linux下写一个驱动时候遇到的读操作性能问题,让我想一窥系统调用的处理流程,以查出问题的root cause。很多书把它和中断处理放在一起讲,但是又没有哪本书说清楚了,看来只有代码才能说明一切。以Linux系统下MIPS体系结构为例。

从开始说起。

1. 相关代码

 trap_init(void) /* 系统初始化:start_kernel中 */
set_handler(0x180, &except_vec3_generic, 0x80);/* except_vec3_generic 根据cause寄存器跳转到其若干类异常/中断处理函数中*/
set_except_vector(, rollback ? rollback_handle_int : handle_int);
set_except_vector(, handle_tlbm);
... ...
set_except_vector(, handle_sys);

当系统发现异常时,CPU将自动进入内核模式并禁止中断,同时将PC指针指向默认的地址(根据异常的不同将分别进入偏移地址为0x180 or 0x200的地方,这些在函数trap_init都有体现,上述代码没有一一贴出)。

异常号为8时进入系统调用的处理入口。

 /* 进入系统调用异常处理 */
handle_sys
SAVE_SOME
STI # 进入内核模式并enable中断
la t1, sys_call_table
... ...

注意这里系统调用入口一开始就会enable中断。

而异常号为0时进入中断处理的入口。

 /* 进入中断异常处理 */
handle_int
SAVE_ALL
CLI # 进入内核模式并disable中断
   plat_irq_dispatch # 每种类型的CPU都有自己的实现
do_IRQ
generic_handle_irq /*处理用户注册的ISR,关中断进行 */
irq_exit()
do_softirq /*进入下半部处理(软中断) */
local_irq_enable /*仍然在中断上下文中,但是开中断*/
... ... /*处理用户注册的下半部,
Note:有可能在softirq内核线程中进行处理,所以下半部的处理并不总是在中断上下文中,但是下半部的思想就是允许中断嵌套*/

上面的代码描述了中断处理的框架,简要列出了处理中值得注意的地方。这里尤其注意中断处理入口一开始直接disable中断。

2. 结论

所以,系统调用和普通中断处理的异同在于:两者都是从同一个异常处理入口开始,但是系统调用会一开始让CPU进入内核模式且使能中断,然后从系统调用表中取得相应的注册函数调用之;而中断处理则让CPU进入内核模式且disable中断,继而调用do_IRQ函数。所以系统调用的真实处理(系统调用表中的注册函数执行)中可以阻塞,而中断处理的上半部不可以。所以在写驱动代码如字符设备驱动,实现读操作时是可以让其sleep的(比如没有数据时候,用户设置读模式是阻塞型的)。另一方面,如果该驱动读操作过于耗时也是不可取的,它在内核态中执行,这个时候只有中断的优先级比它高,其它的高优先级线程将不能得到及时调度执行。

另外,思考一下为什么在中断的下半部如tasklet中不能做阻塞的操作,而系统调用却可以?

首先,系统调用过程中阻塞意味着阻塞时(内核模式中)当前上下文放在当前线程栈中,同时系统调用所在线程状态改变(比如调用wait_event),下次改线程再次被调度后就可以从阻塞点继续run,这整个过程和一个普通线程阻塞并再次调度的过程是一样的,唯一的区别在于系统调用的阻塞点是在内核模式下。而下半部则不一样,作为中断处理的一个例程逻辑上不属于某个线程,所以它阻塞时第一不能改变当前线程的状态(而wait_semaphore之类的函数则会),其次它在阻塞的情况下再次run的点是在被中断线程再次被调度后,这也是不合理的,因为它不是该线程的一部分,凭什么让它的运行时间受限于该线程的调度时机?

系统调用和中断处理的异同(以Linux MIPS为例)的更多相关文章

  1. Prometheus Node_exporter 之 Network Netstat TCP Linux MIPs

    Network Netstat TCP Linux MIPs1. TCP Aborts / Tiemouts type: GraphUnit: shortLabel: ConnectionsTCPAb ...

  2. 【原创】xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正. 1. 引出问题 上一篇文章xenomai内核解析--双核系统调用(一)以X86处理器为例,分析了xenomai内核调用的流程, ...

  3. linux 命令小例

    xargs示例: ls |xargs -i mv {}  /opt find示例: find -mtime +n -name “*.avi” -type f -exec rm {} \; find - ...

  4. linux目录结构详解(以suse linux 10为例)

    一.文件系统结构 位于Linux系统的最顶端即根目录是/.Linux的文件系统的入口就是/,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. 它之下的子目录有: ...

  5. [转]Linux学习笔记——例说makefile 头文件查找路径

    0.前言     从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助 ...

  6. 命令行刷机教程( 以Linux系统为例 )

    //第一步adb device // 如果不能cd AndroidSDK/platform-toolsadb kill-server adb start-server //第二步adb reboot ...

  7. Linux学习笔记——例说makefile 头文件查找路径

    0.前言     从学习C语言開始就慢慢開始接触makefile,查阅了非常多的makefile的资料但总感觉没有真正掌握makefile,假设自己动手写一个makefile总认为非常吃力.所以特意借 ...

  8. Linux curl 一例

    root@PC-RENGUOQIANG:~# curl http://kermit:kermit@192.168.66.182:8080/activiti-rest/service/repositor ...

  9. Linux学习笔记——例说makefile 综合案例

    0.前言     从学习C语言開始就慢慢開始接触makefile,查阅了非常多的makefile的资料但总感觉没有真正掌握makefile,假设自己动手写一个makefile总认为非常吃力.所以特意借 ...

随机推荐

  1. Mysql主从复制,读写分离

    一个简单完整的 Mysql 主从复制,读写分离的示意图. 1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave MySQL 复制的工作方式很简单,一台服务器作为主机, ...

  2. 精通 Oracle+Python,第 5 部分:存储过程、Python 编程

    调用数据库存储过程及其他感兴趣的高级 Python 编程功能. 2010 年 3 月发布 对于涉及数据库的软件开发来说,有两种主流开发方法:一种是在应用程序中(对于三层体系结构,也可以是在中间件中)实 ...

  3. 一个c++给程序打log的单例模式类

    开发过程中需要给程序打log. 所以照着网上写了个单例模式的log类 #ifndef MISCLOGWRITER_H_ #define MISCLOGWRITER_H_ #include <io ...

  4. C语言的预处理命令

    C语言编译器处理时经过的第一个步骤是预处理,就是从.c文件处理为.i文件.在预处理时编译器做了一些展开替换的处理. 1>头文件展开,即将#include "stdio.h"类 ...

  5. https WebAPi

    前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...

  6. 浅析Linux操作系统工作的基础

    环境:lubuntu 13.04   kernel 3.9.7 作者:SA12226265 katao 简介: 本文根据 Linux™ 系统工作基础的分析,对存储程序计算机.堆栈(函数调用堆栈)机制和 ...

  7. Kernel Bypass & Offload 介绍

    系统网络优化可以有两方面的工作可以做:1 绕开内核(bypass):2 用硬件替代软件(offload). 具体包括: 1. 绕开内核: 不使用内核内核子系统的功能,采用自己实现的相同功能的代码来处理 ...

  8. 随着visual studio 2013 发布.带来的一些变化

    1.asp.net a.在2013中, asp.net走向了统一.使用不同的asp.net 框架搭(web forms ,api, mvc )建混合应用 b.身份验证 无身份验证 个人用户账户 (窗体 ...

  9. 机械硬盘与SSD固态硬盘性能的深度

    从7200转硬盘升级到10000转的迅猛龙,那叫量变.从10000转的迅猛龙升级到SSD,这个叫质变.2者的差距是有些地方相当大,而有些却很接近,主要是难比较. 经常听到有人说:我买2个黑盘组RAID ...

  10. 【POJ1470】Closest Common Ancestors

    Description Write a program that takes as input a rooted tree and a list of pairs of vertices. For e ...