咨询:为EDK2的OVMF实现非美式布局UEFI键盘驱动的更佳方案
非美式键盘布局的EFI支持优化方案
无需替换默认驱动的HII布局注入方案
原生键盘驱动(VirtioKeyBoardDxe、Ps2KeyboardDxe、UsbKbDxe)本身已支持通过UEFI HII(人机接口基础设施)加载自定义布局,完全不需要修改或替换原有驱动。核心思路是借助EFI_HII_DATABASE_PROTOCOL的API,在系统启动阶段注入你的非美式布局数据并设为默认。
具体实现步骤
编译布局为HII二进制包
用EDK2工具链的GenHiiKeyboardLayout工具,将符合UEFI规范的.kl布局定义文件编译成HII可识别的二进制包:GenHiiKeyboardLayout -o CustomLayout.hii MyNonUsLayout.kl生成的
.hii文件包含键映射、字符映射等所有布局必要数据。编写轻量注入逻辑
写一个小型EFI应用(或早期启动驱动),在Shell启动前执行以下操作:- 定位并打开
EFI_HII_DATABASE_PROTOCOL; - 调用
NewPackageList()将CustomLayout.hii注入HII数据库; - 用
FindKeyboardLayouts()枚举布局,找到你注入的布局GUID; - 调用
SetKeyboardLayout()将该布局设为当前活动布局。
这种方式复用原有驱动的硬件交互逻辑,仅处理布局注入和切换,代码量远小于修改驱动。
- 定位并打开
设置自动启动
将该应用注册为UEFI启动项,或实现为早期启动驱动,确保在Shell/OS启动前完成布局切换。
对比驱动替换方案的优势
- 低侵入性:无需修改EDK2原生驱动代码,避免版本更新时的合并冲突;
- 可扩展性:可同时注入多种布局,用户能在UEFI设置中手动切换;
- 维护成本低:仅需维护布局文件和注入逻辑,无需跟进原生驱动的代码变更;
- 兼容性强:完全遵循UEFI规范,兼容所有支持HII的键盘驱动。
额外优化点
- 若需重启后保持布局,注入后调用
SetKeyboardLayout()的同时,将布局GUID写入UEFI变量EFI_KEYBOARD_LAYOUT_VARIABLE_NAME(定义于UefiMultiPhase.h); - 可在注入应用中添加简单交互,允许用户启动时选择不同布局。
内容的提问来源于stack exchange,提问作者Johannes Krottmayer
相关产品推荐
相关产品推荐

