在 mac OS X 网络内核扩展中,我注意到如果我有一个静态分配的缓冲区而不是动态的缓冲区,这会在调用诸如 printf() 或 send()、ctl_enqueuedata() 等 API 函数时导致内核恐慌,如以及其他许多人。就好像无法从我的代码外部读取或写入静态分配的缓冲区。
例如:
// This is OK
static char* somevar = NULL;
somevar = OSMalloc(50, myOSMallocTag);
bzero(somevar, 50);
// This will create a kernel panic when used outside my code
static char somevar[50];
bzero(somevar, 50);
这是为什么?
编辑:我正要发布代码,但它很长,并且有效的版本和导致恐慌的版本之间的唯一区别如上所述。我想到的是静态变量和使用 OSMalloc 分配的变量之间的内存位置差异。ctl_enqueuedata() 中的代码可以同时访问两者吗?
这是发生的事情:
panic(cpu 0 caller 0xffffff802eeb7e95): Kernel trap at 0xffffff802ee28896, type 14=page fault, registers:
CR0: 0x0000000080010033, CR2: 0x0000000000000031, CR3: 0x000000024fbac0a7, CR4: 0x00000000001606e0
RAX: 0x000000007fffff01, RBX: 0x0000000000000000, RCX: 0x0000000000000010, RDX: 0xffffff7fb0d4d573
RSP: 0xffffff811f6fbae0, RBP: 0xffffff811f6fbbe0, RSI: 0x000000007fffffff, RDI: 0x0000000000000073
R8: 0x0000000000000000, R9: 0x0000000000000031, R10: 0x0000000000000000, R11: 0x0000000000000000
R12: 0x0000000000000000, R13: 0x0000000000000019, R14: 0xffffff811f6fbd01, R15: 0x0000000000000031
RFL: 0x0000000000010246, RIP: 0xffffff802ee28896, CS: 0x0000000000000008, SS: 0x0000000000000010
Fault CR2: 0x0000000000000031, Error code: 0x0000000000000000, Fault CPU: 0x0
Backtrace (CPU 0), Frame : Return Address
0xffffff811f6fb780 : 0xffffff802ee1d626
0xffffff811f6fb7f0 : 0xffffff802eeb7e95
0xffffff811f6fb9c0 : 0xffffff802eecd4dd
0xffffff811f6fb9e0 : 0xffffff802ee28896
0xffffff811f6fbbe0 : 0xffffff802f174a62
0xffffff811f6fbc00 : 0xffffff7fb0d4cead
0xffffff811f6fbd40 : 0xffffff7fb0d46101
0xffffff811f6fbdf0 : 0xffffff802f150525
0xffffff811f6fbe40 : 0xffffff802f1990b2
0xffffff811f6fbef0 : 0xffffff802f1a04f2
0xffffff811f6fbf50 : 0xffffff802f1e063a
0xffffff811f6fbfb0 : 0xffffff802eecdd23