科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用范例:用户态和内核共享内存

使用范例:用户态和内核共享内存

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

  例子中,用户态程序的KERNEL_VIRT_ADDR就是内核模块打印的地址p这里是hard coding(先加载内核模块,再把打印的地址赋值给KERNEL_VIRT_ADDR), 可以采用其他的方式传递。

作者:leviathan.alan 来源:chinaunix 2007年11月3日

关键字: 内存 内核 用户 Linux

  • 评论
  • 分享微博
  • 分享邮件

  例子中,用户态程序的KERNEL_VIRT_ADDR就是内核模块打印的地址p这里是hard coding(先加载内核模块,再把打印的地址赋值给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_ADDR 0xc5e3c000
 
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; 
} 

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章