pthread.h 在内核 driver 中用于 OS X(使用 Xcode)
pthread.h in a kernel driver for OS X (using Xcode)
我正在尝试将由 Clemens Ladisch 编写的用于 Linux 的出色的华硕 XONAR-series driver 移植到 Mac OSX.
现在,一个非常粗糙的编译版本可在以下位置获得:github。com/i3roly/CMI8788
我的问题是关于 OSX 的 pthread.h header。默认情况下,包含 pthread.h 会尝试定义一个结构,该结构与通过 IOKit driver 包含的结构明显不同。为简洁起见,我将使用来自 github post(https://github.com/civetweb/civetweb/issues/364#issuecomment-255438891):
的信息性 post
#include <pthread.h>
#include <sys/_types/_mach_port_t.h>
typedef __darwin_mach_port_t mach_port_t;
对比
#include <IOKit/audio/IOAudioDevice.h>
#include <IOKit/IOService.h>
#include <IOKit/IORegistryEntry.h>
#include <IOKit/IOTypes.h>
#include <IOKit/system.h>
#include <mach/mach_types.h>
#include <mach/host_info.h>
#include <mach/message.h>
#include <mach/port.h>
/*
* For kernel code that resides outside of Mach proper, we opaque the
* port structure definition.
*/
struct ipc_port;
typedef struct ipc_port *ipc_port_t;
#define IPC_PORT_NULL ((ipc_port_t) 0UL)
#define IPC_PORT_DEAD ((ipc_port_t)~0UL)
#define IPC_PORT_VALID(port) \
((port) != IPC_PORT_NULL && (port) != IPC_PORT_DEAD)
typedef ipc_port_t mach_port_t;
现在,我可以通过
来解决这个问题
#define _MACH_PORT_T
#include <pthread.h>
但我不确定这是否是一个安全的解决方案,因为在我看来 Xcode 的 pthreads API 暗示它仅用于 user-land 程序。这个假设是错误的吗?使用这个宏来解决重新定义问题是否合理?
是否有其他人尝试使用 pthreads 为 OSX 编写内核空间 drivers,并遇到了这个问题?任何见解将不胜感激。
谢谢。
愚蠢的问题。
我不知道为什么我没有提醒自己你不能在内核中使用 PTHREADS,特别是当我有构建 linux 内核的经验时(这应该是一个简单的提醒你不能这样做是个坏主意)
用拖鞋打自己的头
我不知道为什么昨天没有点击。
我正在尝试将由 Clemens Ladisch 编写的用于 Linux 的出色的华硕 XONAR-series driver 移植到 Mac OSX.
现在,一个非常粗糙的编译版本可在以下位置获得:github。com/i3roly/CMI8788
我的问题是关于 OSX 的 pthread.h header。默认情况下,包含 pthread.h 会尝试定义一个结构,该结构与通过 IOKit driver 包含的结构明显不同。为简洁起见,我将使用来自 github post(https://github.com/civetweb/civetweb/issues/364#issuecomment-255438891):
的信息性 post#include <pthread.h>
#include <sys/_types/_mach_port_t.h>
typedef __darwin_mach_port_t mach_port_t;
对比
#include <IOKit/audio/IOAudioDevice.h>
#include <IOKit/IOService.h>
#include <IOKit/IORegistryEntry.h>
#include <IOKit/IOTypes.h>
#include <IOKit/system.h>
#include <mach/mach_types.h>
#include <mach/host_info.h>
#include <mach/message.h>
#include <mach/port.h>
/*
* For kernel code that resides outside of Mach proper, we opaque the
* port structure definition.
*/
struct ipc_port;
typedef struct ipc_port *ipc_port_t;
#define IPC_PORT_NULL ((ipc_port_t) 0UL)
#define IPC_PORT_DEAD ((ipc_port_t)~0UL)
#define IPC_PORT_VALID(port) \
((port) != IPC_PORT_NULL && (port) != IPC_PORT_DEAD)
typedef ipc_port_t mach_port_t;
现在,我可以通过
来解决这个问题#define _MACH_PORT_T
#include <pthread.h>
但我不确定这是否是一个安全的解决方案,因为在我看来 Xcode 的 pthreads API 暗示它仅用于 user-land 程序。这个假设是错误的吗?使用这个宏来解决重新定义问题是否合理?
是否有其他人尝试使用 pthreads 为 OSX 编写内核空间 drivers,并遇到了这个问题?任何见解将不胜感激。
谢谢。
愚蠢的问题。
我不知道为什么我没有提醒自己你不能在内核中使用 PTHREADS,特别是当我有构建 linux 内核的经验时(这应该是一个简单的提醒你不能这样做是个坏主意)
用拖鞋打自己的头
我不知道为什么昨天没有点击。