- #define IMPLICIT_CALL(hid, mid) (FIRST_METHOD - ((hid)<<HANDLE_SHIFT | (mid))*APICALL_SCALE)
#define IMPLICIT_DECL(type, hid, mid, args) (*(type (*)args)IMPLICIT_CALL(hid, mid))
#define WIN32_CALL(type, api, args) IMPLICIT_DECL(type, SH_WIN32, W32_ ## api, args)
下面是个例子:#define U_ropen WIN32_CALL(int, ropen, (const WCHAR *, UINT))
#define W32_ropen 17
#define SH_WIN32 0
#define FIRST_METHOD 0xFFFFFE00
#define APICALL_SCALE 2
#define HANDLE_SHIFT 8 - 可以看出,WIN32_CALL定义了一个函数,它的类型是:type (*) args;它的地址是由IMPLICIT_CALL定义,这是一个固定的地址数值。故当进行函数调用时,程序会跳到这个指定的地址。
- 上面提到的地址中存储的是什么指令呢?下面进行回答:在操作系统初始化时,会初始化一个叫做SysCall的页面和一个叫做SysCallDir的页面。SysCall页面的每个字的内容是0x20cdh,即int 20指令。SysCallDir是一个页表,其中的每一项都指向SysCall页面。而在MMU的页目录中的0x0FFCh项则指向SysCallDir这个页表。故逻辑地址0xFFC00000h---0xFFFFFFFFh(我们称这个空间为系统调用空间)中的每一个字的内容都是int 20这个指令。
- 现在再来看一下1中的IMPLICIT_CALL宏,可以看出这个宏在定义数值时是以FIRST_METHOD为上限的,而这个数值则落在系统调用空间中。可以这么说,WIN32_CALL定义的函数的地址均落在系统调用空间中。故进行系统调用时,会执行int 20指令,从而进入内核系统空间。
- 在讨论完了系统调用是如何执行的后,我们来看一下各个系统调用函数在系统调用空间中的分配。通过IMPLICIT_CALL的定义知,系统调用空间被划分为多个大小为(1<<HANDLE_SHIFT*APICALL_SCALE)字节的区域,即256*2字节的区域。例如上面的SH_WIN32即是其中的一个区域,其他的见Kfuncs.h。
关于CE的系统调用
最新推荐文章于 2023-08-04 09:19:06 发布