J'essaye d'imprimer l'adresse virtuelle de mem_map, l'adresse physique de mem_map et le nombre de page de structure maintenant. donc j'ai essayé d'exécuter le code de this article, mais il semblait que cela ne montre pas l'adresse correcte. Pourriez-vous me dire comment je peux résoudre ce problème?Comment imprimer les informations de mem_map en utilisant le fichier proc?
Voici le résultat de l'exécution.
mem_map virt adr: (null) mem_map Phys Adr: 131941395333120 mem_map phys pages: 18446744072101367984
J'utilise Ubuntu12.04 (64 bits) et la version du noyau est 3.13.
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <asm/switch_to.h>
#include <linux/types.h> /* size_t */
#include <linux/fcntl.h> /* O_ACCMODE */
#include <asm/uaccess.h> /* copy_from/to_user */
#include <linux/fs.h> // for basic filesystem
#include <linux/proc_fs.h> // for the proc filesystem
#include <linux/seq_file.h> // for sequence files
#include <linux/mm.h>
MODULE_LICENSE("Dual BSD/GPL");
static struct proc_dir_entry* proc_file;
struct page *mem_map;
EXPORT_SYMBOL(mem_map);
/* memory map functions */
int mem_map_show(struct seq_file *m, void *v);
//virtual_to_physical
inline unsigned long virt_to_phy(unsigned long addr);
inline unsigned long virt_to_phy(unsigned long addr){
return __pa(addr);
}
char buf[300];
int mem_map_show(struct seq_file *m, void *v){
int ret_val = 0;
printk(KERN_INFO "Proc file read \n");
ret_val = seq_printf(m, "mem_map virt addr: %p \n", mem_map);
ret_val += seq_printf(m, "mem_map phys addr: %lu \n",virt_to_phy((unsigned long)mem_map));
ret_val += seq_printf(m, "mem_map phys pages: %lu \n", (long unsigned int)get_num_physpages);
return ret_val;
}
static int mem_map_open(struct inode *inode, struct file *file){
return single_open(file, mem_map_show, NULL);
}
struct file_operations mem_map_fops = {
.owner = THIS_MODULE,
.open = mem_map_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
static int __init mem_map_init(void){
printk(KERN_INFO "Loaded mem_map module\n");
proc_file = proc_create("mem_map", 0, NULL, &mem_map_fops);
if(!proc_file){
printk(KERN_ALERT "Error: Could not initialize /proc/mem_map");
return -ENOMEM;
}
return 0;
}
static void __exit mem_map_exit(void){
remove_proc_entry("mem_map",NULL);
printk(KERN_INFO "Proc file unloaded \n");
}
/* Declaration of the init and exit functions */
module_init(mem_map_init);
module_exit(mem_map_exit);
Vous déclarez une variable 'mem_map' qui est un pointeur, et exporte même son symbole, mais où l'initialisez-vous? Qu'est-ce que vous voulez exactement imprimer, l'adresse de quoi? – Quaker
Je pensais que mem_map était initialisé quelque part parce que, d'après l'article que j'avais vu, mem_map n'était pas assigné par quoi que ce soit. C'est pourquoi j'étais confus. mais votre point est très évident.Merci de m'aider – Angesan