- 论坛徽章:
- 0
|
回复 6# amarant
谢谢你的帮助。
我测试了下你的代码,如果仅仅映射4字节内存,是没有问题的。但是映射的内存多了就会崩溃。
比如:我映射了10240字节,然后对这块内存做 memset,之后就崩溃。- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/io.h>
- #include <linux/mm.h>
- #include <linux/slab.h>
- static int __init test_init(void)
- {
- char * buf = NULL;
- void __iomem * map;
- struct page * page;
- /////////////
- //mychange
- /////////////
- printk("\n\n--test begin--\n");
- buf = kmalloc( GFP_KERNEL, 10240);
- if (!buf) {
- printk( "ERR: no memory.\n" );
- return -1;
- }
- page = virt_to_page(buf);
- printk("========================\n");
- printk(" page_count(page): %d\n", (int) page_count(page));
- printk("virt addr of buf : 0x%p.\n", buf);
- printk("phys addr of buf: 0x%x.\n", (int) __pa(buf));
- printk("high addr of mem : 0x%x.\n", 1024*1024*896);
- printk("========================\n");
- if ((unsigned long)buf > __va(1024*1024*896)){
- printk("High mem.\n");
- kfree(buf);
- return 0;
- }
- /////////////
- //mychange
- /////////////
- map = ioremap((int)__pa(buf), 10240);
- if (!map){
- printk(" ERR: ioremap faild.\n");
- kfree(buf);
- return -1;
- }
- /////////////
- //mychange
- /////////////
- memset( map, 0, 10240 );
- printk(" page_count(page): %d\n", (int) page_count(page));
- kfree(buf);
- return 0;
- }
- static void __exit test_exit(void)
- {
- //do nothing now
- }
- module_init(test_init);
- module_exit(test_exit);
- MODULE_LICENSE("GPL");
复制代码 下面是崩溃的log: |
|