歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

用戶態和內核共享內存的使用范例

例子中,用戶態程序的KERNEL_VIRT_ADDR就是內核模塊打印的地址p這裡是hardcoding(先加載內核模塊,再把打印的地址賦值給KERNEL_VIRT_ADDR),

可以采用其他的方式傳遞。

2.6內核驗證。

內核模塊-----------------------

#include
#include
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Wheelz");
MODULE_DESCRIPTION("mmap demo");
static unsigned long p = 0;
static int __init init(void)
{
//分配共享內存(一個頁面)
p = __get_free_pages(GFP_KERNEL, 0);
SetPageReserved(virt_to_page(p));
printk("<1> p = 0x%08x\n", p);
//在共享內存中寫上一個字符串
strcpy(p, "Hello world!\n");
return 0;
}
static void __exit fini(void)
{
ClearPageReserved(virt_to_page(p));
free_pages(p, 0);
}
module_init(init);
module_exit(fini);
用戶態程序---------------------------------
#include 
#include
#include
#include 
#include 
#define PAGE_SIZE (4*1024)
#define PAGE_OFFSET 0xc0000000
#define KERNEL_VIRT_ADDR0xc5e3c000
int main()
{
char *buf;
int fd;
unsigned long phy_addr;
fd=open("/dev/mem",O_RDWR);
if(fd == -1)
 perror("open");
phy_addr=KERNEL_VIRT_ADDR - PAGE_OFFSET;
buf=mmap(0, PAGE_SIZE,
 PROT_READ|PROT_WRITE, MAP_SHARED,
 fd, phy_addr);
if(buf == MAP_FAILED)
 perror("mmap");
puts(buf);//打印共享內存的內容
munmap(buf,PAGE_SIZE);
close(fd);
return 0;
}
Copyright © Linux教程網 All Rights Reserved