Friday, April 30, 2010

BIOS sleep and wake up related

reset process:
http://www.biosren.com/thread-2078-1-2.html

Linux hibernation:
http://blog.chinaunix.net/u2/66024/showart.php?id=2191092

BIOS是如何控制系统关机的!

http://www.biosren.com/thread-1596-1-4.html

请教如何实现在VC里读取ACPI table数据

http://www.ufoit.com/bbs/thread-241-1-1.html


如何跟踪ACPI代码

http://groups.google.com/group/acpi_cn/browse_thread/thread/3944d1c321adc93b?hl=zh-CN#

read write everything (tool to dump PCI, ACPI info)

http://jacky5488.myweb.hinet.net/

RSDP的问题

http://www.biosren.com/viewthread.php?&tid=1674

Wednesday, April 28, 2010

TPM realated papers

http://www.usenix.org/event/hotsec08/tech/full_papers/parno/parno_html/

Tuesday, April 27, 2010

SMM patents

http://www.faqs.org/patents/app/20090320128

hypervisor security:
http://www.faqs.org/patents/app/20100057982

Wednesday, April 7, 2010

WINDOWS与LINUX中的中断处理比较

最近刚好分别看了WINODWS和LINUX中的中断处理部分,趁着还没忘记,把感想写下来方便以后查询。

一.不同之处:

在WINDOWS中,有一个IRQL(注意不是IRQ)的概念。最早的时候,我以为是CPU设计里就包括了这个东东。后来看INTELCPU手册,发现似乎没有。最近又看了一遍WINDOWSINTERALS 4TH。感觉这个东西应该是包括在PICOR APIC里面的(关于APIC,可以看我以前的帖子)。对于X86-32,硬件设备的IRQ于IRQL之间的关系是:IRQL=27-IRQ。引入IRQL的动机似乎是这样的:当CPU运行在低IRQL时,如果来了一个高IRQL对应的中断,那么低的中断的ISR是会被高的ISR抢过去的。就是说低的ISR又被一个更高级的ISR中断了。

这样的好处是优先级高的ISR可以更快的得到响应。另外,在具体实现中,由于操作PICOR APCI改IRQL是比较费时的,所以WINDOWS是尽量不去直接操作硬件,而是等到万不得已的时候才改。

在LINUX中,似乎没有类似IRQL这样的观念。就我目前看过的书和代码来看,LINUX中的ISR或者是KERNLE最多是操作下CPU上的中断标志位(IF)来开启或者关闭中断。也就是说,要么中断全开,要么全关。似乎不会出现低的ISR被高的ISR中断的情况。从这一点来看,LINUX在这部分的设计上比WINDOWS简单。
(update 2015:  上面应该是关于老的LINUX, 新的LINUX 2.6 以后,request_irq的时候有一个FLAG,可以控制关闭所有的中断,还是只关自己的中断,默认是只关自己的中断)。

二.相似之处

WINDOWS和LINUX似乎都把中断分成了2部分。在LINUX中叫ISR(还是其他?)和BOTTOMHALF。而WINODWS中,DPC(DeferredProcedure Calls)和APC(AsynchronousProcedure Calls)就非常类似BOTTOMHALF。二者把中断分成两部分的动机是差不多的。都是为了把ISR搞得越快越好。

LINUX中,在ISR里一般关中断,所以时间太长的话,其他中断就得不到响应。WINDOWS中,ISR跑在一个很高的IRQL里面,同样会阻塞其他IRQL比较低的任务。LINUX中的BOTTOMHALF 又可以分为TASKLET和SOFIRQ。二者的主要区别是复杂度和并发性(CONCURRENCY)。下面COPY自一书。

Tasklet: Only one instance of each tasklet can run at anytime. Different tasklets can run concurrently on different CPUs.
Softirq: Only one instance of each softirq can run at thesame time on a CPU. However, the same softirq can run on different CPUsconcurrentlyOnly one instance of each softirq can run at the same time on aCPU. However, the same softirq can run on different CPUs concurrently.

WINDOWS中的DPC有点类似TASKLET和SOFTIRQ。DPC是系统范围内的,并且运行在DPCIRQL。是一个类似中断上下文的环境(INTERRUPTCONTEXT)。APC和DPC的区别是运行在更低级别的APCIRQL。另外,APC是针对每一个线程的。执行在某个线程环境中。主要目的也是把一部分事情放到以后去执行。APC又分为KERNELAPC 和USERAPC。

APC这个观念在LINUX中似乎没有类似的?至少我还没想到。

三.参考文献:

1.WINDOWSINTERALS 4TH
2.UNDERSTANDINGLINUX NETWORK INTERNALS, 2005

文中也许有些不对的地方,欢迎大家讨论。