UEFI开发探索04 – 与键盘的互动

(请保留-> 作者: 罗冰   luobing4365的博客_CSDN博客-UEFI开发,汇编语言探索,嵌入式开发领域博主)

我当年学习UEFI的最终目标是实现UEFI Oprom,写入PCI-E ROM,作为隔离卡的底层软件运行。中间的一个目标是编写UEFI driver/application,与bios一起编译,同样是作为底层软件,与另外一款卡通讯。当时是与联想共同开发了一款安全隔离计算机,中间目标就是为这款产品而设的。

最后两个目标都实现了,当年刚做的时候还是比较辛苦的。第一个面临的问题就是使用哪种程序入口。有三种可选:UefiMain,main,ShellAppMain。

参照当时能找到的资料,《Beyond BIOS》、《Harnessing the UEFI Shell》以及UEFI spec(当年看的是2.3,现在都到2.9了),还有bios之家、网友的博客,终于摸到了一些门径。

图1 曾经使用过的参考资料

当年的我并不了解这些程序入口的区别,是最近写博客的时候看《UEFI原理与编程》时才有所了解(终于有本中文版的参考资料了!感谢作者戴正华,有机会真想拜见)。

我的理解,main和ShellAppMain肯定是不能用在Option ROM上的。那么多的链接库,一是没法放进去,二是即便可以放进去,工作量也太大了。简单来说,就如同我之前开发的Legacy Option ROM一样,只能调用int 10h,int 13h,int 16h等这些bios中断,想调用int 33h这些DOS中断,你只能把整个DOS弄进去(更别提那个时候可能BIOS都还没准备好,放进去也运行不了)。

不过,使用main的程序入口,可以很方便的进行Shell下的测试。所以在实现这第一个程序的时候,我选择了这种编译方式。

如图,使用的是以下的API(UEFI spec 2.8 Page431):

图2 访问键盘所用API

API还是很好理解的,看EFI_KEY_DATA的数据结构,与int 16h 0号功能返回的是一样的。我不知道UEFI是怎么处理硬件中断9的,估计也是封装在了这些API中。

程序编写相对比较容易,gBS和gST是预置的,直接使用就可以了。(代码在文末提供下载地址)根据API的说明,我编写了一个获取键盘输入的函数GetKeyEx,将用户输入的键盘信息保存下来。

上述的工作相对比较简单,有点麻烦的是准备编译。使用main函数的工程模块需要在AppPkg环境下才能成功编译。

为方便后续的开发,我在根目录下建立了一个\_LuoApp的文件夹。在\AppPkg\AppPkg.dsc中添加相应的inf文件,指明要编译的代码,如图所示。

图3 建立编译用的目录

(20190512 20:13 Robin: 这次的编译仍旧使用了UDK2010的环境。我试图搭建UDK2017或UDK2018,都不成功。有的NT32Pkg可以编译,但是AppPkg无法编译通过;有的则连Nt32Pkg都编译不通过。VS2013和VS2015都试过了,怀疑是我VS版本有些问题。)

修改target.txt,设置为如下参数:

ACTIVE_PLATFORM       = AppPkg/AppPkg.dsc
TARGET_ARCH           = IA32
TOOL_CHAIN_TAG        = VS2008

打开Visual Studio 2008 command,编译:

C:\MyEorkSPace>edksetup.bat
C:\MyEorkSPace>build
或者build -p AppPkg\AppPkg.dsc -a IA32 -t VS2008 (不需要修改target.txt了)。

生成的文件为c:\myWorkSpace\Build\AppPkg\DEBUG_VS2008\IA32\_LuoApp\Luo2\Luo2\OUTPUT\Luo2.efi

将其拷贝至之前编译好的NT32下(主要是可以使用SecMain.exe):

c:\myWorkSpace\Build\NT32\DEBUG_VS2008\IA32\

运行SecMain.exe,测试Luo2.exe:

图4 编译好的键盘处理程序

代码放在百度云上,对照看下,逻辑还是比较简单的,将用户的按键信息打印出来。这个程序是以main入口函数来编写的,另外也编写了一个UefiMain入口函数的程序,功能一样,也在云端。

至此,实现了键盘的访问。如需要在实际机器上运行,只要修改编译参数即可。

Gitee地址:https://gitee.com/luobing4365/uefi-explorer
项目代码位于:/
01 ReadKeyEx

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
从BIOS到UEFI,是计算机引导程序的演进过程。 BIOS是基本输入输出系统(Basic Input/Output System)的简称,它是一组固化在计算机主板上的固件程序。BIOS的主要功能是在计算机开机时对硬件进行初始化,并将控制权转移给操作系统。然而,随着计算机硬件的不断进化和操作系统的更新,BIOS逐渐暴露出了一些局限性,比如启动速度较慢、内存限制等。 为了克服这些问题,UEFI(统一可扩展固件接口)应运而生。UEFI是一种现代的计算机固件接口规范,它取代了传统的BIOS。与BIOS相比,UEFI具有更多的优势。首先,UEFI支持更大的硬盘驱动器,允许操作系统和应用程序访问更多的存储空间。其次,UEFI还支持更加丰富和灵活的图形界面,使用户能够更方便地进行设置和操作。此外,UEFI还引入了许多新的功能,如网络启动、安全启动等,增强了计算机的性能和安全性。 从开发角度来看,BIOS和UEFI开发也有所不同。对于BIOS而言,开发人员主要需要熟悉硬件架构和编程语言,如汇编语言,以实现硬件初始化和操作系统加载。而对于UEFI开发人员则需要掌握C语言和面向对象编程,因为UEFI基于C语言进行开发,并且引入了面向对象的编程理念。此外,UEFI还需要开发和维护固件升级机制以及兼容性测试,以确保固件的稳定性和功能完整性。 总之,从BIOS到UEFI的发展是计算机引导程序的演进过程。UEFI作为一种现代的固件接口规范,解决了传统BIOS存在的一些问题,并且具备更多的扩展性和功能。从开发角度来看,UEFI需要掌握不同的编程语言和技术,以实现固件的开发和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luobing4365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值