标签 中断 下的文章
 2018-11-15T19:14:34.396000    |      汇编    |     AilsonJack    |     暂无评论    |     1115 views
BIOS int 13H中断也叫直接磁盘服务(Direct Disk Service),该中断的各个功能号及对应的功能描述如下:功能号功能描述功能号功能描述00H磁盘系统复位01H读取磁盘系统状态02H读扇区03H写扇区04H检验扇区05H格式化磁道06H格式化坏磁道07H格式化驱动器08H读取驱动器参数09H初始化硬盘参数0AH读长扇区0BH写长扇区0CH查寻0DH硬盘系统复位0EH读扇区缓冲区0FH写扇区缓冲区10H读取驱动器状态11H校准驱动器12H控制器RAM诊断13H控制器驱动诊断14H控制器内部诊断15H读取磁盘类型16H读取磁盘变化状态17H设置磁盘类型18H设置格式化媒体类型19H设置磁盘类型1AH格式化ESDI驱动器1、功能 00H功能描述:磁盘系统复位入口参数:AH=00HDL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明2、功能 01H功能描述:读取磁盘系统状态入口参数:AH=01HDL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘出口参数:AH=00H,AL=状态代码,其定义如下:00H — 无错 01H — 非法命令02H — 地址目标未发现 03H — 磁盘写保护(软盘)04H — 扇区未发现 05H — 复位失败(硬盘)06H — 软盘取出(软盘) 07H — 错误的参数表(硬盘)08H — DMA越界(软盘) 09H — DMA超过64K界限0AH — 错误的扇区标志(硬盘) 0BH — 错误的磁道标志(硬盘)0CH — 介质类型未发现(软盘) 0DH — 格式化时非法扇区号(硬盘)0EH — 控制数据地址目标被发现(硬盘) 0FH — DMA仲裁越界(硬盘)10H — 不正确的CRC或ECC编码 11H — ECC校正数据错(硬盘) CRC:Cyclic Redundancy Check code ECC:Error Checking & Correcting code20H — 控制器失败 40H — 查找失败80H — 磁盘超时(未响应) AAH — 驱动器未准备好(硬盘)BBH — 未定义的错误(硬盘) CCH — 写错误(硬盘)E0H — 状态寄存器错(硬盘) FFH — 检测操作失败(硬盘)3、功能 02H功能描述:读扇区入口参数:AH=02HAL=扇区数CH=柱面CL=扇区DH=磁头DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘ES:BX=缓冲区的地址出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明4、功能 03H功能描述:写扇区入口参数:AH=03HAL=扇区数CH=柱面CL=扇区DH=磁头DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘ES:BX=缓冲区的地址出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明5、功能 04H功能描述:检验扇区入口参数:AH=04HAL=扇区数CH=柱面CL=扇区DH=磁头DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘ES:BX=缓冲区的地址出口参数:CF=0——操作成功,AH=00H,AL=被检验的扇区数,否则,AH=状态代码,参见功能号01H中的说明。6、功能 05H功能描述:格式化磁道入口参数:AH=05HAL=交替(Interleave)CH=柱面DH=磁头DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘ES:BX=地址域列表的地址出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明。7、功能 06H功能描述:格式化坏磁道入口参数:AH=06HAL=交替CH=柱面DH=磁头DL=80H~0FFH:硬盘ES:BX=地址域列表的地址出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明8、功能 07H功能描述:格式化驱动器入口参数:AH=07HAL=交替CH=柱面DL=80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明9、功能 08H功能描述:读取驱动器参数入口参数:AH=08HDL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘出口参数:CF=1——操作失败,AH=状态代码,参见功能号01H中的说明,否则,BL=01H — 360K=02H — 1.2M=03H — 720K=04H — 1.44MCH=柱面数的低8位CL的位7-6=柱面数的该2位CL的位5-0=扇区数DH=磁头数DL=驱动器数ES:DI=磁盘驱动器参数表地址10、功能 09H功能描述:初始化硬盘参数入口参数:AH=09HDL=80H~0FFH:硬盘(还有有关参数表问题,在此从略)出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明11、功能 0AH功能描述:读长扇区,每个扇区随带四个字节的ECC编码入口参数:AH=0AHAL=扇区数CH=柱面CL=扇区DH=磁头DL=80H~0FFH:硬盘ES:BX=缓冲区的地址出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明12、功能 0BH功能描述:写长扇区,每个扇区随带四个字节的ECC编码入口参数:AH=0BHAL=扇区数CH=柱面CL=扇区DH=磁头DL=80H~0FFH:硬盘ES:BX=缓冲区的地址出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明13、功能 0CH功能描述:查寻入口参数:AH=0CHCH=柱面的低8位CL(7-6位)=柱面的高2位DH=磁头DL=80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明14、功能 0DH功能描述:硬盘系统复位入口参数:AH=0DHDL=80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明15、功能 0EH功能描述:读扇区缓冲区入口参数:AH=0EHES:BX=缓冲区的地址出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明16、功能 0FH功能描述:写扇区缓冲区入口参数:AH=0FHES:BX=缓冲区的地址出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明17、功能 10H功能描述:读取驱动器状态入口参数:AH=10HDL=80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明18、功能 11H功能描述:校准驱动器入口参数:AH=11HDL=80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明19、功能 12H功能描述:控制器RAM诊断入口参数:AH=12H出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明20、功能 13H功能描述:控制器驱动诊断入口参数:AH=13H出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明21、功能 14H功能描述:控制器内部诊断入口参数:AH=14H出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明22、功能 15H功能描述:读取磁盘类型入口参数:AH=15HDL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘出口参数:CF=1——操作失败,AH=状态代码,参见功能号01H中的说明, 否则,AH=00H — 未安装驱动器=01H — 无改变线支持的软盘驱动器=02H — 带有改变线支持的软盘驱动器=03H — 硬盘,CX:DX=512字节的扇区数23、功能 16H功能描述:读取磁盘变化状态入口参数:AH=16HDL=00H~7FH:软盘出口参数:CF=0——磁盘未改变,AH=00H,否则,AH=06H,参见功能号01H中的说明24、功能 17H功能描述:设置磁盘类型入口参数:AH=17HDL=00H~7FH:软盘 AL=00H — 未用=01H — 360K在360K驱动器中=02H — 360K在1.2M驱动器中=03H — 1.2M在1.2M驱动器中=04H — 720K在720K驱动器中出口参数:CF=0——操作成功,AH=00H,否则,AH=状态编码,参见功能号01H中的说明25、功能 18H功能描述:设置格式化媒体类型入口参数:AH=18HCH=柱面数CL=每磁道的扇区数DL=00H~7FH:软盘出口参数:CF=0——操作成功,AH=00H,ES:DI=介质类型参数表地址,否则,AH=状态编码,参见功能号01H中的说明26、功能 19H功能描述:磁头保护,仅在PS/2中有效,在此从略27、功能 1AH功能描述:格式化ESDI驱动器,仅在PS/2中有效,在此从略
汇编中断Linux 阅读全文»
 2018-09-11T06:34:59.960000    |      汇编    |     AilsonJack    |     暂无评论    |     1360 views
int 10H 是BIOS对屏幕及显示器所提供的服务程序。使用int 10H中断服务程序时,先要进行一些简单的配置,比如指定功能号和子功能号。其中寄存器AH表示的就是功能号,而其他寄存器的详细说明,参考表格中对应功能的文字,当一切设定好之后再调用 int 10H。下面是可供参考的表格:AH功能调用参数返回参数/注释01H设置光标类型设置光标类型CH低四位=光标的起始行CL低四位=光标的终止行02H设置光标位置BH=显示页码DH=行(Y坐标)DL=列(X坐标)03H读光标位置BH=显示页码CH=光标的起始行CL=光标的终止行DH=行(Y坐标)DL=列(X坐标)04H获取当前状态和光笔位置AH=00h—光笔未按下/未触发,01h—光笔已按下/已触发BX=象素列(图形X坐标)CH=象素行(图形Y坐标,显示模式:04H~06H)CX=象素行(图形Y坐标,显示模式:0DH~10H)DH=字符行(文本Y坐标)DL=字符列(文本X坐标)05H设置显示页,即选择活动的显示页AL=显示页06H屏幕初始化或上卷AL = 上卷行数AL = 0全屏幕为空白BH = 卷入行属性CH = 左上角行号CL = 左上角列号DH = 右下角行号DL = 右下角列号07H屏幕初始化或下卷AL = 下卷行数AL = 0全屏幕为空白BH = 卷入行属性CH = 左上角行号CL = 左上角列号DH = 右下角行号DL = 右下角列号08H读光标位置的属性和字符BH=显示页码AH=属性AL=字符09H在当前光标处按指定属性显示字符AL=字符BH=显示页码BL=属性(文本模式)或颜色(图形模式)CX=重复输出字符的次数0AH在当前光标处按原有属性显示字符AL=字符BH=显示页码BL=颜色(图形模式,仅适用于PCjr)CX=重复输出字符的次数0EH显示字符(光标前移)AL=字符BH=页码BL=前景色(图形模式)13H显示字符串BH=页码BL=属性(若AL=00H或01H)CX=显示字符串长度(DH、DL)=坐标(行、列)ES:BP=显示字符串的地址AL= 显示输出方式0:字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变 1:字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变 2:字符串中含显示字符和显示属性。显示后,光标位置不变 3:字符串中含显示字符和显示属性。显示后,光标位置改变AH=00H是用来设定显示模式的,AL 寄存器表示欲设定的模式:AL文字/图形分辨率颜色00H文字40*252色01H文字40*2516色02H文字80*252色03H文字80*2516色04H图形320*2002色05H图形320*2004色06H图形640*2002色AH=01H,你可以把光标想成一个小的矩形,平时这个矩形扁平位于某字底部,但藉由此功能可以改变其大小与位置。光标起始处与终止处分别由 CL 与 CH 的 0 到 4 位表示,而 CH 的第 7 位必须是 0,第 5、6 位表示光标属性:位6位5属性00正常01隐形10erratic11闪烁缓慢AH=02H,此功能是设定光标位置,位置用 DH、DL 表示,DH 表示列号,DL 表示行号。由左至右称之为『列』,屏幕最上面一列为第零列,紧靠第零列的下一列称为第一列……;由上而下称之为『行』,屏幕最左边一行称之为第零行,紧靠第零行右边的一行为第一行。故最左边,最上面的位置为 DH=0 且 DL=0;最左边第二列,DH=1,DL=0。如果是文字模式时,BH 为欲改变光标位置的显示页,如果是图形模式,BH 要设为 0。在文字模式下,字符的位置类似数学直角坐标系的坐标,但是 Y 轴方向相反,Y 轴是以屏幕最上面为零,越下面越大,直到 24 为止,存于 DH 内。X 轴和直角座标系相同,越右边越大,存于 DL 内,其最大值视显示模式而变。AH=03H,用于读取光标位置,在这个中断服务程序返回时,会将光标的行列信息存储在DX里面,CX中存储光标的开始行和结束行。AH=04H,此功能是探测光笔的位置,似乎只有 CGA 卡有接上光笔??AH=05H,这个功能是把指定的显示页显示于屏幕上,欲显示的显示页由AL寄存器指定。此功能只能在文字模式下才能发生作用。AH=06H/07H,这个服务程序的作用是把某一个设定好的矩形区域内的文字向上或向下移动。先说明向上移动,即AH=06H。当此服务程序工作时,会使矩形区域的文字向上移动,而矩形区域底端移进空格列。向上移动的列数存入 AL 中 ( 如果 AL 为零,表示使矩形区域的所有列均向上移 ),底端移入空格列的属性存于 BH,矩形区域是藉由 CX、DX 来设定左上角与右下角的座标,左上角的行与列分别由 CL、CH 设定,右下角的行与列由 DL、DH 设定。AH=07H和 AH=06H相似,只是卷动方像不同而已。AH=08H,这个服务程序是用来取得光标所在位置的字符及属性,调用前,BH表示想要读取的显示页,返回时,AL为该位置的ASCII字符,AH为其属性,有关属性的说明,请参考下面的注1。AH=09H,这个功能是在光标位置显示字符,所要显示字符的 ASCII 码存于 AL 寄存器,字符重复次数存于 CX 寄存器,显示页存于 BH 寄存器,属性存于 BL 寄存器,其属性使用与AH=08H一样。AH=0AH,这个功能和AH=09H一样,差别在 AH=0AH 只能写入一个字符,而且不能改变字符属性。AH=0BH,这个服务程序是选择调色盘。显示模式 5 是 320*200 的图形模式,最多可以显示 4 种颜色,这四种颜色的意思是最多可以『同时』显示一种背景色及三种前景色,而这三种前景色有两种方式可供选择,因此事实上,在显示模式 5 有两种调色盘可供选择。就好像您去买 12 种颜色的水彩,但可在调色盘上以任意比例搭配出许多种颜色。调色盘 0 的三色是红、黄、绿;调色盘 1 的三色是青、紫红、白。背景色有 16 六种可供选择,这 16 种就是下面注1的 16 色。调用此中断时,先决定要设定背景色抑或调色盘:要设定背景色时,则使BH为 0,再使BL之数值为0到0fh之间表示注1的16色之一。要设定调色盘时,则使BH为1。再设定BL为零或一表示选择那一种调色盘。 背景色只有在前景色为 0 时才会显现出来。AH=0CH,是在绘图模式中显示一点 ( 也就是写入点像,write graphics pixel ),而 AH=0DH则是读取点像 ( read graphics pixel )。写入时,要写入位置X坐标存于CX寄存器,Y坐标存于DX寄存器,颜色存于AL寄存器。和文字模式相同,萤光幕上的Y坐标是最上面一列为零,越下面越大,X坐标则和数学的定义相同。CX、DX、AL 值之范围与显示模式有关:显示模式X坐标Y坐标颜色40~3190~1990、150~3190~1990~360~6390~1990、1AH=0DH则是读取某一位置的点像,您必须指定CX、DX,而INT 10H会传回该位置点像的颜色。AH=0EH,这个子程序是使显示器像打字机一样的显示字符来,在前面用AH=09H和 AH=0AH都可以在萤光幕上显示字符,但是这两种方式显示字符之后,光标位置并不移动,而AH=0EH则会使光标位置移动,每显示一个字符,光标会往右移一格,假如已经到最右边了,则光标会移到最左边并移到下一列,假如已经移到最下面一列的最右边,则屏幕会向上卷动。AL寄存器存储要显示的字符,BH为目前的显示页,如果是在图形模式,则BH须设为 0,假如是在图形模式下,也可以设定 BL 来表示文字的颜色,文字模式下的 BL 则无功能。AH=0FH,这个服务程序是得到目前的显示模式,调用前只需使AH设为0fh,当由INT 10H返回时,显示模式存储在AL寄存器(参考AH=00H的显示模式表),目前的显示页存于BH寄存器,总字符行数存存储在AH寄存器。注1:所谓属性是指字符的颜色、背景颜色、是否闪烁、有没有底线等性质。在彩色显示卡 (CGA/EGA/VGA等)的文字模式中,颜色是用4个位表示,故可以表现出16种颜色,如下表:二进制数颜色二进制数颜色0000黑色(black)1000灰色(gray)0001蓝色(blue)1001淡蓝色(light blue)0010绿色(green)1010淡绿色(light green)0011青色(cyan)1011淡青色(light cyan)0100红色(red)1100淡红色(light red)0101紫红色(magenta)1101淡紫红色(light magenta)0110棕色(brown)1110黄色(yellow)0111银色(light gray)1111白色(white)在彩色显示器里,如CGA、EGA、VGA等,常用一个字节(8个位)来表示文字颜色和背景颜色,通常以第0~3位表示文字本身颜色;第4~6位表示背景颜色,背景颜色只有上表左栏的8种而已;第7个位,表示是否闪烁,0表示不闪烁,1表示闪烁。但是在单色显示器里,如MDA和Hercules卡中,这些颜色表并无意义,所以属性解释方式不同,请看下表:数值属性00H空格,不显示任何数据77H显示白色方块07H正常的黑底白字70H反白的白底黑子01H加底线
汇编中断Linux 阅读全文»
 2018-09-06T23:04:33.368000    |      汇编    |     AilsonJack    |     暂无评论    |     1416 views
最近在学习80x86的汇编,在遇到中断指令:int 10,不知道这个10是什么意思,上网经过查找,这个是10是中断向量号,代表的是用于屏幕显示的中断。然后从网上整理了一张内存地址,中段向量号,中断用途的表,如下所示:内存地址(16进制)对应向量号(16进制)中断用途8088中断向量0x000 - 0x0030除以00x004 - 0x0071单步(用于debug)0x008 - 0x00B2非屏蔽中断0x00C - 0x00F3断点指令0x010 - 0x0134溢出0x014 - 0x0175打印屏幕0x018 - 0x01B6保留0x01C - 0x01F7保留8259中断向量0x020 - 0x0238定时器(IRQ0)0x024 - 0x0279键盘(IRQ1)0x028 - 0x02BA彩色/图形(IRQ2)0x02C - 0x02FB异步通信(secondary)--串行通信接口2(IRQ3)0x030 - 0x033C异步通信(primary)--串行通信接口1(IRQ4)0x034 - 0x037DLPT2控制器中断--硬磁盘(并行口)(IRQ5)0x038 - 0x03BE磁盘控制器中断--软磁盘(IRQ6)0x03C - 0x03FFLPT2控制器中断--并行打印机(IRQ7)BIOS中断0x040 - 0x04310屏幕显示I/O0x044 - 0x04711设备检验0x048 - 0x04B12测定存储器容量0x04C - 0x04F13磁盘I/O0x050 - 0x05314RS-232串行通讯口I/O0x054 - 0x05715盒式磁带I/O0x058 - 0x05B16键盘I/O0x05C - 0x05F17打印机输出0x060 - 0x06318BASIC入口代码--ROM BASIC入口代码0x064 - 0x06719引导装入程序--系统自举0x068 - 0x06B1A时钟管理提供给用户的中断0x06C - 0x06F1BCtrl + Break控制的软中断0x070 - 0x0731C定时器控制的软中断数据表指针0x074 - 0x0771D视频参数块0x078 - 0x07B1E软盘参数块0x07C - 0x07F1F图形字符扩展码DOS中断向量0x080 - 0x08320DOS中断返回0x084 - 0x08721DOS系统功能调用0x088 - 0x08B22程序中止时DOS返回地址(用户不能直接调用)0x08C - 0x08F23Ctrl+Break 处理地址(用户不能直接调用)0x090 - 0x09324严重错误处理(用户不能直接调用)0x094 - 0x09725绝对磁盘读功能0x098 - 0x09B26绝对磁盘写功能0x09C - 0x09F27终止并驻留程序0x0A0 - 0x0A328DOS安全使用0x0A4 - 0x0A729快速写字符0x0A8 - 0x0AB2AMicrosoft 网络接口0x0AC - 0x0B72B-2D未使用0x0B8 - 0x0BB2E基本SHELL程序装入0x0BC - 0x0BF2F多路服务中断0x0C0 - 0x0CB30-32未使用0x0CC - 0x0CF33鼠标中断0x0D0 - 0x0EB34-40未使用0x104 – 0x10741硬盘参数块0x108 – 0x10F42-43未使用0x110 – 0x11344PC机使用,用于指向低分辩率图形字符参数表0x114 – 0x11745保留0x118 – 0x11B46第二硬盘参数块BASIC中断向量0x11C – 0x11F47保留0x120 – 0x12348PC机使用,用于把PC机的键盘代码变换为标准的键盘代码0x124 – 0x12749指向键盘增强服务变换表0x128 – 0x17F4A-5F保留0x180 – 0x19F60-57为用户程序保留的单元0x1A0 – 0x1BF68-6F未使用0x1C0 – 0x1C370硬件中断0x1C4 – 0x1C771硬件中断90x1C8 – 0x1CB72硬件中断100x1CC – 0x1CF73硬件中断110x1D0 – 0x1D374硬件中断120x1D4 – 0x1D775硬件中断130x1D8 – 0x1DB76硬件中断140x1DC – 0x1DF77硬件中断150x1E0 – 0x1FF78-7F未使用0x200 – 0x21780-85为BASIC保留0x218 – 0x3C386-F0BASIC程序运行时提供给BASIC解释程序作用0x3C4 – 0x3FFF1-FF未使用
汇编中断Linux 阅读全文»
 2016-04-20T13:19:45.265000    |      Linux MMC子系统    |     AilsonJack    |     暂无评论    |     1684 views
对于Linux的中断,个人理解首先明白三个结构体irq_desc、irq_chip、irqaction之间的关系,把这三个结构体之间的关系搞明白之后,想要弄明白中断从触发,到最后执行中断服务程序就会比较容易,至少在内核中跟踪代码会容易些。每个中断线都有它自己的irq_desc描述符,所有这些描述符组织在一起就形成了中断描述符数组。1、一条中断线的中断描述结构体中断描述符数组存放着各个中断线的中断描述符结构体。struct irq_desc {    unsigned int     irq;//这个中断线的中断号    struct timer_rand_state *timer_rand_state;    unsigned int     *kstat_irqs;#ifdef CONFIG_INTR_REMAP    struct irq_2_iommu  *irq_2_iommu;#endif    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;    raw_spinlock_t    lock;#ifdef CONFIG_SMP    cpumask_var_t  affinity;    unsigned int   node;#ifdef CONFIG_GENERIC_PENDING_IRQ    cpumask_var_t  pending_mask;#endif#endif    atomic_t         threads_active;    wait_queue_head_t    wait_for_threads;#ifdef CONFIG_PROC_FS    struct proc_dir_entry  *dir;#endif    const char        *name;} ____cacheline_internodealigned_in_smp;2、描述中断控制器的结构体这是描述中断控制器的结构体,将其封装成结构体便于管理各个不同类型的中断控制器,比如8259A和APIC。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);    int             (*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);    void          (*bus_lock)(unsigned int irq);    void          (*bus_sync_unlock)(unsigned int irq);/* Currently used only by UML, might disappear one day.*/#ifdef CONFIG_IRQ_RELEASE_METHOD    void          (*release)(unsigned int irq, void *dev_id);#endif/* * For compatibility, ->typename is copied into ->name. * Will disappear.*/    const char       *typename;};3、中断线上的中断服务程序这是中断线上的中断服务程序结构体。如果该中断线可以被共享,那么将由这个结构体组成一个中断服务程序的链表,如果这条线上有中断产生,那么Linux内核会在handle_IRQ_event()函数中,对该中断线上的每一个注册的中断程序进行执行,这就要求相关设备的中断服务程序应该知道是否它应该对这个中断负责,如果该中断与当前的设备无关,那么处理程序应该立刻退出。struct irqaction {    irq_handler_t handler;//中断服务程序    unsigned long flags;//IRQF_SHARED表明该中断线可以被共享    const char *name;    void *dev_id;//在共享中断中,该值的唯一性将当前的中断服务程序与其他服务程序区分    struct irqaction *next;//指向下一个中断服务程序    int irq;//分配到指定中断号的中断描述结构体中    struct proc_dir_entry *dir;    irq_handler_t thread_fn;    struct task_struct *thread;    unsigned long thread_flags;};4、中断处理程序中断处理程序注册函数:request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,       const char *name, void *dev)中断处理程序释放函数:void free_irq(unsigned int irq, void *dev_id)中断从硬件到内核的路由:下面是自己总结的一幅中断线描述数组的图:5、中断的下半部Linux的中断工作在中断上下文,因此不能够被工作于进程上下文的任务打断,如果中断服务程序处理的工作比较多,就会严重影响到用户层的任务,为了解决这个问题,Linux将中断的处理分为上半部与下半部。其中的上半部就是上面提到的中断服务程序,它用于需要马上进行处理的任务。对于那些与中断相关,但是不要求马上进行处理的任务,就可以将其放在中断的下半部进行处理。中断的下半部的实现机制主要包括:软中断,tasklet,工作队列。其中软中断和tasklet工作在中断上下文,而工作队列工作在进程上下文。对于工作在中断上下文的中断处理程序,软中断,tasklet不能够休眠,即不能够使用信号量或者其他阻塞式的函数。
Linux内核学习中断嵌入式 阅读全文»
  • 1

  本站信息

目前本站共被浏览 154793 次
目前本站已经运行 3306 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号