2015年底的时候, UEFI Specification 2.6中新加入了一个 Ram Disk Protocol,但是一直以来我搞不清楚如何使用。到了 UDK2017 有了Demo,终于可以弄清楚使用方法。
实验环境是 QEMU X64。用到UDK2017中的OvmfPkgX64.dsc,编译[......]
分类: Funny
Arduino LED 的思考题
之前做了几块 LED Shield,焊接的是高亮的LED,在使用的发现实在是太亮了,排在一起很难分辨清楚,于是,重新买的普通LED焊接了一下。
0-7放的是红色LED,8-13放的是蓝色LED。可以看到,他们都能工作。
但是如果写出来下面这样的代码,只有红色LED[......]
Step to UEFI (128)汇编到机器码的转换
在很长一段时间里面因为有编译器的帮助,完全没有手工进行汇编语言和机器语言转化的需求。不过前面碰到了RDRAND 这样的指令,一方面说明CPU指令还在增长,另一方面也发觉还有这样的要求,于是进行一些探究。
从资料上看,目前还活着的汇编工具有 NASM。先查阅一下支持的指令【参考1】,确定支持了 RDR[......]
VC Console 读取 WMI 的例子
来自 https://msdn.microsoft.com/en-us/library/aa390423(v=vs.85).aspx
特别注意取得的 WMI 的 String 是 Unicode 的,输出时需要使用 %ls
#include "stdafx.h"
#define _[......]
Step to UEFI (127)RDRAND 再研究
前面提到过 RDRAND指令,最近再拿出来看一下,思考了更多问题。
前情提要:
具体的RDRAND指令是通过内嵌汇编实现的,在ASM中直接定义如下
; rdrand ax ; generate a 16 bit RN into ax,[......]
Step to UEFI (126)ReturnAddress 研究
最近查看代码发现 Base.h 中新添加了一个ReturnAddress的函数(称作宏更恰当)。对应代码如下:
#if defined(_MSC_EXTENSIONS) && !defined (__INTEL_COMPILER) && !defined (MD[......]
Step to UEFI (125)CPUBreakPoint 研究
最近在研究 Intel ITP,这是可以进行源码级别调试的硬件工具。刚使用就遇到一个有意思的问题:如何让代码在需要的时候停下来。最直接的想法就是编写死循环,但是很快发现因为编译器的优化,当它发现你编写的代码是死循环,那么它会自动优化掉后面的它认为跑不到的代码。因此需要另辟蹊径找到更标准的方法。
找[......]
Delphi 版的 KeyPressed 函数
有时候,我们需要在 console 中检查是否有按键按下,对于c语言来说,有 kbhit 和 keypressed, 但是Delphi库中没有对应的现成函数。
经过搜索,最终找到了一段代码【参考1】,根据这段代码,编写下面的测试程序:
program Project5; {$APP[......]
Step to UEFI (124) Ready_To_Boot Event
很早之前的代码,如果想完成在引导之前的一些工作,需要在Log中查找确定跳入引导代码之前的代码。直观,但是没有规范,同一个项目很容易出现好多代码都塞到同一处的情况。到了 UEFI ,规范中给出了一个规范的做法:使用 ReadyToBoot Event。对于这个,在《UEFI 原理与编程》第6章 事件有[......]
Step to UEFI (123)NOOPT 编译问题
之前我们在介绍 Source Level Debug 的文章中使用过 Noopt 的选项。后来找人请教了一下这个编译目标的含义:关闭一切编译优化。我猜测这样做的目的是为了让编译结果很容易实现汇编和 Source Code的一一对应。但是,很多情况下,编写EDK2代码的人都会忘记测试这个选项,于是,[......]