Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1047678
  • 博文数量: 297
  • 博客积分: 11721
  • 博客等级: 上将
  • 技术积分: 3431
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-25 10:21
文章分类

全部博文(297)

文章存档

2016年(9)

2011年(71)

2010年(137)

2009年(80)

分类: LINUX

2011-07-04 23:45:19

1. 永久映射

#include
#include
#include
#include

MODULE_LICENSE("Dual BSD/GPL");


static int hello_init(void)
{
    struct page *pg;
    void *p;

    pg = alloc_pages(GFP_KERNEL, 2);
    if(!pg)
        printk("alloc_pages!\n");

    p = kmap(pg);

    printk("kmap->[%p]\n", p);

    kunmap(pg);

    __free_pages(pg, 2);

    printk("Installing module...\n");

    return 0;
}

static void hello_exit(void)
{

    printk("Uninstalling module.\n");
}

module_init(hello_init);
module_exit(hello_exit);

2. 临时映射
当需要创建一个在当前上下文中不能睡眠的映射, 内核提供了临时映射(原子映射)。
有一组保留的映射,他们可以存放新创建的临时映射。
/*                                                    
 * $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $
 */                                                   
#include
#include
#include
#include
#include

MODULE_LICENSE("Dual BSD/GPL");


static int hello_init(void)
{
    struct page *pg;
    void *p;

    pg = alloc_pages(GFP_KERNEL, 2);
    if(!pg)
        printk("alloc_pages!\n");

    p = kmap_atomic(pg, KM_USER0);

    printk("kmap->[%p]\n", p);

    kunmap_atomic(pg, KM_USER0);

    __free_pages(pg, 2);

    printk("Installing module...\n");

    return 0;
}

static void hello_exit(void)
{

    printk("Uninstalling module.\n");
}

module_init(hello_init);
module_exit(hello_exit);


阅读(1222) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~