linux内核没有ashmem,shmem/ashmem/mmap

*******************************************************************

/*

* Example of using hugepage memory in a user application using Sys V shared

* memory system calls.  In this example the app is requesting 256MB of

* memory that is backed by huge pages.  The application uses the flag

* SHM_HUGETLB in the shmget system call to inform the kernel that it is

* requesting hugepages.

*

* For the ia64 architecture, the Linux kernel reserves Region number 4 for

* hugepages.  That means the addresses starting with 0x800000... will need

* to be specified.  Specifying a fixed address is not required on ppc64,

* i386 or x86_64.

*

* Note: The default shared memory limit is quite low on many kernels,

* you may need to increase it via:

*

* echo 268435456 > /proc/sys/kernel/shmmax

*

* This will increase the maximum size per shared memory segment to 256MB.

* The other limit that you will hit eventually is shmall which is the

* total amount of shared memory in pages. To set it to 16GB on a system

* with a 4kB pagesize do:

*

* echo 4194304 > /proc/sys/kernel/shmall

*/

#include

#include

#include

#include

#include

#include

#ifndef SHM_HUGETLB

#define SHM_HUGETLB 04000

#endif

#define LENGTH (256UL*1024*1024)

#define dprintf(x)  printf(x)

/* Only ia64 requires this */

#ifdef __ia64__

#define ADDR (void *)(0x8000000000000000UL)

#define SHMAT_FLAGS (SHM_RND)

#else

#define ADDR (void *)(0x0UL)

#define SHMAT_FLAGS (0)

#endif

int main(void)

{

int shmid;

unsigned long i;

char *shmaddr;

if ((shmid = shmget(2, LENGTH,

SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W)) < 0) {

perror("shmget");

exit(1);

}

printf("shmid: 0x%x\n", shmid);

shmaddr = shmat(shmid, ADDR, SHMAT_FLAGS);

if (shmaddr == (char *)-1) {

perror("Shared memory attach failure");

shmctl(shmid, IPC_RMID, NULL);

exit(2);

}

printf("shmaddr: %p\n", shmaddr);

dprintf("Starting the writes:\n");

for (i = 0; i < LENGTH; i++) {

shmaddr[i] = (char)(i);

if (!(i % (1024 * 1024)))

dprintf(".");

}

dprintf("\n");

dprintf("Starting the Check...");

for (i = 0; i < LENGTH; i++)

if (shmaddr[i] != (char)i)

printf("\nIndex %lu mismatched\n", i);

dprintf("Done.\n");

if (shmdt((const void *)shmaddr) != 0) {

perror("Detach failure");

shmctl(shmid, IPC_RMID, NULL);

exit(3);

}

shmctl(shmid, IPC_RMID, NULL);

return 0;

}

*******************************************************************

/*

* Example of using hugepage memory in a user application using the mmap

* system call.  Before running this application, make sure that the

* administrator has mounted the hugetlbfs filesystem (on some directory

* like /mnt) using the command mount -t hugetlbfs nodev /mnt. In this

* example, the app is requesting memory of size 256MB that is backed by

* huge pages.

*

* For ia64 architecture, Linux kernel reserves Region number 4 for hugepages.

* That means the addresses starting with 0x800000... will need to be

* specified.  Specifying a fixed address is not required on ppc64, i386

* or x86_64.

*/

#include

#include

#include

#include

#include

#define FILE_NAME "/mnt/hugepagefile"

#define LENGTH (256UL*1024*1024)

#define PROTECTION (PROT_READ | PROT_WRITE)

/* Only ia64 requires this */

#ifdef __ia64__

#define ADDR (void *)(0x8000000000000000UL)

#define FLAGS (MAP_SHARED | MAP_FIXED)

#else

#define ADDR (void *)(0x0UL)

#define FLAGS (MAP_SHARED)

#endif

void check_bytes(char *addr)

{

printf("First hex is %x\n", *((unsigned int *)addr));

}

void write_bytes(char *addr)

{

unsigned long i;

for (i = 0; i < LENGTH; i++)

*(addr + i) = (char)i;

}

void read_bytes(char *addr)

{

unsigned long i;

check_bytes(addr);

for (i = 0; i < LENGTH; i++)

if (*(addr + i) != (char)i) {

printf("Mismatch at %lu\n", i);

break;

}

}

int main(void)

{

void *addr;

int fd;

fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755);

if (fd < 0) {

perror("Open failed");

exit(1);

}

addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, fd, 0);

if (addr == MAP_FAILED) {

perror("mmap");

unlink(FILE_NAME);

exit(1);

}

printf("Returned address is %p\n", addr);

check_bytes(addr);

write_bytes(addr);

read_bytes(addr);

munmap(addr, LENGTH);

close(fd);

unlink(FILE_NAME);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值