获取系统不使用的内存方法:mmap
要求:
修改/boot/grub/menu.list
将 kernel /vmlinuz-2.6.15-1.2054_FC5 ro root=/dev/VolGroup00/LogVol00 rhgb
quiet 改为
kernel /vmlinuz-2.6.15-1.2054_FC5 ro root=/dev/VolGroup00/LogVol00 rhgb
quiet mem=400M
可通过 cat /proc/meminfo看出已经改了
将 kernel /vmlinuz-2.6.15-1.2054_FC5 ro root=/dev/VolGroup00/LogVol00 rhgb
quiet 改为
kernel /vmlinuz-2.6.15-1.2054_FC5 ro root=/dev/VolGroup00/LogVol00 rhgb
quiet mem=400M
可通过 cat /proc/meminfo看出已经改了
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/config.h>
//#include <linux/malloc.h> /* kmalloc() */
#include <linux/slab.h>
#include <linux/fs.h> /**//* everything... */
#include <linux/errno.h> /**//* error codes */
#include <linux/types.h> /**//* size_t */
#include <linux/proc_fs.h>
#include <linux/fcntl.h> /**//* O_ACCMODE */
#include <asm/system.h> /**//* cli(), *_flags */
#include <asm/io.h>
#include <linux/types.h>
#include <linux/cdev.h>
#include <linux/mm.h>/**//*vma*/
MODULE_LICENSE("Dual BSD/GPL");
#define DEVNAME "DevDirectIO"
dev_t dev = 0;
void directIO_vm_open(struct vm_area_struct *vm)
...{
printk("vm opened ");
}
void directIO_vm_close(struct vm_area_struct *vm)
...{
}
static struct vm_operations_struct directIO_remap_vm_ops = ...{
.open = directIO_vm_open,
.close = directIO_vm_close,
};
int directIO_open(struct inode *inode, struct file *filp)
...{
printk("DirectIO: open() ");
return 0; /**//* success */
}
int directIO_release(struct inode *inode, struct file *filp)
...{
// MOD_DEC_USE_COUNT;
return 0;
}
ssize_t directIO_read(struct file *filp, char *buf, size_t count,
loff_t *f_pos)
...{
ssize_t ret = 0;
return ret;
}
ssize_t directIO_write(struct file *filp, const char *buf, size_t count,
loff_t *f_pos)
...{
// ssize_t ret = -ENOMEM; /* value used in "goto out" statements */
return count;
}
int directIO_mmap(struct file* filep, struct vm_area_struct* vm)
...{
// unsigned long lenth = vm->
printk("start:%lu length:%lu off:%lu ", vm->vm_start,vm->vm_end - vm->vm_start,vm->vm_pgoff);
/**//*if(remap_pfn_range(vm, vm->vm_start,vm->vm_pgoff,vm->vm_end -
vm->vm_start,vm->vm_page_prot)){
return -EAGAIN;
}*/
unsigned long ulStart = (VMALLOC_START - PAGE_OFFSET - VMALLOC_OFFSET) >> 12;
/**//* VMALLOC_START:系统虚拟内存总大小
PAGE_OFFSET:8M空隙
VMALLOC_OFFSET:虚拟内存(高端)起始点,linux2.6的为3G
*/
if(remap_pfn_range(vm, vm->vm_start,ulStart + 1,vm->vm_end -
vm->vm_start,vm->vm_page_prot))...{
return -EAGAIN;
}
vm->vm_ops = &directIO_remap_vm_ops;
directIO_vm_open(vm);
return 0;
}
本文介绍了通过mmap系统调用获取系统中未被识别或未使用的内存区域的方法,主要适用于Linux环境。
54

被折叠的 条评论
为什么被折叠?



