关于CE的系统调用

  1. #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
  2. 可以看出,WIN32_CALL定义了一个函数,它的类型是:type (*) args;它的地址是由IMPLICIT_CALL定义,这是一个固定的地址数值。故当进行函数调用时,程序会跳到这个指定的地址。
  3. 上面提到的地址中存储的是什么指令呢?下面进行回答:在操作系统初始化时,会初始化一个叫做SysCall的页面和一个叫做SysCallDir的页面。SysCall页面的每个字的内容是0x20cdh,即int 20指令。SysCallDir是一个页表,其中的每一项都指向SysCall页面。而在MMU的页目录中的0x0FFCh项则指向SysCallDir这个页表。故逻辑地址0xFFC00000h---0xFFFFFFFFh(我们称这个空间为系统调用空间)中的每一个字的内容都是int 20这个指令。
  4. 现在再来看一下1中的IMPLICIT_CALL宏,可以看出这个宏在定义数值时是以FIRST_METHOD为上限的,而这个数值则落在系统调用空间中。可以这么说,WIN32_CALL定义的函数的地址均落在系统调用空间中。故进行系统调用时,会执行int 20指令,从而进入内核系统空间。
  5. 在讨论完了系统调用是如何执行的后,我们来看一下各个系统调用函数在系统调用空间中的分配。通过IMPLICIT_CALL的定义知,系统调用空间被划分为多个大小为(1<<HANDLE_SHIFT*APICALL_SCALE)字节的区域,即256*2字节的区域。例如上面的SH_WIN32即是其中的一个区域,其他的见Kfuncs.h。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值