动态的将内核空间的物理地址和大小传给用户空间。本文也演示了内核空间和用户空间进行通信可以使用的两种常用方法:proc文件系统和mmap共享内存。
整个内核模块,在模块插入时建立proc文件,分配内存。卸载模块的时候将用户空间写入的内容打印出来。
以下是内核模块的代码和用户空间的测试代码。
|
|
用户空间的测试代码:
|
|
测试的内核是2.6.25.以下是执行结果。
|
debian:/home/km/memshare# insmod memshare_kernel.ko |
用你这种方式,想申请4M的内存,
static int __init init(void)
{
char * paddr;
int order = 0;
int offset = 0;
int tmp = 0;
/*build proc dir "memshare"and two proc files: phymem_addr, phymem_size in the dir*/
proc_memshare_dir = proc_mkdir(PROC_MEMSHARE_DIR, NULL);
create_proc_info_entry(PROC_MEMSHARE_PHYADDR, 0, proc_memshare_dir, proc_read_phymem_addr);
create_proc_info_entry(PROC_MEMSHARE_SIZE, 0, proc_memshare_dir, proc_read_phymem_size);
/*alloc one page*/
//kernel_memaddr =__get_free_pages(GFP_KERNEL, PAGE_ORDER);
[color=royalblue] order = get_order(4000000);
kernel_memaddr =__get_free_pages(GFP_KERNEL, order);
[/color]
if(!kernel_memaddr)
{
printk("Allocate memory failure!/n");
}
else
{
SetPageReserved(virt_to_page(kernel_memaddr));
//kernel_memsize = PAGES_NUMBER * PAGE_SIZE;
[color=royalblue] kernel_memsize = ((4000000 - 1) >> PAGE_SHIFT)* PAGE_SIZE;[/color]
[color=#4169e1][/color]
[color=black]...[/color]
[color=black]}[/color]
[color=black][/color]
[color=black][/color]
我在内核中往第一页(4k范围内)写数据,在用户态是能够读出来的,但是如果向以后的其它页写数据时,用户态就读不出了,
用户态写也这样。
需要对每个4k的页面执行:SetPageReserved(virt_to_page(kernel_memaddr));
内核中申请到页面之后,要调用一下SetPageReserved,相当于告诉系统,这个页面我已经占了。对于每一个申请到的页面,应该都要这样做。