要求在输出物理内存的信息后调用一次 get_free_page 函数分配一个空闲的物理页,先输出空白页的地址,然后输出空闲页和占用页的数量,,最后再调用一次 free_page 函数将刚刚分配的物理页进行回收,同样需要输出空闲页和占用页的数量。
时间: 2024-05-05 16:22:58 浏览: 24
好的,可以参考以下代码实现:
```
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/gfp.h>
#include <linux/mm.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
static int __init init_my_module(void)
{
unsigned long pfn;
unsigned long *page;
int free_pages, total_pages;
// 获取物理页面的信息
pfn = virt_to_phys(&init_my_module) >> PAGE_SHIFT;
printk(KERN_INFO "Physical address of init_my_module: 0x%lx\n", pfn << PAGE_SHIFT);
// 分配一个空闲的物理页面并输出相关信息
page = (unsigned long *)get_free_page(GFP_KERNEL);
printk(KERN_INFO "Address of the blank page: %p\n", page);
// 获取物理页面使用情况的信息
free_pages = nr_free_pages();
total_pages = num_physpages;
printk(KERN_INFO "Free pages: %d, Total pages: %d\n", free_pages, total_pages);
// 回收刚刚分配的物理页面并输出相关信息
free_page((unsigned long)page);
free_pages = nr_free_pages();
total_pages = num_physpages;
printk(KERN_INFO "Free pages: %d, Total pages: %d\n", free_pages, total_pages);
return 0;
}
static void __exit exit_my_module(void)
{
printk(KERN_INFO "Goodbye, world!\n");
}
module_init(init_my_module);
module_exit(exit_my_module);
```
在该代码中,我们先获取了一个全局变量 init_my_module 的物理地址,并输出到内核日志中。然后我们调用 get_free_page 函数分配一个空闲的物理页面,并输出该页面的地址。接下来输出当前系统中空闲和占用物理页面的数量。最后我们调用 free_page 函数回收刚刚分配的物理页面,并再次输出当前系统中空闲和占用物理页面的数量。
当我们编译并加载该模块时,可以在内核日志中看到以上输出信息。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)