WinCE5读核笔记(五) KCall的实现

本文深入探讨了WinCE5中KCall函数的实现细节,包括其在armtrap.s中的实现、函数原型、执行过程以及调度条件。KCall函数允许在不可抢占环境下执行指定函数指针,并在执行后根据需要进行调度。当检测到调度标志为1时,系统会通过SaveAndReschedule保存当前线程上下文并进行线程切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

KCall的实现

这个函数在内核中随处可见,它的实现是在armtrap.s中实现。

函数原型

int KCall(PKFN pfn, ...);

其中

typedef int (*PKFN)();

这个函数是可变数量的参数。第一个参数是函数指针。第二个参数是不定参数。规定,对于可变参数个数的传递,参数在4个以内,分别用r0,r1,r2,r3。超过的部分就用堆栈传递。


KCall使pfn 在不可抢占的环境中运行,并在执行完之后,函数返回之前,如有需求,那么将有一次调度的机会。

过程

KCall先将CPU切换到SVC mode,执行pfn,然后切换到system mode,检查需不需要调度。

如果需要调度,那么CPU再切回到SVC mode,并且关闭终端,跳转到SaveAndReschedule

调度条件

ldr r3, =KData ; (r3) = ptr to KDataStruct

ldrb r12, [r3, #bResched] ; (r12) = reschedule flag

cmp r12, #1

其实这里就是检测struct KDataStruct 结构体的成员bResched,如果是1,那么标志需要调度。

SaveAndReschedule

用于准备threadcontext,也就是填充struct Thread中的CPUCONTEXT ctx成员。它记录着CPU所有寄存器的内容,他们共同组成了thread context。之后进入FirstSchedule开始线程切换过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值