在userland中使用iokit对象句柄执行某些操作时,例如IOConnectCallmethod
通过mach_msg(Mach_trap,
之一)进入内核(与其他MIG电话相同) - >在调用is_io_connect_method之前的util,有一个将ipc_port转换为iokit对象的操作
connection = iokit_lookup_connect_port(In0P->Head.msgh_request_port);
和iokit_lookup_connect_port里面:
MIGEXTERN io_object_t
iokit_lookup_connect_port( ipc_port_t port){
register io_object_t obj;
if (!IP_VALID(port))
return (NULL);
iokit_lock_port(port);
if (ip_active(port) && (ip_kotype(port) == IKOT_IOKIT_CONNECT)) {
obj = (io_object_t) port->ip_kobject;
iokit_add_connect_reference( obj );
}
else
obj = NULL;
iokit_unlock_port(port);
return( obj );
}
每次成功通话都必须调用iokit_lock_port和iokit_unlock_port
EXTERN void
iokit_lock_port( __unused ipc_port_t port )
{
lck_mtx_lock(&iokit_obj_to_port_binding_lock);
}
EXTERN void
iokit_unlock_port( __unused ipc_port_t port )
{
lck_mtx_unlock(&iokit_obj_to_port_binding_lock);
}
但是为什么即使调用相同的IOKit方法仍会导致竞争条件?
我试过如果我在IOKit方法中添加锁代码,或者在竞争条件的方法之前,锁可以保护成功, 但为什么锁定iokit_lock_port / iokit_unlock_port不能?