efi code里面有关于init 8259的code,也就是legacy8259protocol的实作

对8259的编程,我们是对其相应端口发送ICW(初始化命令字)来完成的,

总共需要发送4个ICW,而且必须按次序发送,这里提一下8259a编程的一些东西,2片8259a级连,一个为主片,一个为从片,从片的INT端口与主片的IRQ2相连,主片的访问端口为0x20和0x21,从片为0xa和0xa1

在legacy bios中IRQ0-IRQ7被分配了0x8-0xf的中断矢量(中断号),

IRQ-8-IRQF

被分配为0x70-0x78,这也可以看做是实模式下是这样来分的,但当cpu转到保护模式的时候,中断号0x8-0xf都被cpu用来处理错误了,所以我们必须从新对8259进行编程,设置中断号的起始地址,

EFI_LEGACY_8259_PROTOCOL 中的SetVectorBase就是干这种事情的,

从字面的意思也可以看出来,“设置中断矢量的基地址”

在EFI BIOS中我们将master interrupt base 设置为0x58,slave interr

base设置为0x70,linux中我们是将master interrupt base设置0xf0,slave设置为0xf8

设置这些base address的时候,我们就要对8259进行编程,也就是要发四个ICW了

EFI_STATUS SetVectorBase(

IN

EFI_LEGACY_8259_PROTOCOL *This,

IN UINT8

MasterBase,

IN UINT8

SlaveBase

)

{

//8259 Master

if (MasterBase != gMasterBase)

{

IoWrite8(0x20,ICW1); //Start

8259 Master Initialization.

IoWrite8(0x21,MasterBase); //Set

Interrupt Offset

IoWrite8(0x21,ICW3_M); //Set

Slave IRQ.

IoWrite8(0x21,ICW4); //Set

8259 mode. See ICW4 comments with #define.

gMasterBase = MasterBase;

}

//8259 Slave

if (SlaveBase != gSlaveBase)

{

IoWrite8(0xa0,ICW1); //Start

8259 Slave Initialization.

IoWrite8(0xa1,SlaveBase); //Set

Interrupt Offset

IoWrite8(0xa1,ICW3_S); //Set

Slave IRQ.

IoWrite8(0xa1,ICW4); //Set

8259 mode. See ICW4 comments with #define.

gSlaveBase = SlaveBase;

}

return EFI_SUCCESS;

}

ICW1:发送到0x20(主片)及0xa0(从片)端口

7 6 5 4 3 2 1 0

0 0 0 1 M 0 C I

I 位:若置位,表示ICW4 会被发送。(ICW4 等下解释)

C 位:若清零,表示工作在级联环境下。

M 位:指出中断请求的电平触发模式,在PC 机中,它应当被置零,表示采用“边沿触发模

式”。

ICW2:发送到0x21(主片)及0xa1(从片)端口

7 6 5 4 3 2 1 0

A7 A6 A5 A4 A3 0 0 0

ICW2 用来指示出IRQ0 使用的中断号是什么,因为最后三位均是零,因此要求IRQ0 的中

断号必须是8,的倍数,这又是一个很巧妙的设计。因为IRQ1 的中断号就是IRQ0 的中断

号+1,IRQ2 的中断号就是IRQ0 的中断号+2,……,IRQ7 的中断号就是IRQ0 的中断号+1,

刚好填满一个8 个的中断向量号空间。

ICW3:发送到0x21(主片)及0xa1(从片)端口

ICW3 只有在级联工作的时候才会被发送,它主要用来建立两处PIC 之间的连接,对于主片

与从片,它结构是不一样的。

(主片结构:)

7 6 5 4 3 2 1 0

IRQ7 IRQ6 IRQ5 IRQ4 IRQ3 IRQ2 IRQ1 IRQ0

上面,如果相应的位被置1,则相应的IRQ 线就被用于与从片连接,若清零则表示被连接到

外围设备。

(从片结构:)

7 6 5 4 3 2 1 0

0 0 0 0 0 IRQ

IRQ 位指出了是主片的哪一个IRQ 连到了从片,这需要同主片上发送的上面的主片结构字

一致。

ICW4:发送到0x21(主片)及0xa1(从片)端口

7 6 5 4 3 2 1 0

0 0 0 0 0 0 EOI 80x86

80x86 位:若置位表示工作在80x86 架构下。

EOI 位:若置位表示自动结束,在PC 上这位需要被清零。

在EFI BIOS code中的定义为

#define

ICW1 0x11

#define

ICW3_M 1<<2

#define

ICW3_S 2

#define

ICW4 1

与上面的说明是一致的

EFI_LEGACY_8259_PROTOCOL中SetMode这个function,是设置现在的8259处于实模式还是处于保护模式下,要中断屏蔽那些IRQ,中断触发的方式是什么样的(边沿还是水平)

其中这个会用到2个全局变量

UINT16 gIrqMask[2] =

{0xffff,0xffff}; UINT16 gIrqTrigger[2] =

{0,0}; 一个是控制中断屏蔽regisgter的,一个是控制中断触发的方式,数组为2,一个用于real

mode,一个用于protect mode

看一下setmode的函数实作

EFI_STATUS SetMode(

IN

EFI_LEGACY_8259_PROTOCOL *This,

IN

EFI_8259_MODE Mode,

IN UINT16

*Mask

OPTIONAL,

IN

UINT16 *EdgeLevel OPTIONAL

)

{

if (Mode >= Efi8259MaxMode) return

EFI_INVALID_PARAMETER;

gMode = Mode;

if (Mask) gIrqMask[Mode] = *Mask;

if (EdgeLevel) gIrqTrigger[Mode] =

*EdgeLevel;

ProgramIrqMaskTrigger();

return EFI_SUCCESS;

}

可以猜想 ProgramIrqMaskTrigger()就是操作8259

register的函数

VOID ProgramIrqMaskTrigger()

{

IoWrite8(0x21,(UINT8)gIrqMask[gMode]);

IoWrite8(0xa1,(UINT8)(gIrqMask[gMode]>>8));

//

// 4d0 can not be accessed as by IoWrite16, we

have to split

//

IoWrite8(0x4d0,(UINT8)gIrqTrigger[gMode]);

IoWrite8(0x4d1,(UINT8)(gIrqTrigger[gMode]>>8));

}

其中

IoWrite8(0x21,(UINT8)gIrqMask[gMode]);

IoWrite8(0xa1,(UINT8)(gIrqMask[gMode]>>8));

为操作8259a OCW命令register

OCW1:中断屏蔽,发送到0x21(主片)或0xa1(从片)端口

7 6 5 4 3 2 1 0

IRQ7 IRQ6 IRQ5 IRQ4 IRQ3 IRQ2 IRQ1 IRQ0

如果相应的位置1,则表示屏蔽相应的IRQ 请求。

EFI_LEGACY_8259_PROTOCOL中GetMask和SetMask,也是操作mask和trigger的,原理和以上相同

GetVector字面意思,得到中断号,也就是上面说的我们设置IRQ0对应的中断号为0x58,我们现在要得到这个0x58,就靠这个函数了,无非就是倒过来运算而已

Master的IRQ对应得中断好号为IRQ+masterbase

Slave上的IRQ为IRQ+slavebase-8 而已

EnableIRQ() DisableIRQ()这些函数的都是操作OCW1

GetInterruptLine()为读配置空间,得到IRQ编号

EndOfInterrupt()在中断处理函数里面发送EOI命令

如果 EOI 被设为自动的,那么ISR 中的位总是被清零的(在EOI 被置位的情况下,8259A

只要向CPU 发送了中断号就会将ISR 中的相应位清零),也就是如果有中断来,芯片就会马

上再向CPU 发出中断请求,即使CPU 正在处理IRQ0 的中断,CPU 并不知道谁的优先级高,

它只会简单的响应8259A 送来的中断,因此,这种情况下低优先级的中断就可能会中断高

优先级的中断服务程序。所以在PC 中,我们总是将EOI 位清零,而在中断服务程序结束的

时候才发送EOI 消息。

注意一点,发EOI命令的时候,先发送给从片,再发送给主片

x58添加uefi_在看UEFI CODE相关推荐

  1. x58添加uefi_修改为UEFI引导的方法,不需要重装

    本文旨在分享一下我在不重装系统的情况下,怎样将系统引导方式改为UEFI+GTP. 看过我以前发过的文章可能还记得,我是如何辛苦的把锐龙处理器加B350M主板安装成win7系统→新电脑装win7?锐龙. ...

  2. win10pe  win10pe Nvme 启动盘_大白菜 uefi_   什么是UEFI启动

    win10pe  win10pe Nvme 启动盘_ 大白菜官网,大白菜winpe,大白菜U盘装系统, u盘启动盘制作工具 uefi_ 什么是UEFI启动? == win10pe 可以下载 大白菜 . ...

  3. x58添加uefi_X58平台老台式机升级固态硬盘以及三通道内存

    过年回家寻思着帮父母把家里的老PC给升级一下换换血,也方便家里的小朋友上网课.这台电脑是2009年我上初中之前自己DIY的.配置如下图: 在当时应该算是顶配了,第一代i7刚上市,走了一手X58平台.由 ...

  4. uefi linux开发环境,开发者为 Linux 添加了一系列 RISC-V UEFI 支持补丁

    今年早些时候 Linux 中的 UEFI 代码已经进行过清理,随后一系列 RISC-V UEFI 支持的早期补丁被提出,形成了更为全面的补丁集,用于在 Linux 下启用 RISC-V 的 UEFI ...

  5. Revit中添加了标高看不见原来轴网解决方法及轴网转化

    一.Revit中添加标高看不见轴网怎么处理? 在Revit中绘制的轴网会默认超过最高标高一定距离,因此若新绘制的标高在这距离之上时怎么办呢?难道要重新绘制轴网么?如图1所示. 这种情况下我们只要进入一 ...

  6. bios uefi_什么是UEFI,它与BIOS有何不同?

    bios uefi The BIOS will soon be dead: Intel has announced plans to completely replace it with UEFI o ...

  7. 青茶什么时候拆_为什么铁观音这么香?到底有没有添加香精?看完你就知道了...

    小编经常被茶友问到:铁观音为什么这么香?是添加香精的吗?带着这个话题,予言茶事今天来跟大家聊一聊关于铁观音的香气问题. 首先,回答一下茶友的质疑:铁观音的香气来源于茶叶本身,其特殊的制茶工艺促使茶叶内 ...

  8. html模板怎么添加背景音乐,不知道怎么给微信页面模板里添加背景音乐?看这里!...

    各位小伙伴有没有发现有一部分的页面模板,我们点进去以后会自动有音乐播放,给用户的体验感特别好,这个就是页面模板的背景音乐功能. 大家千万不要小看背景音乐的重要性,不同的音乐可以给人带来不同的感觉.比如 ...

  9. 怎么给视频添加字幕?看完这篇文章你就清楚了

    视频字幕是指在视频中添加的文字信息,用于说明.解释或强调视频内容.字幕在视频制作中非常重要,可以帮助观众更好地理解和记忆视频内容,同时也能提高视听体验.以下给小伙伴们普及视频字幕的相关内容,感兴趣的小 ...

最新文章

  1. lmbs PHP,PHP的GD2函数创建折线图源码示例
  2. C++函数模板的重载
  3. ios 应用 开发流程。。。
  4. 利率计算中的套路!用 Python 告诉你究竟亏了多少!
  5. 线程的start()方法
  6. PHP checkdate()函数与示例
  7. 添加多个tomcat服务目录
  8. dhcp服务器能为客户端提供哪些信息,为DHCP客户端提供DHCP服务器的MAC [关闭]
  9. 添加自定义监控项目,配置邮件告警,测试告警,不发邮件的问题处理
  10. java 找序列最小值_【C++编程练习】任意给定 n 个有序整数,求这 n 个有序整数序列的最大值,中位数和最小值...
  11. mybatis中使用in查询时的注意事项
  12. iZotope RX 9 for Mac(受损音频修复工具)
  13. MVPArms框架学习遇到的一个问题——普通Activity配合Fragment出现空指针
  14. 修改typora主题的字体
  15. 芯片架构--四大处理器架构
  16. 对刚装好系统的Linux配置软件开发生产环境,让你开发效率一飞冲天!
  17. 智己汽车,兼顾豪华舒适和操控性能
  18. springboot启动错误--springboot At least one base package must be specified
  19. QPluginLoader 加载插件dll失败
  20. mysql服务在系统盘_重装系统后恢复MySQL服务

热门文章

  1. 爬虫进阶教程:抖音APP无水印视频批量下载
  2. Babylon.js 第27章 创建参数化网格
  3. Red Hat9.0 下的五笔输入法
  4. 鸿蒙os开发者创新大赛,【高校|加速孵化鸿蒙生态,华为首届HarmonyOS开发者创新大赛揭榜】...
  5. 禁止1200多种已知病毒的进程,做母盘必备!(转)
  6. ecplise插入图片太大_【Excel里插入图片时很大怎么办?我想把他设置成自动适应表格的大小。】excel图片固定大小...
  7. RT-PCR、QPCR、Real-time PCR、Real-time RT-PCR区别(自用)
  8. app定位、地图、坐标系的那些坑
  9. 三菱plc fx2N用梯形图写crc校验
  10. 百度云加速CDN代理和官方购买有区别,怎么才能更便宜实惠