1
#include
<linux/miscdevice.h>
2
#include
<linux/delay.h>
3
#include
<linux/kernel.h>
4
#include
<linux/module.h>
5
#include
<linux/init.h>
6
#include
<linux/mm.h>
7
#include
<linux/fs.h>
8
#include
<linux/types.h>
9
#include
<linux/delay.h>
10
#include
<linux/moduleparam.h>
11
#include
<linux/slab.h>
12
#include
<linux/errno.h>
13
#include
<linux/ioctl.h>
14
#include
<linux/cdev.h>
15
#include
<linux/string.h>
16
#include
<linux/list.h>
17
#include
<linux/pci.h>
18
#include
<linux/gpio.h>
19
20
21
#define
DEVICE_NAME
"mymap"
22
23
24
static
unsigned
char
array
[
10
]={
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
};
25
static
unsigned
char
*
buffer
;
26
27
28
static
int
my_open
(
struct
inode
*
inode
,
struct
file
*
file
)
29
{
30
return
0
;
31
}
32
33
34
static
int
my_map
(
struct
file
*
filp
,
struct
vm_area_struct
*
vma
)
35
{
36
unsigned
long
page
;
37
unsigned
char
i
;
38
unsigned
long
start
=
(
unsigned
long
)
vma
->
vm_start
;
39
//unsigned long end = (unsigned long)vma->vm_end;
40 unsigned long size = (unsigned long)(vma->vm_end - vma->vm_start);
41
42 //得到物理地址
43 page = virt_to_phys(buffer);
44 //将用户空间的一个vma虚拟内存区映射到以page开始的一段连续物理页面上
45 if(remap_pfn_range(vma,start,page>>PAGE_SHIFT,size,PAGE_SHARED))//第三个参数是页帧号,由物理地址右移PAGE_SHIFT得到
46 return -1;
47
48 //往该内存写10字节数据
49 for(i=0;i<10;i++)
50 buffer[i] = array[i];
51
52 return 0;
53 }
54
55
56 static struct file_operations dev_fops = {
57 .owner = THIS_MODULE,
58 .open = my_open,
59 .mmap = my_map,
60 };
61
62 static struct miscdevice misc = {
63 .minor = MISC_DYNAMIC_MINOR,
64 .name = DEVICE_NAME,
65 .fops = &dev_fops,
66 };
67
68
69 static int __init dev_init(void)
70 {
71 int ret;
72
73 //注册混杂设备
74 ret = misc_register(&misc);
75 //内存分配
76 buffer = (unsigned char *)kmalloc(PAGE_SIZE,GFP_KERNEL);
77 //将该段内存设置为保留
78 SetPageReserved(virt_to_page(buffer));
79
80 return ret;
81 }
82
83
84 static void __exit dev_exit(void)
85 {
86 //注销设备
87 misc_deregister(&misc);
88 //清除保留
89 ClearPageReserved(virt_to_page(buffer));
90 //释放内存
91 kfree(buffer);
92 }
93
94
95 module_init(dev_init);
96 module_exit(dev_exit);
97 MODULE_LICENSE("GPL");
98 MODULE_AUTHOR("LKN@SCUT");