为什么OS X 10.6.8中的host_statistics64()(我不知道其他版本是否存在此问题)返回的计数是免费,活动,非活动和有线内存,这些内存不会超过ram的总数?为什么它缺少不一致的页数?
以下输出表示十秒钟内未分类为空闲,活动,非活动或有线的页面数(大约每秒采样一次).
458
243
153
199
357
140
304
93
181
224
Run Code Online (Sandbox Code Playgroud)
产生上述数字的代码是:
#include <stdio.h>
#include <mach/mach.h>
#include <mach/vm_statistics.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char** argv) {
struct vm_statistics64 stats;
mach_port_t host = mach_host_self();
natural_t count = HOST_VM_INFO64_COUNT;
natural_t missing = 0;
int debug = argc == 2 ? !strcmp(argv[1], "-v") : 0;
kern_return_t ret;
int mib[2];
long ram;
natural_t pages;
size_t length;
int i;
mib[0] = CTL_HW;
mib[1] = HW_MEMSIZE;
length …Run Code Online (Sandbox Code Playgroud) 似乎有一些类似的长字母数字字符串,通常出现在Mach-O 64位可执行文件和ELF 64位LSB可执行文件以及其他不是字母数字的符号中:
cat /bin/bash | grep -c "AWAVAUATSH"
Run Code Online (Sandbox Code Playgroud)
有181个结果,和
cat /usr/bin/gzip | grep -c "AWAVAUATSH"
Run Code Online (Sandbox Code Playgroud)
有9个结果.
这些字符串是什么?
在KEXT中,我通过vnode或文件范围监听器监听文件关闭.对于某些(极少数)文件,我需要将文件路径发送到我的系统守护程序,该守护程序执行一些处理(这必须在守护程序中发生)并将结果返回给KEXT.需要阻止文件关闭调用,直到我从守护程序获得响应.根据结果我需要在close调用中进行一些操作并成功返回close调用.论坛上有很多关于KEXT通信相关主题的讨论.但它们并不具有决定性,而且看起来很老(2002年左右).此要求可以由FtlSendMessage(...)Win32 API 处理.我在Mac上寻找相同的东西
以下是我所看到的并希望总结我的理解:
mach_msg,mach_port_allocate,bootstrap_look_up)并不显得关键绩效指标.mach_msg_send_from_kernel可以使用mach API ,但仅此一点对双向通信没有帮助.我的理解是对的吗?ioctl/sysctl:我对他们了解不多.根据我的阅读,它不推荐使用,特别是对于双向通信支持的平台是(10.5以后).所以看看这个要求,有人可以建议并提供一些关于这个主题的指示吗?
提前致谢.
我试图将ObjC stackoverflow答案转换为Swift并失败.看起来我正在通过一个UnsafeMutablePointer<mach_msg_type_number_t>我应该通过的时候inout mach_msg_type_number_t,我似乎无法解决我的问题.根据我对Swift指针文档的理解(不多),这些应该是可以互换的.
更多信息如下.
这是目标C:
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size);
Run Code Online (Sandbox Code Playgroud)
就我在Swift中所获得的而言(许多行更容易进行类型检查)
let name: task_name_t = mach_task_self_
let flavor: task_flavor_t = task_flavor_t(MACH_TASK_BASIC_INFO)
var info: mach_task_basic_info
var size: mach_msg_type_number_t = UnsignedFixed(sizeof(mach_task_basic_info_t))
let kerr = task_info(name, flavor, info as task_info_t, &size)
Run Code Online (Sandbox Code Playgroud)
该task_info签名是:
func task_info(target_task: task_name_t, flavor: task_flavor_t, task_info_out: task_info_t, task_info_outCnt: UnsafeMutablePointer<mach_msg_type_number_t>) -> kern_return_t
Run Code Online (Sandbox Code Playgroud)
并且最后一行的错误是:
Cannot convert the expression's type '(@!lvalue task_name_t, task_flavor_t, task_info_t, inout mach_msg_type_number_t)' to type 'kern_return_t'
Run Code Online (Sandbox Code Playgroud) 我想知道我的iPhone中可用的总 RAM.为此,我使用了以下代码.
注意:请不要解释有关检索RAM统计信息的问题,例如有线,非活动,活动和免费.
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) {
NSLog(@"Failed to fetch vm statistics");
return;
}
/* Stats in bytes */
self.wired = vm_stat.wire_count * pagesize / (1024 * 1024);
self.active = vm_stat.active_count * pagesize / (1024 * 1024);
self.inactive = vm_stat.inactive_count * pagesize / (1024 * 1024);
self.free = vm_stat.free_count * pagesize / (1024 * 1024);
self.used = …Run Code Online (Sandbox Code Playgroud) 我正在对Mac OS X上可用的不同IPC机制(管道,插座,System V IPC等)进行比较,我想看看Mach端口如何与更高级别的替代品进行比较.但是,我遇到了一个非常基本的问题:跨进程获取端口的发送权限(特别是跨父进程和子进程).
与文件描述符不同,端口通常不会转移到分叉进程.这意味着必须建立一些其他的转移方式.关于这个问题的唯一相关页面就是这个,他们在更新中声明他们的方法不再有效,并且从未得到保证,尽管这种方法是Apple工程师在2009年提出的.(这意味着更换引导端口,现在这样做会破坏XPC.)他们建议的替换使用已弃用的功能,因此这不是一个非常有吸引力的解决方案.
此外,我喜欢旧解决方案的一件事是端口在使用它的进程之间保持相当私密.没有必要广播端口的存在,就像管道(来自pipe呼叫)工作一旦分叉.(如果有另一个解决方案,我可能会忍受它,但它有点烦人.)
那么,如何将发送权从父进程传递到Mach进程到子进程?
我有时会得到以下异常:
[Mach] exception: 0x%x, count: %d, code: 0x%llx 0x%llx
[Mach] Skipping registered port - it is invalid
[Mach] Skipping registered port - mask does not match
signal %d, info %p, uapVoid %p
Run Code Online (Sandbox Code Playgroud)
我不知道这些例外情况是什么.有人可以对此嗤之以鼻吗?
我正在开发一个基于示例的coreaudio用户空间hal插件developer.apple.com/library/mac/samplecode/AudioDriverExamples/Introduction/Intro.html
在插件实现中,我计划从另一个进程(即CFMessagePort)获取音频数据
但是,我在控制台中尝试创建端口CFMessagePortCreateLocal时出现以下错误...
sandboxd [251] :( [2597])coreaudiod(2597)deny mach-register com.mycompnay.audio
我做了一些googlging并来到这篇文章
技术问答QA1811 https://developer.apple.com/library/mac/qa/qa1811/_index.html 关于在plist中添加AudioServerPlugIn_MachServices但仍未成功.
还有什么我需要做的才能使这项工作(如添加权利,代码签名)或这不是正确的方法.我不确定MesssagePort机制是否可以在沙箱下运行.XPC服务是否可行?
非常感谢您的宝贵时间.任何帮助是极大的赞赏
更新1:
我应该在音频插件中创建一个远程端口而不是本地.有了这个说法,使用plist中的AudioServerPlugIn_MachServices属性.现在没有sandboxd [559] :( [552])coreaudiod(552)在控制台中拒绝mach-lookup/register消息.
但是,在我的音频hal插件(客户端)我有
CFStringRef port_name = CFSTR("com.mycompany.audio.XPCService");
CFMessagePortRef port = CFMessagePortCreateRemote(kCFAllocatorDefault, port_name);
port已返回值0.我在另一个应用程序中尝试了这个并且它工作得很好.
这是我的服务器端:
CFStringRef port_name = CFSTR("com.mycompany.audio.XPCService");
CFMessagePortRef port = CFMessagePortCreateLocal(kCFAllocatorDefault, port_name, &callback, NULL, NULL);
CFRunLoopSourceRef runLoopSource =
CFMessagePortCreateRunLoopSource(nil, port, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(),
runLoopSource,
kCFRunLoopCommonModes);
CFRunLoopRun();
Run Code Online (Sandbox Code Playgroud)
我确实得到了关于此的控制台消息.
com.apple.audio.DriverHelper [1314]:名为SimpleAudioPlugIn.driver的插件需要扩展名为com.mycompnay.audio.XPCService的mach服务的沙箱.
谁知道为什么?
更新2
我注意到当我使用带有coreaudiod的调试模式时,它成功获得了mach服务的对象引用.(当我尝试xpc_service方法时)同样的事情发生在 项目方案设置中
任何人??
知道两者都是微内核,b/w Mach(赫德所基于的)和Minix的区别是什么.有任何架构差异吗?对"什么是L4"稍微有点了解将会非常有帮助.我找不到任何涉及此的文件.
我有一个可以记录堆栈跟踪的应用程序,以后可以用于调试.
在Windows上,我使用了JEDI项目提供的优秀JCLDebug单元.
现在我的应用程序在OSX上运行,我遇到了一些麻烦 - 我不知道如何在发生异常时获得正确的堆栈跟踪.
我已经掌握了基础知识 -
1)我可以使用'backtrace'获取堆栈跟踪(在libSystem.dylib中找到)
2)使用Delphi链接器提供的.map文件,可以将生成的回溯转换为行号
我留下的问题是 - 我不知道从哪里调用backtrace.我知道Delphi使用Mach异常(在一个单独的线程上),并且我不能使用posix信号,但这就是我设法解决的问题.
我可以在'try ... except'块中获得回溯,但不幸的是,到那时堆栈已经缩小了.
如何安装适当的异常记录器,它将在异常发生后立即运行?
更新:
根据'Honza R的建议,我看了一下'GetExceptionStackInfoProc'程序.
这个函数确实让我"处理"了异常处理过程,但遗憾的是,这让我遇到了一些与之前相同的问题.
首先 - 在桌面平台上,此函数'GetExceptionStackInfoProc'只是一个函数指针,您可以使用自己的异常信息处理程序进行分配.因此开箱即用,Delphi不提供任何堆栈信息提供程序.
如果我将一个函数分配给'GetExceptionStackInfoProc'然后在其中运行'backtrace',我会收到一个堆栈跟踪,但该跟踪是相对于异常处理程序的,而不是导致该异常的线程.
'GetExceptionStackInfoProc'确实包含一个指向'TExceptionRecord'的指针,但是关于这个的文档非常有限.
我可能会超越自己的深度,但是如何从正确的线程获得堆栈跟踪?我可以将自己的'backtrace'函数注入异常处理程序,然后从那里返回标准异常处理程序吗?
更新2
更多细节.要澄清一件事 - 这个问题是由MACH消息处理的异常,而不是完全在RTL中处理的软件异常.
Embarcadero已经提出了一些评论以及这些功能 -
System.Internal.MachExceptions.pas -> catch_exception_raise_state_identity
{
Now we set up the thread state for the faulting thread so that when we
return, control will be passed to the exception dispatcher on that thread,
and this POSIX thread will continue watching for Mach exception messages.
See the …Run Code Online (Sandbox Code Playgroud) mach ×10
macos ×5
exception ×2
iphone ×2
objective-c ×2
binary-data ×1
core-audio ×1
crash ×1
darwin ×1
delphi ×1
elf ×1
executable ×1
iokit ×1
ios ×1
ipc ×1
memory ×1
microkernel ×1
minix ×1
plugins ×1
posix ×1
swift ×1
xpc ×1