试硬件环境,Python 需要能够访问它。一个叫做“bits”的模块被添加进来提供访问各种硬件的功能,例如:CPUID,特殊模块寄存器 (MSRs),I/O 端口,和内存映射 I/O。他用几行代码展示了这些能力。
他引入ctypes模块,以便在下一部分演示中“操作原始内存片”。对于那些想要深挖一些的人来说,几乎所有演示都可以在这个YouTube视频的演讲中看到。cpuid()调用返回了CPU0的CPUID,他之后将其打印出来。他问:“这是不是很有趣?我们正从Python中得到处理器的寄存器信息。”?接着,他使用Python来解释这个结果:
三个寄存器包含描述处理器类型的标识符。他使用ctypes模块中的类型,以字符串的形式重新解释这三个寄存器(按照之前的顺序)的信息,结果显示为处理器类型。
Intel希望能够测试高度并行化的系统,但GRUB只了解启动了的CPU的信息。所以BITS在系统中唤醒每个CPU,并把它们放入一个睡眠循环中,使用MWAIT(x86监视器等待指令)等待工作的到来。特定CPU有专门的唤醒函数和执行函数。
这个项目还准备用Python获取ACPI的信息和方法。这参考了ACPI组件架构?(ACPICA)的实现并把它加入BITS中。由于全部是C代码,所以增加了Python绑定。这一做法使得Python可以调用任意ACPI方法——只要先将参数转换成ACPI类型并将结果转成Python类型。他用了一个简单的Python程序演示了如何将虚拟机中所有设备的硬件ID显示出来:
Triplett声称他不会继续深入讲解BITS硬件探索的细节。他已经在其它演讲中更加详尽地解释过了。?
英特尔也希望系统能使用这个固件而不是BIOS访问EFI。这种扩展名义上是指一切在EFI中都是”协议“,每一个都包含了原生c语言函数调用。要做到这样,通过libffi提供的外部函数接口被移植到GRUB并且添加了支持EFI调用转换的功能。使用这种方式和Python c类型的模块(Python提供的c语言类型的接口和函数)允许解释器访问EFI。他仅使用Python演示了访问EFI的方法:
访问EFI后,允许Python使用EFI文件协议去创建目录和写文件到EFI文件系统中。这是非常有帮助的,因为GRUB仅仅能够读文件。不仅仅如此,存在着图像输出协议(GOP)能够读写屏幕内容。正如他所解释的,幻灯片就是简单的图像,事实上是通过在笔记本上BITS和EFI显示出来的。在BITS的环境下,做出了这个幻灯片和demo,因此,事实来说,整个演示就是一个demo,他说这些话时周围响起了掌声。这样做是不需要任何一行新的C语言代码的。
最后他保存了认为最好的demo,并从EFI(可扩展固件接口)GOP(画面组)的帧缓冲区中作为Python启动,当他敲完最后的几行代码,很明显机器开始识别了,计算并显示了一个400x400大小的 Mandelbrot set(曼德布洛特集合)的灰度图片。他对周围鼓掌的人说:“在EFI图形协议中仅用八行Python代码显示了不规则图形(Fractal)”。大约要15秒来绘出图像,有点慢,他说,那不是Python的问题,而是因为使用纯软件进行浮点运算了。
在谈话最后,Triplett指出在BITS(后台智能传输服务)里没有中断处理的钩子函数(hook),但是这很容易就添加上的。他说,在像Mirage OS(和其它的“类似操作系统”)也能在BITS上添加Python代码,并且和这没有多大区别。“待办事件清单上的下一个有趣的项目”是添加Python绑定的EFI TCP网络协议和钩子到Python的socket模块,看看能否在那样的环境(BITS)下运行一个简单的HTTP服务(SimpleHTTPServer)。这样就能添加一个“网络REPL(web REPL)”到BITS环境了。
--------------------------------------分割线 --------------------------------------
英文原文:Python without an operating system