能力值:
( LV2,RANK:10 )
|
-
-
2 楼
mdl映射
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
确实是一个很复杂的问题,需要考虑到很多细节。下面是一些大致步骤和思路,但是不能保证代码细节以及适用范围,请根据实际情况进行使用。 1、声明一个指针变量,指向需要映射的用户空间地址: 1 | void * user_addr = ( void *)0x12345678;
|
2、使用get_user_pages() 函数获取需要映射的页面,并返回对应的page 指针: 1 2 3 4 5 6 7 | struct page* user_page = NULL;
unsigned long user_addr_long = (unsigned long )user_addr;
unsigned int flags = FOLL_WRITE;
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 指针映射到内核空间,并返回映射后的内核空间地址: 1 | void * kernel_addr = kmap(user_page);
|
现在,kernel_addr 指向的就是user_addr 所映射的内核空间地址,你可以在这个地址上执行需要的操作。
4、若需要锁定内核空间页面,可以使用set_page_dirty_lock() 函数: 1 | set_page_dirty_lock(user_page);
|
但是需要注意的是,锁定页面会对整个系统的内存管理产生比较严重的影响,使用时需要慎重。
5、最后,使用kunmap() 和put_page() 函数释放资源: 1 2 | kunmap(user_page);
put_page(user_page);
|
以上是一个比较简单的示例代码片段,你可以在实际使用中根据需要进行修改和完善。如果你想要学习更加详细的架构和细节,请参考内核源码文档和相关书籍。
最后于 2023-3-29 14:37
被caocaofff编辑
,原因:
|
能力值:
( LV9,RANK:195 )
|
-
-
4 楼
mdl
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
ok
|
|
|