例子中,用户态程序的KERNEL_VIRT_ADDR就是内核模块打印的地址p这里是hardcoding(先加载内核模块,再把打印的地址赋值给KERNEL_VIRT_ADDR),
可以采用其他的方式传递。
2.6内核验证。
内核模块-----------------------
#include #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("Wheelz"); MODULE_DESCRIPTION("mmap demo"); static unsigned long p = 0; static int __init init(void) { //分配共享内存(一个页面) p = __get_free_pages(GFP_KERNEL, 0); SetPageReserved(virt_to_page(p)); printk("<1> p = 0x%08x\n", p); //在共享内存中写上一个字符串 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); 用户态程序--------------------------------- #include #include #include #include #include #define PAGE_SIZE (4*1024) #define PAGE_OFFSET 0xc0000000 #define KERNEL_VIRT_ADDR0xc5e3c000 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);//打印共享内存的内容 munmap(buf,PAGE_SIZE); close(fd); return 0; }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, include
, 内核
, 模块
, define
用户
内核态 用户态、用户态和内核态的区别、linux 用户态 内核态、用户态和内核态、linux用户态和内核态,以便于您获取更多的相关知识。
时间: 2024-07-28 14:15:44