如何在iOS上运行时确定ARMv8功能? [英] How to determine ARMv8 features at runtime on iOS?
问题描述
我正在尝试确定iOS上运行时可选的ARMv8 cpu功能。在OS X桌面上,如i686,x86_64,PPC和PPC64,我们可以使用 sysctl
。例如,请参阅 PR 3108,MacOS X上的无SIGILL处理器功能检测 。
无SIGILL处理器功能部分非常重要,因为 SIGILL
- 基于功能的探测功能会破坏Apple平台上的内存。我遵循的至少三个项目都遇到了问题,包括Crypto ++和OpenSSL。问题的另一部分是问题,如 Apple Clang是否缺少Xcode 10下的ARMv8 / Aarch64的CRC32?,其中核心ARMv8功能应该存在似乎丢失或不支持。
我已经找到了iOS OS等效的OS X桌面,但我找不到它们(见下文)。 / p>
我们真的更愿意避免使用像CommonCrypto这样的Apple框架。我们努力保持与平台无关。我们不使用CommonCrypto,但如果没有任何不可知的东西(我正在制作它),我会考虑使用下面的Apple函数:
BOOL CCHasAes();
BOOL CCHasSHA1();
BOOL CCHasSHA2();
Apple是否发布了一种在运行时确定cpu功能的方法?
我们如何在iOS上确定运行时的cpu功能?
这些可能是相关的,但我我不确定这是否是我们所拥有的最好的,或者这是我们唯一拥有的东西,还是有其他方法可以接近它。
下面我正在寻找CRC-32,CRC-32C,AES,PMULL,SHA1和SHA2功能。我没有看到任何类似于我正在寻找的点击。 Apple自Xcode 7起支持ARMv8,因此8.2支持CPU。
$ grep -IR CTL_ / Applications / Xcode.app / Contents / Developer / Platforms / iPhoneOS.platform / Developer / SDKs / iPhoneOS8.2.sdk | \
sed's | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk/usr/include | ... | g'
... / c ++ / 4.2.1 / bits / c ++ config.h:#define _GLIBCXX_HAVE_SYS_IOCTL_H 1
... / netinet / in.h:#define IPCTL_FORWARDING 1 / *充当路由器* /
... / netinet / in.h:#define IPCTL_SENDREDIRECTS 2 / *可以在转发* /
... / netinet / in.h时发送重定向:#define IPCTL_DEFTTL 3 / *默认TTL * /
... / netinet / in.h:#define IPCTL_DEFMTU 4 / *默认MTU * /
... / netinet / in.h:#define IPCTL_RTEXPIRE 5 / *克隆路由到期时间* /
... / netinet / in.h:#define IPCTL_RTMINEXPIRE 6 / *最小到期时间值* /
... / netinet / in.h:#define IPCTL_RTMAXCACHE 7 / *触发级别为动态到期* /
... / netinet / in.h:#define IPCTL_SOURCEROUTE 8 / *可执行源路由* /
... / netine t / in.h:#define IPCTL_DIRECTEDBROADCAST 9 / *可以重新广播收到的数据包* /
... / netinet / in.h:#define IPCTL_INTRQMAXLEN 10 / *最大netisr队列长度* /
... / netinet / in.h:#define IPCTL_INTRQDROPS 11 / * netisr q drop * * /
... / netinet / in.h:#define IPCTL_STATS 12 / * ipstat结构* /
... / netinet / in.h:#define IPCTL_ACCEPTSOURCEROUTE 13 / *可以接受源路由数据包* /
... / netinet / in.h:#define IPCTL_FASTFORWARDING 14 / *使用快速IP转发代码* /
... / netinet / in.h:#define IPCTL_KEEPFAITH 15 / *已弃用* /
... / netinet / in.h:#define IPCTL_GIF_TTL 16 / *默认TTL用于gif封装packet * /
... / netinet / in.h:#define IPCTL_MAXID 17
... / netinet6 / in6.h:#define IPV6CTL_FORWARDING 1 / *充当路由器* /
... / netinet6 / in6.h:#define IPV6CTL_SENDREDIRECTS 2 / *可以在转发* /
... / netinet6 / in6.h时发送重定向:#define IPV6CTL_DEFHLIM 3 / *默认跳跃限制* /
... / netinet6 / in6.h:#定义IPV6CTL_DEFMTU 4 / *默认MTU * /
... / netinet6 / in6.h:#define IPV6CTL_FORWSRCRT 5 / * forward source-routed dgrams * /
... / netinet6 / in6.h: #define IPV6CTL_STATS 6 / * stats * /
... / netinet6 / in6.h:#define IPV6CTL_MRTSTATS 7 / *组播转发统计* /
... / netinet6 / in6.h:#define IPV6CTL_MRTPROTO 8 / *组播路由协议* /
... / netinet6 / in6.h:#define IPV6CTL_MAXFRAGPACKETS 9 / *最大数据包重组队列* /
... / netinet6 / in6.h:#定义IPV6CTL_SOURCECHECK 10 / *验证源路由和intf * /
... / netinet6 / in6.h:#define IPV6CTL_SOURCECHECK_LOGINT 11 / * minimume logging interval * /
... / netinet6 / in6.h :#define IPV6CTL_ACCEPT_RTADV 12
... / n etinet6 / in6.h:#define IPV6CTL_KEEPFAITH 13 / * deprecated * /
... / netinet6 / in6.h:#define IPV6CTL_LOG_INTERVAL 14
... / netinet6 / in6.h:#define IPV6CTL_HDRNESTLIMIT 15
... / netinet6 / in6.h:#define IPV6CTL_DAD_COUNT 16
... / netinet6 / in6.h:#define IPV6CTL_AUTO_FLOWLABEL 17
... / netinet6 / in6.h :#define IPV6CTL_DEFMCASTHLIM 18
... / netinet6 / in6.h:#define IPV6CTL_GIF_HLIM 19 / * gif encap packet的默认HLIM * /
... / netinet6 / in6.h:#define IPV6CTL_KAME_VERSION 20
... / netinet6 / in6.h:#define IPV6CTL_USE_DEPRECATED 21 / *使用deprecd addr(RFC2462 5.5.4)* /
... / netinet6 / in6.h:#define IPV6CTL_RR_PRUNE 22 / *路由器重新编号的步行计时器* /
... / netinet6 / in6.h:#define IPV6CTL_MAPPED_ADDR 23
... / netinet6 / in6.h:#define IPV6CTL_V6ONLY 24
。 ../netinet6/in6.h:#define IPV6CTL_RTEXPIRE 25 / *克隆路线ex盗版时间* /
... / netinet6 / in6.h:#define IPV6CTL_RTMINEXPIRE 26 / *最小到期时间值* /
... / netinet6 / in6.h:#define IPV6CTL_RTMAXCACHE 27 / *动态到期的触发级别* /
... / netinet6 / in6.h:#define IPV6CTL_USETEMPADDR 32 / *使用临时地址[RFC 4941] * /
... / netinet6 / in6.h :#define IPV6CTL_TEMPPLTIME 33 / * tmpaddrs的首选生命周期* /
... / netinet6 / in6.h:#define IPV6CTL_TEMPVLTIME 34 / * tmpaddrs的有效生命周期* /
... / netinet6 / in6 .h:#define IPV6CTL_AUTO_LINKLOCAL 35 / *自动链接本地地址分配* /
... / netinet6 / in6.h:#define IPV6CTL_RIP6STATS 36 / * raw_ip6 stats * /
... / netinet6 /in6.h:#define IPV6CTL_PREFER_TEMPADDR 37 / *首选临时地址为src * /
... / netinet6 / in6.h:#define IPV6CTL_ADDRCTLPOLICY 38 / *获取/设置地址选择政策* /
... / netinet6 / in6.h:#define IPV6 CTL_USE_DEFAULTZONE 39 / *使用默认范围区域* /
... / netinet6 / in6.h:#define IPV6CTL_MAXFRAGS 41 / * max fragments * /
... / netinet6 / in6.h:#define IPV6CTL_MCAST_PMTU 44 / *为mcast启用pMTU发现? * /
... / netinet6 / in6.h:#define IPV6CTL_NEIGHBORGCTHRESH 46
... / netinet6 / in6.h:#define IPV6CTL_MAXIFPREFIXES 47
... / netinet6 / in6。 h:#define IPV6CTL_MAXIFDEFROUTERS 48
... / netinet6 / in6.h:#define IPV6CTL_MAXDYNROUTES 49
... / netinet6 / in6.h:#define ICMPV6CTL_ND6_ONLINKNSRFC4861 50
... / netinet6 / in6.h:/ *应从当前IPV6CTL_MAXID值添加新条目。 * /
... / netinet6 / in6.h:#define IPV6CTL_MAXID 51
... / sys / ioctl.h:#ifndef _SYS_IOCTL_H_
... / sys / ioctl.h :#define _SYS_IOCTL_H_
... / sys / ioctl.h:#endif / *!_SYS_IOCTL_H_ * /
... / sys / ioctl.h:*保持在_SYS_IOCTL_H_
.. ./sys/ioctl.h:#endif / *!_SYS_IOCTL_H_ * /
... / sys / mount.h:* Sysctl CTL_VFS定义。
... / sys / mount.h:int vc_vers; / *应该是VFSIDCTL_VERS1(下面)* /
... / sys / mount.h:#define VFS_CTL_VERS1 0x01
... / sys / mount.h:#define VFS_CTL_STATFS 0x00010001 / * statfs * /
... / sys / mount.h:#define VFS_CTL_UMOUNT 0x00010002 / * unmount * /
... / sys / mount.h:#define VFS_CTL_QUERY 0x00010003 / *有什么不对吗? (vfsquery)* /
... / sys / mount.h:#define VFS_CTL_NEWADDR 0x00010004 / *重新连接到新地址* /
... / sys / mount.h:#define VFS_CTL_TIMEO 0x00010005 / *为vfs通知设置超时* /
... / sys / mount.h:#define VFS_CTL_NOLOCKS 0x00010006 / *禁用文件锁定* /
... / sys / mount.h:#define VFS_CTL_SADDR 0x00010007 / * get server address * /
... / sys / mount.h:#define VFS_CTL_DISC 0x00010008 / * server disconnected * /
... / sys / mount.h:#define VFS_CTL_SERVERINFO 0x00010009 / *有关fs服务器的信息* /
... / sys / mount.h:#define VFS_CTL_NSTATUS 0x0001000A / * netfs mount status * /
... / sys / mount.h:* NetFS mount status - 由VFS_CTL_NSTATUS
... / sys / socket.h返回:*与网络相关的sysctl,CTL_NET的定义。
... / sys / sysctl.h:#ifndef _SYS_SYSCTL_H_
... / sys / sysctl.h:#define _SYS_SYSCTL_H_
... / sys / sysctl.h:#define CTL_MAXNAME 12 / *支持的最大组件数* /
... / sys / sysctl.h:* SYSCTL_OUT(rey,本地缓冲区,长度)
... / sys / sysctl.h:*例如SYSCTL_INT(_ parent,OID_AUTO,name,CTLFLAG_RW,& variable,0,);
... / sys / sysctl.h:#define SYSCTL_DEF_ENABLED
... / sys / sysctl.h:#ifdef SYSCTL_DEF_ENABLED
... / sys / sysctl.h:#define CTL_UNSPEC 0 / * unused * /
... / sys / sysctl.h:#define CTL_KERN 1 / *high kernel:proc,limits * /
... / sys / sysctl.h :#define CTL_VM 2 / *虚拟内存* /
... / sys / sysctl.h:#define CTL_VFS 3 / *文件系统,挂载类型是下一个* /
... / sys / sysctl.h:#define CTL_NET 4 / * network,参见socket.h * /
... / sys / sysctl.h:#define CTL_DEBUG 5 / *调试参数* /
... / sys / sysctl.h:#define CTL_HW 6 / * generic cpu / io * /
... / sys / sysctl.h:#define CTL_MACHDEP 7 / * machine dependent * /
... / sys / sysctl.h:#define CTL_USER 8 / * user-level * /
... / sys / sysctl.h:#define CTL_MAXID 9 / *有效顶级ID数* /
... / sys / sysctl.h:#define CTL_NAMES {\
... / sys / sysctl.h:* CTL_KERN标识符
... / sys / sysctl.h:*不要再添加这样的sysctl。而是使用SYSCTL _ *()宏
... / sys / sysctl.h:#define CTL_KERN_NAMES {\
... / sys / sysctl.h:* CTL_VFS identifier
... / sys / sysctl.h:#define CTL_VFS_NAMES {\
... / sys / sysctl.h:* CTL_VM标识符
... / sys / sysctl.h:#define CTL_VM_NAMES {\
... / sys / sysctl.h:* CTL_HW标识符
... / sys / sysctl.h:#define CTL_HW_NAMES {\
... / sys / sysctl.h:* CTL_USER定义
... / sys / sysctl.h:#define CTL_USER_NAMES {\
... / sys / sysctl.h:* CTL_DEBUG定义
.. ./sys/sysctl.h:#define CTL_DEBUG_NAME 0 / * string:变量名称* /
... / sys / sysctl.h:#define CTL_DEBUG_VALUE 1 / * int:变量值* /
... / sys / sysctl.h:#define CTL_DEBUG_MAXID 20
... / sys / sysctl.h:#if(CTL_MAXID!= 9)|| (KERN_MAXID!= 72)|| (VM_MAXID!= 6)|| (HW_MAXID!= 26)|| (USER_MAXID!= 21)|| (CTL_DEBUG_MAXID!= 20)
... / sys / sysctl.h:#error使用SYSCTL _ *()宏和OID_AUTO代替!
... / sys / sysctl.h:#endif / * SYSCTL_DEF_ENABLED * /
... / sys / sysctl.h:#endif / *!_SYS_SYSCTL_H_ * /
... /sys/termios.h:#if!defined(_SYS_IOCTL_COMPAT_H_)|| __DARWIN_UNIX03
... / sys / termios.h:#endif / *!_SYS_IOCTL_COMPAT_H_ * /
据我所知,Apple今年将取消对32位芯片的支持。 由于Apple A7处理器Apple使用ArmV8-A内核用于其SoC ...所以也许你不能用新的API选择它们因为你没有什么可选择的...... Apple通常对这类事物并使用自动切换移动平台上的某些功能。然而,基本上每个iOS 11 SoC都将具有相同的基本硬件功能,除了核心数量和能量管理(SoC> = A10 Fusion不同)。我在一个月前搜索同样的东西,但显然在iOS上你必须掌握在操作系统中。
I am trying to determine when optional ARMv8 cpu features are available on iOS at runtime. On OS X desktops, like i686, x86_64, PPC and PPC64 we can use sysctl
. See, for example, PR 3108, SIGILL-free processor capabilities detection on MacOS X.
The "SIGILL-free processor capabilities" part is important because SIGILL
-based feature probes corrupt memory on Apple platforms. At least three projects I follow have had problems with it, including Crypto++ and OpenSSL. Another part of the problem is questions like Does Apple Clang lack CRC32 for ARMv8/Aarch64 under Xcode 10?, where core ARMv8 features that should be present seem to be missing or unsupported.
I've looked for the iOS equivalent of the OS X desktops but I cannot find them (see below).
We really prefer to avoid Apple frameworks like CommonCrypto. We try hard to stay platform agnostic. We don't use CommonCrypto, but I would consider using an Apple functions like below if there's nothing agnostic available (I'm making them up):
BOOL CCHasAes();
BOOL CCHasSHA1();
BOOL CCHasSHA2();
Does Apple publish a method to determine cpu features at runtime?
How do we determine cpu features at runtime on iOS?
These may be related, but I'm not sure if that's the best we have, or if that's the only thing we have, or if there are other ways to approach it.
Below I am looking for CRC-32, CRC-32C, AES, PMULL, SHA1 and SHA2 features. I don't see any hits that resemble what I am looking for. Apple supports ARMv8 since Xcode 7, so 8.2 supports the CPU.
$ grep -IR CTL_ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk | \
sed 's|/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk/usr/include|...|g'
.../c++/4.2.1/bits/c++config.h:#define _GLIBCXX_HAVE_SYS_IOCTL_H 1
.../netinet/in.h:#define IPCTL_FORWARDING 1 /* act as router */
.../netinet/in.h:#define IPCTL_SENDREDIRECTS 2 /* may send redirects when forwarding */
.../netinet/in.h:#define IPCTL_DEFTTL 3 /* default TTL */
.../netinet/in.h:#define IPCTL_DEFMTU 4 /* default MTU */
.../netinet/in.h:#define IPCTL_RTEXPIRE 5 /* cloned route expiration time */
.../netinet/in.h:#define IPCTL_RTMINEXPIRE 6 /* min value for expiration time */
.../netinet/in.h:#define IPCTL_RTMAXCACHE 7 /* trigger level for dynamic expire */
.../netinet/in.h:#define IPCTL_SOURCEROUTE 8 /* may perform source routes */
.../netinet/in.h:#define IPCTL_DIRECTEDBROADCAST 9 /* may re-broadcast received packets */
.../netinet/in.h:#define IPCTL_INTRQMAXLEN 10 /* max length of netisr queue */
.../netinet/in.h:#define IPCTL_INTRQDROPS 11 /* number of netisr q drops */
.../netinet/in.h:#define IPCTL_STATS 12 /* ipstat structure */
.../netinet/in.h:#define IPCTL_ACCEPTSOURCEROUTE 13 /* may accept source routed packets */
.../netinet/in.h:#define IPCTL_FASTFORWARDING 14 /* use fast IP forwarding code */
.../netinet/in.h:#define IPCTL_KEEPFAITH 15 /* deprecated */
.../netinet/in.h:#define IPCTL_GIF_TTL 16 /* default TTL for gif encap packet */
.../netinet/in.h:#define IPCTL_MAXID 17
.../netinet6/in6.h:#define IPV6CTL_FORWARDING 1 /* act as router */
.../netinet6/in6.h:#define IPV6CTL_SENDREDIRECTS 2 /* may send redirects when forwarding */
.../netinet6/in6.h:#define IPV6CTL_DEFHLIM 3 /* default Hop-Limit */
.../netinet6/in6.h:#define IPV6CTL_DEFMTU 4 /* default MTU */
.../netinet6/in6.h:#define IPV6CTL_FORWSRCRT 5 /* forward source-routed dgrams */
.../netinet6/in6.h:#define IPV6CTL_STATS 6 /* stats */
.../netinet6/in6.h:#define IPV6CTL_MRTSTATS 7 /* multicast forwarding stats */
.../netinet6/in6.h:#define IPV6CTL_MRTPROTO 8 /* multicast routing protocol */
.../netinet6/in6.h:#define IPV6CTL_MAXFRAGPACKETS 9 /* max packets reassembly queue */
.../netinet6/in6.h:#define IPV6CTL_SOURCECHECK 10 /* verify source route and intf */
.../netinet6/in6.h:#define IPV6CTL_SOURCECHECK_LOGINT 11 /* minimume logging interval */
.../netinet6/in6.h:#define IPV6CTL_ACCEPT_RTADV 12
.../netinet6/in6.h:#define IPV6CTL_KEEPFAITH 13 /* deprecated */
.../netinet6/in6.h:#define IPV6CTL_LOG_INTERVAL 14
.../netinet6/in6.h:#define IPV6CTL_HDRNESTLIMIT 15
.../netinet6/in6.h:#define IPV6CTL_DAD_COUNT 16
.../netinet6/in6.h:#define IPV6CTL_AUTO_FLOWLABEL 17
.../netinet6/in6.h:#define IPV6CTL_DEFMCASTHLIM 18
.../netinet6/in6.h:#define IPV6CTL_GIF_HLIM 19 /* default HLIM for gif encap packet */
.../netinet6/in6.h:#define IPV6CTL_KAME_VERSION 20
.../netinet6/in6.h:#define IPV6CTL_USE_DEPRECATED 21 /* use deprec addr (RFC2462 5.5.4) */
.../netinet6/in6.h:#define IPV6CTL_RR_PRUNE 22 /* walk timer for router renumbering */
.../netinet6/in6.h:#define IPV6CTL_MAPPED_ADDR 23
.../netinet6/in6.h:#define IPV6CTL_V6ONLY 24
.../netinet6/in6.h:#define IPV6CTL_RTEXPIRE 25 /* cloned route expiration time */
.../netinet6/in6.h:#define IPV6CTL_RTMINEXPIRE 26 /* min value for expiration time */
.../netinet6/in6.h:#define IPV6CTL_RTMAXCACHE 27 /* trigger level for dynamic expire */
.../netinet6/in6.h:#define IPV6CTL_USETEMPADDR 32 /* use temporary addresses [RFC 4941] */
.../netinet6/in6.h:#define IPV6CTL_TEMPPLTIME 33 /* preferred lifetime for tmpaddrs */
.../netinet6/in6.h:#define IPV6CTL_TEMPVLTIME 34 /* valid lifetime for tmpaddrs */
.../netinet6/in6.h:#define IPV6CTL_AUTO_LINKLOCAL 35 /* automatic link-local addr assign */
.../netinet6/in6.h:#define IPV6CTL_RIP6STATS 36 /* raw_ip6 stats */
.../netinet6/in6.h:#define IPV6CTL_PREFER_TEMPADDR 37 /* prefer temporary addr as src */
.../netinet6/in6.h:#define IPV6CTL_ADDRCTLPOLICY 38 /* get/set address selection policy */
.../netinet6/in6.h:#define IPV6CTL_USE_DEFAULTZONE 39 /* use default scope zone */
.../netinet6/in6.h:#define IPV6CTL_MAXFRAGS 41 /* max fragments */
.../netinet6/in6.h:#define IPV6CTL_MCAST_PMTU 44 /* enable pMTU discovery for mcast? */
.../netinet6/in6.h:#define IPV6CTL_NEIGHBORGCTHRESH 46
.../netinet6/in6.h:#define IPV6CTL_MAXIFPREFIXES 47
.../netinet6/in6.h:#define IPV6CTL_MAXIFDEFROUTERS 48
.../netinet6/in6.h:#define IPV6CTL_MAXDYNROUTES 49
.../netinet6/in6.h:#define ICMPV6CTL_ND6_ONLINKNSRFC4861 50
.../netinet6/in6.h:/* New entries should be added here from current IPV6CTL_MAXID value. */
.../netinet6/in6.h:#define IPV6CTL_MAXID 51
.../sys/ioctl.h:#ifndef _SYS_IOCTL_H_
.../sys/ioctl.h:#define _SYS_IOCTL_H_
.../sys/ioctl.h:#endif /* !_SYS_IOCTL_H_ */
.../sys/ioctl.h: * Keep outside _SYS_IOCTL_H_
.../sys/ioctl.h:#endif /* !_SYS_IOCTL_H_ */
.../sys/mount.h: * Sysctl CTL_VFS definitions.
.../sys/mount.h: int vc_vers; /* should be VFSIDCTL_VERS1 (below) */
.../sys/mount.h:#define VFS_CTL_VERS1 0x01
.../sys/mount.h:#define VFS_CTL_STATFS 0x00010001 /* statfs */
.../sys/mount.h:#define VFS_CTL_UMOUNT 0x00010002 /* unmount */
.../sys/mount.h:#define VFS_CTL_QUERY 0x00010003 /* anything wrong? (vfsquery) */
.../sys/mount.h:#define VFS_CTL_NEWADDR 0x00010004 /* reconnect to new address */
.../sys/mount.h:#define VFS_CTL_TIMEO 0x00010005 /* set timeout for vfs notification */
.../sys/mount.h:#define VFS_CTL_NOLOCKS 0x00010006 /* disable file locking */
.../sys/mount.h:#define VFS_CTL_SADDR 0x00010007 /* get server address */
.../sys/mount.h:#define VFS_CTL_DISC 0x00010008 /* server disconnected */
.../sys/mount.h:#define VFS_CTL_SERVERINFO 0x00010009 /* information about fs server */
.../sys/mount.h:#define VFS_CTL_NSTATUS 0x0001000A /* netfs mount status */
.../sys/mount.h: * NetFS mount status - returned by VFS_CTL_NSTATUS
.../sys/socket.h: * Definitions for network related sysctl, CTL_NET.
.../sys/sysctl.h:#ifndef _SYS_SYSCTL_H_
.../sys/sysctl.h:#define _SYS_SYSCTL_H_
.../sys/sysctl.h:#define CTL_MAXNAME 12 /* largest number of components supported */
.../sys/sysctl.h: * SYSCTL_OUT(rey, local buffer, length)
.../sys/sysctl.h: * e.g. SYSCTL_INT(_parent, OID_AUTO, name, CTLFLAG_RW, &variable, 0, "");
.../sys/sysctl.h:#define SYSCTL_DEF_ENABLED
.../sys/sysctl.h:#ifdef SYSCTL_DEF_ENABLED
.../sys/sysctl.h:#define CTL_UNSPEC 0 /* unused */
.../sys/sysctl.h:#define CTL_KERN 1 /* "high kernel": proc, limits */
.../sys/sysctl.h:#define CTL_VM 2 /* virtual memory */
.../sys/sysctl.h:#define CTL_VFS 3 /* file system, mount type is next */
.../sys/sysctl.h:#define CTL_NET 4 /* network, see socket.h */
.../sys/sysctl.h:#define CTL_DEBUG 5 /* debugging parameters */
.../sys/sysctl.h:#define CTL_HW 6 /* generic cpu/io */
.../sys/sysctl.h:#define CTL_MACHDEP 7 /* machine dependent */
.../sys/sysctl.h:#define CTL_USER 8 /* user-level */
.../sys/sysctl.h:#define CTL_MAXID 9 /* number of valid top-level ids */
.../sys/sysctl.h:#define CTL_NAMES { \
.../sys/sysctl.h: * CTL_KERN identifiers
.../sys/sysctl.h: * Don't add any more sysctls like this. Instead, use the SYSCTL_*() macros
.../sys/sysctl.h:#define CTL_KERN_NAMES { \
.../sys/sysctl.h: * CTL_VFS identifiers
.../sys/sysctl.h:#define CTL_VFS_NAMES { \
.../sys/sysctl.h: * CTL_VM identifiers
.../sys/sysctl.h:#define CTL_VM_NAMES { \
.../sys/sysctl.h: * CTL_HW identifiers
.../sys/sysctl.h:#define CTL_HW_NAMES { \
.../sys/sysctl.h: * CTL_USER definitions
.../sys/sysctl.h:#define CTL_USER_NAMES { \
.../sys/sysctl.h: * CTL_DEBUG definitions
.../sys/sysctl.h:#define CTL_DEBUG_NAME 0 /* string: variable name */
.../sys/sysctl.h:#define CTL_DEBUG_VALUE 1 /* int: variable value */
.../sys/sysctl.h:#define CTL_DEBUG_MAXID 20
.../sys/sysctl.h:#if (CTL_MAXID != 9) || (KERN_MAXID != 72) || (VM_MAXID != 6) || (HW_MAXID != 26) || (USER_MAXID != 21) || (CTL_DEBUG_MAXID != 20)
.../sys/sysctl.h:#error Use the SYSCTL_*() macros and OID_AUTO instead!
.../sys/sysctl.h:#endif /* SYSCTL_DEF_ENABLED */
.../sys/sysctl.h:#endif /* !_SYS_SYSCTL_H_ */
.../sys/termios.h:#if !defined(_SYS_IOCTL_COMPAT_H_) || __DARWIN_UNIX03
.../sys/termios.h:#endif /* !_SYS_IOCTL_COMPAT_H_ */
As far as I know Apple is going to remove the support to 32-bit chips this year. Since Apple A7 processors Apple uses ArmV8-A cores for its SoCs...so maybe you cannot choose them with the new APIs because you have nothing to choose...Apple usually is cryptic about those kind of things and uses automatic switching for certain features on mobile platforms. However basically every iOS 11 SoC will have the same basic hardware features except for the number of cores and the energy management (which is different for SoC >= A10 Fusion). I was searching for the same thing some month ago but apparently on iOS you have to be in the hands of the OS.
这篇关于如何在iOS上运行时确定ARMv8功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!