标签: kernel-extension

无法在OS X中开始使用kext开发

我正在尝试做Apple的"内核扩展"教程.我创建了一个项目文件,创建了Info.plist,构建了它,使用kextlibs来学习依赖关系,将它们添加到Info.plist中,重建,复制到/ tmp,使用kextutil来测试它.到目前为止一切都很好.但是,当我尝试加载kext时,我的启动/停止/探测功能似乎永远不会被调用.我的IOLog消息没有出现在/var/log/system.log中.

实际上,system.log没有显示任何内容.在使用sysctl -w debug.kextlog = 0x0007780E激活kext日志记录后,kernel.log执行了.kernel.log说:"Kext ch.digorydoo.driver.XinputDevice成功解决了依赖关系." 然后:"刷新未加载的kexts和其他未使用的数据." 也许我的班级会立刻变得脸红?

我的类出现在kextstat的末尾,但有0个引用.与ioclasscount相同.在ioreg,我的班级没有出现.

我已经将IOProviderClass设置为IOResources,所以它应该始终有一个引用,对吧?我已正确设置IOMatchCategory.

有什么帮助吗?!!?!非常感谢!

编辑:这是我的Info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>English</string>
    <key>CFBundleExecutable</key>
    <string>${EXECUTABLE_NAME}</string>
    <key>CFBundleName</key>
    <string>${PRODUCT_NAME}</string>
    <key>CFBundleIconFile</key>
    <string></string>
    <key>CFBundleIdentifier</key>
    <string>ch.digorydoo.driver.${PRODUCT_NAME:rfc1034identifier}</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundlePackageType</key>
    <string>KEXT</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1.0.0</string>
    <key>IOKitPersonalities</key>
    <dict>
        <key>Generic Xinput Gamepad</key>
        <dict>
            <key>CFBundleIdentifier</key>
            <string>ch.digorydoo.driver.${PRODUCT_NAME:rfc1034identifier}</string>
            <key>IOProviderClass</key>
            <string>IOResources</string>
            <key>IOMatchCategory</key>
            <string>ch_digorydoo_driver_XinputDevice</string>
            <key>IOClass</key>
            <string>ch_digorydoo_driver_XinputDevice</string>
            <key>IOKitDebug</key>
            <integer>65535</integer>
        </dict>
    </dict>
    <key>OSBundleLibraries</key>
    <dict>
        <key>com.apple.kpi.iokit</key>
        <string>10.8</string>
        <key>com.apple.kpi.libkern</key>
        <string>10.8</string>
        <key>com.apple.kpi.mach</key>
        <string>10.8</string>
    </dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

macos kernel iokit kernel-extension

6
推荐指数
1
解决办法
2852
查看次数

小牛队中的Kext Code签名错误

我们有一个音频内核扩展,安装在/ Library/Extensions中.根据苹果新指南(WWDC视频707),我们应该编写安装/ Library/Extensions的签名kext.我们请求apple为我们的开发者ID启用kext代码签名属性,现在它已启用.根据我们从苹果公司得到的邮件回复就像这样说

如果您之前已获得应用程序签名的开发者ID,则需要重新下载开发人员ID以获取更新的证书.

因此,我们redownloded证书和codeigned签署了kext.代码编译正常但是当我们尝试使用下面的命令sudo kextutil -tn KEXTPATH验证代码符号时

它给出了以下错误 - 代码签名失败:代码签名无效KEXT_PATH似乎是可加载的(包括磁盘库的链接).

任何人都可以帮我解决这个错误.

macos code-signing kernel-extension osx-mavericks

6
推荐指数
1
解决办法
3359
查看次数

在小牛队/优胜美地队无法签下kext?

目标:签署我自己的包和我自己的内核扩展.上下文中的"我自己的"意味着"我写的,或者我在其他地方选择的,从他们的来源重新编译自己,并希望在我的机器上安装.

问题:小牛队不接受我的签名Code Signing Failure: code signature is invalid(但加载了kext),Yosemite甚至不会加载它.

我有自己的CA和代码签名证书.我已经能够成功登录密码和设置,将允许安装由给定的证书签名的代码并执行的政策-无论是协同设计SPCTL喜欢它,因为你在下面的输出中看到.但是,这似乎不适用于kext(内核扩展) - kextutil坚持签名无效.这是我得到的输出:

$ codesign --verify -vvvv /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: valid on disk
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: satisfies its Designated Requirement

$ spctl -a -vvv -t exec /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: accepted
source=XXXXXCode
origin=XXXXXCoder
$ spctl -a -vvv -t install /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: accepted
source=XXXXXInstall
origin=XXXXXCoder

$ kextutil -tn /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext
Diagnostics for /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext:
Code Signing Failure: code signature is invalid
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext appears to be loadable (including linkage for on-disk libraries).
Run Code Online (Sandbox Code Playgroud)

在小牛队,这个kext加载了警告信息,在优胜美地上它不会.

我注意到 …

macos code-signing kernel-extension osx-mavericks

6
推荐指数
2
解决办法
4542
查看次数

如何在OSX上表示内核恐慌报告?

我想知道如何表示内核恐慌报告(不是常规应用崩溃报告).我有一个OSX应用程序,用户声称导致内核恐慌.它不会安装任何内核扩展,而是安装启动守护程序.我已关注此链接https://developer.apple.com/library/mac/technotes/tn2063/_index.html但它仅描述了导致内核崩溃的第三方内核扩展的符号化步骤.如果我没有安装任何kext,我该如何表示以下恐慌报告?任何帮助都会很明显.

Anonymous UUID:      DF6F780A-AA27-6D40-3441-F26F828C7096
Tue Oct 27 12:02:41 2015
*** Panic Report ***
panic(cpu 1 caller 0xffffff80111d6a9a): Kernel trap at 0xffffff80113cec30, type 14=page fault, registers:
CR0: 0x000000008001003b, CR2: 0x0000000100000057, CR3: 0x000000025eade116, CR4: 0x00000000001627e0
RAX: 0xffffff8037f9bdb0, RBX: 0xffffff803e68cd08, RCX: 0xffffff8037f9bdb0, RDX: 0xffffff8011910910
RSP: 0xffffff9236923890, RBP: 0xffffff9236923900, RSI: 0x0000000000000001, RDI: 0xffffff8011910910
R8:  0x0000000000000000, R9:  0x00000000000001f0, R10: 0xffffff80118ddb78, R11: 0x0000000000000000
R12: 0x00000000ffffffff, R13: 0x0000000000000000, R14: 0xffffff80117a1f7b, R15: 0xffffff8031c77a40
RFL: 0x0000000000010206, RIP: 0xffffff80113cec30, CS:  0x0000000000000008, SS:  0x0000000000000000
Fault CR2: 0x0000000100000057, Error code: …
Run Code Online (Sandbox Code Playgroud)

macos symbolicate kernel-extension symbolicatecrash

6
推荐指数
0
解决办法
821
查看次数

如何从apple站点获取套接字过滤器句柄(sflt_filter.sf_handle)的值以注册数据包过滤

我正在尝试获取套接字过滤器的句柄密钥以注册数据包过滤.我已经注册了TCP数据包,现在我想将其注册为UDP数据包.此句柄键需要与其他应用程序不同.

sflt_filter.sf_handle = 0xAACAF333;
Run Code Online (Sandbox Code Playgroud)

我在大约2年前使用链接(http://developer.apple.com/datatype/)获得了它,但它现在被重定向到不同的链接.

我已经阅读了它说的创建者代码被10.6及以上忽略的链接.但是为了实现用于数据包过滤的kext,我们需要该代码是唯一的.

有没有人知道如何获得唯一密钥?或者不需要获取唯一密钥?或者他们现在使用手柄的方式不同了吗?

提前致谢.

c macos kernel udp kernel-extension

5
推荐指数
1
解决办法
140
查看次数

USBInterfaceOpen 总是报 kIOReturnExclusiveAccess 错误

最近遇到这个问题很头疼,我已经在这个问题上花了一个星期,但还是失败了。希望你能帮我把这块石头踢开,非常感谢。

我的问题:我们公司为iPhone生产USB存储设备,实际上这个存储设备中有一个SDCard。现在,我们要开发一个 Mac 应用程序来更新此存储设备的固件。但每次我的存储设备连接到Mac时,苹果会自动安装它,我总是失败,kIOReturnExclusiveAccess调用时USBInterfaceOpen

我也尝试写一个无代码的kext来增加探测分数,但它仍然不起作用。我不知道是我走错了路,还是在编写无代码 kext 时出现了一些错误,例如,写了一些错误的 IOClass、错误的包 ID。

我的无代码 kext info.plist 是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>BuildMachineOSBuild</key>
  <string>14E46</string>
  <key>CFBundleDevelopmentRegion</key>
  <string>en</string>
  <key>CFBundleIdentifier</key>
  <string>com.mophie.MyDriverTest3</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>MyDriverTest3</string>
  <key>CFBundlePackageType</key>
  <string>KEXT</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>1.0.3</string>
  <key>DTCompiler</key>
  <string>com.apple.compilers.llvm.clang.1_0</string>
  <key>DTPlatformBuild</key>
  <string>6E35b</string>
  <key>DTPlatformVersion</key>
  <string>GM</string>
  <key>DTSDKBuild</key>
  <string>14D125</string>
  <key>DTSDKName</key>
  <string>macosx10.10</string>
  <key>DTXcode</key>
  <string>0640</string>
  <key>DTXcodeBuild</key>
  <string>6E35b</string>
  <key>IOKitPersonalities</key>
  <dict>
    <key>MyDriverTest3</key>
      <dict>
        <key>CFBundleIdentifier</key>
        <string>com.apple.iokit.IOUSBFamily</string>
        <key>IOClass</key>
        <string>IOService</string>
        <key>IOProviderClass</key>
        <string>IOUSBDevice</string>
        <key>bcdDevice</key>
        <string>256</string>
        <key>idProduct</key>
        <integer>4369</integer>
        <key>idVendor</key>
        <integer>6631</integer>
      </dict>
  </dict> …
Run Code Online (Sandbox Code Playgroud)

usb kernel iokit kernel-extension

5
推荐指数
1
解决办法
1282
查看次数

如何在OSX中测量L1,L2,L3缓存命中和未命中

我有一个C++程序,我想通过检查CPU缓存的命中数和未命中数来量化它的性能.

最好的方法是什么?

我尝试使用英特尔的性能计数器监视器,但它使用了在Yosemite上禁用的未签名内核扩展.我显然可以禁用检查以不加载未签名的kexts,但我不想沿着那条路走下去.

还有其他可能的方式我不知道吗?

macos performance kernel-extension cpu-cache

5
推荐指数
1
解决办法
1194
查看次数

性能分析 KEXT

在某些用户定义的活动期间,如何在 CPU、内存或线程使用方面衡量 OS X 中 kext 的性能影响?任何可以从用户空间使用的特定方法工具?或任何可以考虑的方法/方法?

macos kernel-module performance-testing kernel-extension

5
推荐指数
1
解决办法
335
查看次数

将无代码 KEXT 迁移到无代码 DEXT

我正在将无代码 KEXT 迁移到无代码 DEXT。我观看了 WWDC 视频并阅读了 Apple 开发者网站上的大量信息。我遇到的困难不是找到要做什么,而是找到如何开始。带有示例项目的不错的教程会有所帮助。

在我的无代码 KEXT 中,对于 4 个独立的设备,每个设备都有 IOUSBDevice 和 IOUSBInterface 的 IOKitPersonalities。KEXT 允许我将我的设备与我的“驱动程序”相匹配,这样 Apple HID 驱动程序就不会抓住它们。我希望在无代码 DEXT 中做相同或类似的事情。

到目前为止,我已经在应用程序中创建了一个名为 MyUsbDriver 的 DriverKit 目标(用于 DriverKit.framework),并添加了 USBDriverKit.framework。这会向我的项目添加一个文件夹 MyUsbDriver,其中包含文件 MyUsbDriver.cpp、MyUsbDriver.iig、Info.plist 和 MyUsbDriver.entitlements。这是我的问题:

  1. 看起来 IOService 的默认子类适用于 USB - 这与 KEXT 中的 IOClass 相同。真的吗?

  2. DEXT 世界中的 IOUSBHostInterface 是否等同于 KEXT 世界中的 IOUSBInterface?

  3. IOUSBHostDevice 是否等同于 IOUSBDevice?

  4. 对于无代码 DEXT,我需要对 .cpp 或 .iig 执行任何操作吗?我的大部分工作不是要在 plist 和 entitlements 文件中完成吗?

  5. 我的 MyUsbDriver 目标的框架和库中是否需要 USBDriverKit.framework?

  6. 我在哪里可以找到如何完成此迁移的合适示例?

任何帮助将不胜感激。

更新:

使用答案中的示例和其他链接,我能够得到一些东西。我确实有一个“Doh”时刻:我最初的测试项目类型是命令行工具,但我永远无法嵌入 DEXT。我几乎只是手工编辑了 pbxproj 文件。然而,在查看 Scott Knight 的原始示例 USBApp …

macos iokit kernel-extension driverkit

5
推荐指数
1
解决办法
2052
查看次数

macOS M1 上虚拟文件系统 (VFS) 内核扩展的替代方案

我们为macOS 上的虚拟文件系统 (VFS )开发了内核扩展 (KEXT),以将我们的软件与 Adob​​e InDesign 或 Microsoft Word 等外部​​程序集成。我们的软件和 KEXT 被许多客户使用。

看起来 KEXT 已被弃用,并且可能会在 macOS 的未来版本中完全删除,特别是在基于 Apple Silicon 的计算机上。请参阅 Apple 在其 安全指南中的声明:

“这就是为什么我们强烈鼓励开发人员在 macOS 中删除对未来采用 Apple 芯片的 Mac 电脑的 kext 支持之前采用系统扩展”

因此,我们目前正在研究可能的替代方案。

Apple 建议迁移到系统扩展而不是 KEXT。然而,我们发现的唯一与 VFS 相关的 API 是实现一个基于NSFileProviderReplicatedExtension 的文件提供程序

不幸的是,它NSFileProviderReplicatedExtension有几个缺陷:

  1. 文件可以存储在云端或下载。无法仅下载/读取文件的一部分。这对我们来说是一个很大的性能问题,因为我们处理的是大图像(> 1GB)。我们集成的程序通常只读取图像的一部分,例如嵌入的预览。API 不提供访问文件的选定块(随机访问文件)的方法。
  2. 文件提供者通过enumerators. 因此,必须首先枚举(列出)文件夹内的所有内容。否则无法访问。但是,我们无法枚举我们的 VFS。我们的 VFS 的大部分内容都是完全动态的。它仅在客户端第一次访问时存在。此类动态内容还包括动态参数,例如客户端的区域设置或将放置图像的框的大小。由于我们事先不知道这些参数,因此我们无法提前枚举VFS的内容。

这意味着,NSFileProviderReplicatedExtension当前状态下的 an 并不是“真实”VFS 的替代品,因此我们不能将其用作当前 VFS KEXT 的替代品。

我的问题:

  1. Apple 是否还会允许在(基于 Apple Silicon/M1 的)操作系统的未来版本中进行内核扩展?或者至少有一个明确的期限?
  2. 如果不是,Apple …

macos vfs kernel-extension fileprovider-extension macos-system-extension

5
推荐指数
1
解决办法
1084
查看次数