我正在尝试访问M1 Mac的框架缓冲区接口。我知道它与其他Mac有很大的不同,因为这些新Mac使用的是IOMobileFrameBuffer (它来自操作系统),而不是传统的IOFrameBuffer。
因此,我试图使用这段代码来访问这个框架缓冲区,但没有成功。
func makeIterator() -> io_iterator_t {
var port: mach_port_t = 0
var status = IOMasterPort(mach_port_t(MACH_PORT_NULL), &port)
guard status == KERN_SUCCESS else { return 0 }
guard let match = IOBSDNameMatching(port, 0, "AppleMobileCLCD") else { return 0 }
var iterator: io_iterator_t = 0
status = IOServiceGetMatchingServices(port, match, &iterator)
guard status == KERN_SUCCESS else { return 0 }
return iterator
}
我也尝试过使用"IOMobileFramebuffer“、"AppleCLCD”和"IOMobileFramebufferUserClient“字符串,但是匹配似乎不太好。
我还试图显示ioreg命令,它告诉我:
+-o IOMobileFramebufferUserClient
您知道如何找到访问此用户客户端的字符串吗?或者我的密码完全错了..。我试图在这个界面上寻找一些亮度。我觉得不太好,但我想试试.
谢谢!
发布于 2021-03-26 14:25:56
匹配(IOServiceGetMatchingServices
)调用没有返回要查找的对象的原因是匹配字典不正确。
首先,让我们看看您感兴趣的对象的ioreg
输出(命令行:ioreg -w0 -irc IOMobileFramebuffer
)。在我的Mac Mini上,它们看起来是这样的:
+-o AppleCLCD2 <class IORegistryEntry:IOService:IOMobileFramebuffer:IOMobileFramebufferService:IOMobileFramebufferAP:UnifiedPipeline2:AppleCLCD2, id 0x100000300, registered, matched, active, busy 0 (0 ms), retain 15>
[…]
+-o AppleCLCD2 <class IORegistryEntry:IOService:IOMobileFramebuffer:IOMobileFramebufferService:IOMobileFramebufferAP:UnifiedPipeline2:AppleCLCD2, id 0x1000002bc, registered, matched, active, busy 0 (0 ms), retain 14>
首先,IOBSDNameMatching
用于匹配在BSD子系统中具有等价的设备(本质上,它们出现在/dev/
下)--这是macOS上的几种设备的情况,例如块存储设备和串口。(如果它是用于此目的的正确函数,则还需要按照文档的指示传递kIOMasterPortDefault
作为第一个参数。)
我不知道您从哪里得到"AppleMobileCLCD"
,也许这是您系统中条目的名称(而不是Mini上的AppleCLCD2
)。
如果是这样的话,您需要使用IOServiceNameMatching
创建匹配的字典。
但是,按照名称进行匹配通常不是一个好主意,除非您有一个很好的理由;相反,使用IOServiceMatching()
按类名进行匹配。因此,例如:
guard let match = IOServiceMatching("IOMobileFramebuffer") else { return 0 }
这应该能行。
您通常无法匹配现有的用户客户端对象,例如您引用的ioreg
行中的对象,因为它们通常不会注册以进行匹配。(它们显示为!registered
)它们通常也没有任何可用的接口,因为它们是提供者对象的接口。
IOMobileFramebuffer
没有任何文档化的接口,但是也许您可以找到一些有用的东西来使用它。
https://stackoverflow.com/questions/66812863
复制相似问题