亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
}:
PPACKET_MMAPӳĆ}
[ӡ]
:
HazeC
rg:
2016-11-22 15:09
}:
PPACKET_MMAPӳĆ}棡
HazeC 2016-11-22 15:11
}aāԴ:һֱȺ˰є(sh)foÌӵķʽôܿcksocketnetlinkLԇ֮ŗǴmmap
ȻͿˣԭǃȺ˂foÌӵĔ(sh)Сǹ̶˽mmap(sh)F(xin){õremap_pfn_rangeҪһKBm(x)ăȴ档
Bm(x)ȴԒȴСͲɿ朱惦ÿbufȻremap_pfn_range朱ӳȥȻremap_pfn_rangeą(sh)ͱ
_ԴF(xin)PACKET_MMAPcPF_RINGDzõmmapʽύĔ(sh)
Ȳ鿴PF_RINGa
tot_mem = sizeof(FlowSlotInfo) + num_slots * the_slot_len;
if(tot_mem % PAGE_SIZE)
tot_mem += PAGE_SIZE - (tot_mem % PAGE_SIZE);
pfr->ring_memory = rvmalloc(tot_mem);
if(pfr->ring_memory != NULL) {
#if defined(RING_DEBUG)
printk("[PF_RING] successfully allocated %lu bytes at 0x%08lx\n",
(unsigned long)tot_mem, (unsigned long)pfr->ring_memory);
#endif
} else {
printk("[PF_RING] ERROR: not enough memory for ring\n");
return(-1);
}
// memset(pfr->ring_memory, 0, tot_mem); // rvmalloc does the memset already
pfr->slots_info = (FlowSlotInfo *) pfr->ring_memory;
pfr->ring_slots = (char *)(pfr->ring_memory + sizeof(FlowSlotInfo));
pfr->slots_info->version = RING_FLOWSLOT_VERSION;
pfr->slots_info->slot_len = the_slot_len;
pfr->slots_info->data_len = pfr->bucket_len;
pfr->slots_info->tot_slots =
(tot_mem - sizeof(FlowSlotInfo)) / the_slot_len;
pfr->slots_info->tot_mem = tot_mem;
pfr->slots_info->sample_rate = 1;
ƴa
PF_RINGҲǰbufŵһK̶ȴ挍F(xin)
ǿPACKET_MMAP,a
start = vma->vm_start;
for (rb = &po->rx_ring; rb <= &po->tx_ring; rb++) {
if (rb->pg_vec == NULL)
continue;
for (i = 0; i < rb->pg_vec_len; i++) {
struct page *page = virt_to_page(rb->pg_vec[i]);
int pg_num;
for (pg_num = 0; pg_num < rb->pg_vec_pages;
pg_num++, page++) {
err = vm_insert_page(vma, start, page);
if (unlikely(err))
goto out;
start += PAGE_SIZE;
}
}
}
atomic_inc(&po->mapped);
vma->vm_ops = &packet_mmap_ops;
ƴa
̎PACKET_MMAPmmapF(xin)vm_insert_pageǰbufϲһvmaӳ亯(sh)ȥˡļ]
ʲô
:
nswcfd
rg:
2016-11-25 12:58
vm_insert_pageѽset_pteIJˡ
:
HazeC
rg:
2016-11-28 16:25
؏
2#
nswcfd
ǵa˰Ѳͬsetͬһvma棬}Ǜ]vmaӳ䵽Ìȥֵ@һc
:
nswcfd
rg:
2016-12-02 15:43
nswcfd 2016-12-02 15:51
#define DRV_NAME "mmap"
#define DRV_VERSION "0.1"
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/miscdevice.h>
static int mmap_chr_close(struct inode *inode, struct file *file)
{
printk("chr close\n");
return 0;
}
int nomap;
module_param(nomap, int, 0);
static struct page *page;
static void mmap_open(struct vm_area_struct *vma)
{
printk("mmap_open: vma->start=%lx\n", vma->vm_start);
}
static void mmap_close(struct vm_area_struct *vma)
{
printk("mmap_close: vma->start=%lx\n", vma->vm_start);
}
static struct vm_operations_struct mmap_ops = {
.open = mmap_open,
.close = mmap_close,
};
static int mmap_chr_mmap(struct file *file, struct vm_area_struct *vma)
{
int err = -ENODEV;
printk("vma->start=%lx, vma->end=%lx\n", vma->vm_start, vma->vm_end);
if (nomap || !page)
return -ENODEV;
printk("page=%p, address=%p\n", page, page_address(page));
*(int *)page_address(page) = current->pid;
err = vm_insert_page(vma, vma->vm_start, page);
if (err)
return err;
vma->vm_ops = &mmap_ops;
return 0;
}
static struct file_operations mmap_fops = {
.owner = THIS_MODULE,
.llseek = no_llseek,
.release = mmap_chr_close,
.mmap = mmap_chr_mmap,
};
#define TUN_MINOR 200
#define MMAP_MINOR TUN_MINOR
static struct miscdevice mmap_miscdev = {
.minor = MMAP_MINOR,
.name = "mmap",
.fops = &mmap_fops,
};
static int __init mmap_init(void)
{
int ret = 0;
page = alloc_page(GFP_KERNEL);
printk("page=%p, addr=%p\n", page, page_address(page));
ret = misc_register(&mmap_miscdev);
if (ret)
printk(KERN_ERR "mmap: Can't register misc device %d\n", MMAP_MINOR);
return ret;
}
static void mmap_cleanup(void)
{
if (page)
__free_page(page);
misc_deregister(&mmap_miscdev);
}
module_init(mmap_init);
module_exit(mmap_cleanup);
MODULE_LICENSE("GPL");
MODULE_ALIAS_MISCDEV(MMAP_MINOR);
ƴa
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
int main()
{
int fd = open("mmap_dev", O_RDWR);
printf("fd=%d\n", fd);
if (fd < 0)
return 1;
char *p = mmap(0, 10, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
printf("mmap=%p\n", p);
if (p != MAP_FAILED)
printf("map[0]=%d, pid=%d\n", *(int *)p, getpid());
}
ƴa
# ./mmap_test
fd=3
<4>vma->start=2ad8378f7000, vma->end=2ad8378f8000
<4>page=ffff810000b21b78, address=ffff810012d59000
mmap=0x2ad8378f7000
map[0]=4557, pid=4557
<4>mmap_close: vma->start=2ad8378f7000
<4>chr close
עkernel(zh)fops->mmapą(sh)vma->startÑB(ti)mmapصĔ(sh)ֵһӵ
Ҳf푑mmap syscallĕrȺȷvmaÑB(ti)ԵַȻ{fops->mmap{PIEset_pteӳ퓱oÑB(ti)vma->start
:
HazeC
rg:
2016-12-30 13:50
؏
4#
nswcfd
fָxĻ؏푑mmap syscallĕrȺȷvmaÑB(ti)ԵַȻ{fops->mmap{PIEset_pteӳ퓱oÑB(ti)vma->start @ԒQɻ
F(xin)Ђ}ҰѶbufϲһvmaĕraf_packet.cʾδa
buf1\buf2\buf3f
start = vma->start
foreach(i in 3)
page = virt_to_page(bufi)
vm_insert_page(vma ,start ,page)
start += buf_size;
@Ԓ˼Dznjbuf퓲뵽һvmaȥÑ{mmapĕrĕrÑӫ@ȡăȴBm(x)@Bm(x)Ŀgvmaã
QԒf vma@F(xin)˰уȺ˶Bm(x)ăȴgϲһBm(x)Ñg
:
nswcfd
rg:
2016-12-30 20:02
ԓ@
ԿÑB(ti)mmap^һpageĕrӵ@Щcallback{ôΔ(sh)
:
HazeC
rg:
2017-01-03 10:41
؏
6#
nswcfd
fָx ɻ
gӭR Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2