首页
社区
课程
招聘
[求助]把用户地址空间映射到内核地址空间,并锁定。
发表于: 2023-3-29 06:59 7353

[求助]把用户地址空间映射到内核地址空间,并锁定。

2023-3-29 06:59
7353

把用户地址空间映射到内核地址空间,并锁定。

 

怎么做?谢谢


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 6394
活跃值: (4637)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mdl映射
2023-3-29 09:40
0
雪    币: 3001
活跃值: (2625)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

确实是一个很复杂的问题,需要考虑到很多细节。下面是一些大致步骤和思路,但是不能保证代码细节以及适用范围,请根据实际情况进行使用。

1、声明一个指针变量,指向需要映射的用户空间地址:

void* user_addr = (void*)0x12345678;


2、使用get_user_pages()函数获取需要映射的页面,并返回对应的page指针:

struct page* user_page = NULL;
unsigned long user_addr_long = (unsigned long)user_addr;  // 注意需要将指针转化为长整型
unsigned int flags = FOLL_WRITE;  // 根据需要修改flags
int result = get_user_pages(current, current->mm, user_addr_long, 1, flags, 0, &user_page, NULL);
if (result < 0 || !user_page) {
    // 错误处理
}


3、使用函数kmap()page指针映射到内核空间,并返回映射后的内核空间地址:

void* kernel_addr = kmap(user_page);


现在,kernel_addr指向的就是user_addr所映射的内核空间地址,你可以在这个地址上执行需要的操作。



4、若需要锁定内核空间页面,可以使用set_page_dirty_lock()函数:

set_page_dirty_lock(user_page);


但是需要注意的是,锁定页面会对整个系统的内存管理产生比较严重的影响,使用时需要慎重。



5、最后,使用kunmap()put_page()函数释放资源:

kunmap(user_page);
put_page(user_page);


以上是一个比较简单的示例代码片段,你可以在实际使用中根据需要进行修改和完善。如果你想要学习更加详细的架构和细节,请参考内核源码文档和相关书籍。


最后于 2023-3-29 14:37 被caocaofff编辑 ,原因:
2023-3-29 14:13
1
雪    币: 203
活跃值: (1204)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
4
mdl
2023-3-30 11:11
0
雪    币: 515
活跃值: (3312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wem
5
ok
2023-4-4 18:34
0
游客
登录 | 注册 方可回帖
返回
//