HAL能够对硬件访问这是显而易见的,下面说一下应用程序和驱动程序对硬件的访问方法
应用程序和驱动程序对硬件的访问有两种,一种是在用户态,使用VirtualAlloc和VirtualCopy,这两个函数原型为
LPVOID VirtualAlloc(
LPVOID lpAddress,
DWORD dwSize,
DWORD flAllocationType,
DWORD flProtect
);
BOOL VirtualCopy(
LPVOID lpvDest,
LPVOID lpvSrc,
DWORD cbSize,
DWORD fdwProtect
);
首先通过VirtualAlloc来获得一段虚拟地址空间的分配,然后VirtualCopy可以将一个虚拟地址绑定到一个物理地址上,从而实现对物理硬件的访问。
这一直是我以为唯一的访问硬件的方法,可是今天看一段源代码的时候,发现了另外一种--IST
IST是运行于内核态的中断处理线程,所以他与内核使用相同的线形虚拟空间,可以非常方便的映射到相应的物理地址。
能够访问硬件的线程是只能由驱动程序创建的,这主要是线程跟创建该线程的进程是共享同一虚拟地址空间的,如果有应用程序创建,它就是与应用程序使用同一空间,很明显访问不到硬件的地址,而驱动程序是被内核初始化,是与内核使用同一空间,因此,它创建的线程就可以直接访问硬件。
很明显,主要是由驱动程序创建的线程,都可以访问到硬件,而不管是不是中断服务线程。如果要做中断服务,该线程就应该与一个相应中断时间挂钩。