++++++ 轉載 ++++
//////////////////////////////////////////////////// Kernel mode module
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
static unsigned long p = 0;
static int __init shao_init(void)
{
//分配共享內存(一個頁面)
p = __get_free_pages(GFP_KERNEL, 0);
SetPageReserved(virt_to_page(p));
printk("<1> p = 0x%08x\n", p); // we will get value of P
//在共享內存中寫上一個字符串
strcpy(p, "Hello world!\n");
return 0;
}
static void __exit shao_exit(void)
{
ClearPageReserved(virt_to_page(p));
free_pages(p, 0);
}
MODULE_LICENSE("GPL");
MODULE_AUTHOR("helloworld");
MODULE_DESCRIPTION("mmap test");
module_init(shao_init);
module_exit(shao_exit);
//////////////////////////////////////////////////// User mode applicaiton
#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 //此處地址即爲內核模塊打印的地址p,動態的不固定,需要自行修改
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;
}
mmap--最簡單的測試程序(用戶空間與內核空間數據交換&&用戶態和內核態的數據交換用例)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Linux核心技能与应用
wy53780
2020-04-23 14:02:05
Python與家國天下
豌豆花下貓
2019-02-24 22:22:40
linux上安裝Docker(非常簡單的安裝方法)
幸運券發放
2019-02-24 19:38:01
2019年Java面試-併發容器篇
王知無
2019-02-24 15:12:46
淺淡個人學習嵌入式Linux過程
wx5c317e5b736d2
2019-02-24 13:31:30
DHCP服務原理與搭建(Linux系統+路由器,二選一方案)
wx5c7174443c6f9
2019-02-24 13:23:18
Redis安裝與配置
劉遄
2019-02-24 13:12:51
Linux查看CPU和內存使用情況
wbzjacky
2019-02-24 13:12:37
相關Linux安全方面的知識點
slqbj
2019-02-24 13:02:39
忘記了Linux密碼,使用GRUB重新設置
slqbj
2019-02-24 13:02:39
Oracle11g 基於linux 6.3下安裝
love壁虎
2019-02-24 12:55:06
Oracle基於Linux 7下的安裝
love壁虎
2019-02-24 12:55:05
CentOS7更換yum源
駙馬葉子
2019-02-23 20:02:48