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