- 论坛徽章:
- 0
|
拜读了你的帖子
http://linux.chinaunix.net/bbs/thread-1034670-1-5.html
我在我自己电脑上尝试了下:
发现没了create_proc_info_entry这个函数,我自己修改了下代码如下:可以make 也可以insmod但是运行用户态程序时
./mmap_user 'hello'
phymem_addr=0, phymem_size=0
Segmentation fault
dmesg的信息:
[18065.048108] mmap_user[11329]: segfault at ffffffff ip b7ed4da4 sp bfaec690 error 6 in libc-2.8.90.so[b7e5e000+158000]
[18068.692529] mmap_user[11330]: segfault at ffffffff ip b7e6fda4 sp bfe89a30 error 6 in libc-2.8.90.so[b7df9000+158000]
#include <linux/version.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/mm.h>
#define PROC_MEMSHARE_DIR "memshare"
#define PROC_MEMSHARE_PHYADDR "phymem_addr"
#define PROC_MEMSHARE_SIZE "phymem_size"
/*alloc one page. 4096 bytes*/
#define PAGE_ORDER 0
/*this value can get from PAGE_ORDER*/
#define PAGES_NUMBER 1
struct proc_dir_entry *proc_memshare_dir ;
unsigned long kernel_memaddr = 0;
unsigned long kernel_memsize= 0;
/*static int proc_read_phymem_addr(char *page, char **start, off_t off, int count)
{
return sprintf(page, "%08lx\n", __pa(kernel_memaddr));
}
static int proc_read_phymem_size(char *page, char **start, off_t off, int count)
{
return sprintf(page, "%lu\n", kernel_memsize);
}*/
static int __init init(void)
{
/*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_entry(PROC_MEMSHARE_PHYADDR, 0644, proc_memshare_dir);
create_proc_entry(PROC_MEMSHARE_SIZE, 0644, proc_memshare_dir);
/*alloc one page*/
kernel_memaddr =__get_free_pages(GFP_KERNEL, PAGE_ORDER);
if(!kernel_memaddr)
{
printk("Allocate memory failure!\n");
}
else
{
SetPageReserved(virt_to_page(kernel_memaddr));
kernel_memsize = PAGES_NUMBER * PAGE_SIZE;
printk("Allocate memory success!. The phy mem addr=%08lx, size=%lu\n", __pa(kernel_memaddr), kernel_memsize);
}
return 0;
}
static void __exit fini(void)
{
printk("The content written by user is: %s\n", (unsigned char *) kernel_memaddr);
ClearPageReserved(virt_to_page(kernel_memaddr));
free_pages(kernel_memaddr, PAGE_ORDER);
remove_proc_entry(PROC_MEMSHARE_PHYADDR, proc_memshare_dir);
remove_proc_entry(PROC_MEMSHARE_SIZE, proc_memshare_dir);
remove_proc_entry(PROC_MEMSHARE_DIR, NULL);
return;
}
module_init(init);
module_exit(fini);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Godbach (nylzhaowei@163.com)");
MODULE_DESCRIPTION("Kernel memory share module."); |
先谢谢了 |
|