IPC SysV 共享内存 - shmget()、shmat() 不起作用
IPC SysV Shared memory - shmget(), shmat() does not work
cat /proc/sys/kernel/shmmax
18446744073692774399
正在尝试创建 shmem 内存并在稍后覆盖它以解决 HUGE Dirty COW 漏洞。
MAXMYMEM 的分配以某种方式显示错误 "Cannot allocate memory",错误代码 12。
为什么不起作用?
allocate.c
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <string.h>
#define MAXMYMEM 0x200000
int main(int argc, char **argv)
{
int shID;
char *myPtr;
int i;
shID = shmget(2409, MAXMYMEM, IPC_CREAT | SHM_HUGETLB | 0666 );
if (shID >= 0) {
myPtr = shmat(shID, 0, 0);
if (myPtr==(char *)-1) {
perror("shmat");
} else {
for (i=0; i<MAXMYMEM; i++) {
myPtr[i] = 'A'+i;
}
getchar();
shmdt(myPtr);
}
} else {
perror("shmget");
}
}
更新 1:
grep -i huge /proc/meminfo
AnonHugePages: 1714176 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
更新二:
$cat /proc/sys/vm/hugetlb_shm_group
0
$uname -a
Linux 4.4.0-101-generic #124-Ubuntu SMP Fri Nov 10 18:29:59 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
原因是在 Ubuntu 16.04 中,Huge Pages 的数量设置为 0。
$sysctl vm.nr_hugepages
vm.nr_hugepages = 0
通过将其更改为不同的值,程序成功了!
$sysctl -w vm.nr_hugepages=512
cat /proc/sys/kernel/shmmax
18446744073692774399
正在尝试创建 shmem 内存并在稍后覆盖它以解决 HUGE Dirty COW 漏洞。
MAXMYMEM 的分配以某种方式显示错误 "Cannot allocate memory",错误代码 12。
为什么不起作用?
allocate.c
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <string.h>
#define MAXMYMEM 0x200000
int main(int argc, char **argv)
{
int shID;
char *myPtr;
int i;
shID = shmget(2409, MAXMYMEM, IPC_CREAT | SHM_HUGETLB | 0666 );
if (shID >= 0) {
myPtr = shmat(shID, 0, 0);
if (myPtr==(char *)-1) {
perror("shmat");
} else {
for (i=0; i<MAXMYMEM; i++) {
myPtr[i] = 'A'+i;
}
getchar();
shmdt(myPtr);
}
} else {
perror("shmget");
}
}
更新 1:
grep -i huge /proc/meminfo
AnonHugePages: 1714176 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
更新二:
$cat /proc/sys/vm/hugetlb_shm_group
0
$uname -a
Linux 4.4.0-101-generic #124-Ubuntu SMP Fri Nov 10 18:29:59 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
原因是在 Ubuntu 16.04 中,Huge Pages 的数量设置为 0。
$sysctl vm.nr_hugepages
vm.nr_hugepages = 0
通过将其更改为不同的值,程序成功了!
$sysctl -w vm.nr_hugepages=512