- 論壇徽章:
- 0
|
作者:wheelz
來自:
http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=linuxK&Number=587187&page=0&view=collapsed&sb=5&o=all&fpart=
例子中,用戶態(tài)程序的KERNEL_VIRT_ADDR就是內(nèi)核模塊打印的地址p
這里是hard coding(先加載內(nèi)核模塊,再把打印的地址賦值給KERNEL_VIRT_ADDR),
可以采用其他的方式傳遞。
2.6內(nèi)核驗(yàn)證。
內(nèi)核模塊-----------------------
- #include <linux/config.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/mm.h>
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("Wheelz");
- MODULE_DESCRIPTION("mmap demo");
- static unsigned long p = 0;
- static int __init init(void)
- {
- //分配共享內(nèi)存(一個(gè)頁面)
- p = __get_free_pages(GFP_KERNEL, 0);
- SetPageReserved(virt_to_page(p));
- printk("<1> p = 0x%08x\n", p);
- //在共享內(nèi)存中寫上一個(gè)字符串
- strcpy(p, "Hello world!\n");
- return 0;
- }
- static void __exit fini(void)
- {
- ClearPageReserved(virt_to_page(p));
- free_pages(p, 0);
- }
- module_init(init);
- module_exit(fini);
- 用戶態(tài)程序---------------------------------
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <stdio.h>
- #define PAGE_SIZE (4*1024)
- #define PAGE_OFFSET 0xc0000000
- #define KERNEL_VIRT_ADDR 0xc5e3c000
- int main()
- {
- char *buf;
- int fd;
- unsigned long phy_addr;
- fd=open("/dev/mem",O_RDWR);
- if(fd == -1)
- perror("open");
- phy_addr=KERNEL_VIRT_ADDR - PAGE_OFFSET;
- buf=mmap(0, PAGE_SIZE,
- PROT_READ|PROT_WRITE, MAP_SHARED,
- fd, phy_addr);
- if(buf == MAP_FAILED)
- perror("mmap");
- puts(buf);//打印共享內(nèi)存的內(nèi)容
- munmap(buf,PAGE_SIZE);
- close(fd);
- return 0;
- }
復(fù)制代碼 |
|