亚洲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
  1. tot_mem = sizeof(FlowSlotInfo) + num_slots * the_slot_len;
  2.   if(tot_mem % PAGE_SIZE)
  3.     tot_mem += PAGE_SIZE - (tot_mem % PAGE_SIZE);

  4.   pfr->ring_memory = rvmalloc(tot_mem);

  5.   if(pfr->ring_memory != NULL) {
  6. #if defined(RING_DEBUG)
  7.     printk("[PF_RING] successfully allocated %lu bytes at 0x%08lx\n",
  8.            (unsigned long)tot_mem, (unsigned long)pfr->ring_memory);
  9. #endif
  10.   } else {
  11.     printk("[PF_RING] ERROR: not enough memory for ring\n");
  12.     return(-1);
  13.   }

  14.   // memset(pfr->ring_memory, 0, tot_mem); // rvmalloc does the memset already

  15.   pfr->slots_info = (FlowSlotInfo *) pfr->ring_memory;
  16.   pfr->ring_slots = (char *)(pfr->ring_memory + sizeof(FlowSlotInfo));

  17.   pfr->slots_info->version = RING_FLOWSLOT_VERSION;
  18.   pfr->slots_info->slot_len = the_slot_len;
  19.   pfr->slots_info->data_len = pfr->bucket_len;
  20.   pfr->slots_info->tot_slots =
  21.     (tot_mem - sizeof(FlowSlotInfo)) / the_slot_len;
  22.   pfr->slots_info->tot_mem = tot_mem;
  23.   pfr->slots_info->sample_rate = 1;
ƴa
PF_RINGҲǰbufŵһK̶ȴ挍F(xin)
ǿPACKET_MMAP,a

  1.         start = vma->vm_start;
  2.         for (rb = &po->rx_ring; rb <= &po->tx_ring; rb++) {
  3.                 if (rb->pg_vec == NULL)
  4.                         continue;

  5.                 for (i = 0; i < rb->pg_vec_len; i++) {
  6.                         struct page *page = virt_to_page(rb->pg_vec[i]);
  7.                         int pg_num;

  8.                         for (pg_num = 0; pg_num < rb->pg_vec_pages;
  9.                                         pg_num++, page++) {
  10.                                 err = vm_insert_page(vma, start, page);
  11.                                 if (unlikely(err))
  12.                                         goto out;
  13.                                 start += PAGE_SIZE;
  14.                         }
  15.                 }
  16.         }

  17.         atomic_inc(&po->mapped);
  18.         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 ݋
  1. #define DRV_NAME        "mmap"
  2. #define DRV_VERSION        "0.1"

  3. #include <linux/module.h>
  4. #include <linux/kernel.h>
  5. #include <linux/mm.h>
  6. #include <linux/miscdevice.h>

  7. static int mmap_chr_close(struct inode *inode, struct file *file)
  8. {
  9.         printk("chr close\n");
  10.         return 0;
  11. }

  12. int nomap;
  13. module_param(nomap, int, 0);

  14. static struct page *page;

  15. static void mmap_open(struct vm_area_struct *vma)
  16. {
  17.         printk("mmap_open: vma->start=%lx\n", vma->vm_start);
  18. }

  19. static void mmap_close(struct vm_area_struct *vma)
  20. {
  21.         printk("mmap_close: vma->start=%lx\n", vma->vm_start);
  22. }

  23. static struct vm_operations_struct mmap_ops = {
  24.         .open = mmap_open,
  25.         .close = mmap_close,
  26. };

  27. static int mmap_chr_mmap(struct file *file, struct vm_area_struct *vma)
  28. {
  29.         int err = -ENODEV;
  30.         printk("vma->start=%lx, vma->end=%lx\n", vma->vm_start, vma->vm_end);
  31.         if (nomap || !page)        
  32.                 return -ENODEV;
  33.         printk("page=%p, address=%p\n", page, page_address(page));
  34.         *(int *)page_address(page) = current->pid;
  35.         err = vm_insert_page(vma, vma->vm_start, page);
  36.         if (err)
  37.                 return err;
  38.         vma->vm_ops = &mmap_ops;
  39.         return 0;
  40. }

  41. static struct file_operations mmap_fops = {
  42.         .owner        = THIS_MODULE,        
  43.         .llseek = no_llseek,
  44.         .release = mmap_chr_close,
  45.         .mmap = mmap_chr_mmap,
  46. };

  47. #define TUN_MINOR        200
  48. #define MMAP_MINOR        TUN_MINOR

  49. static struct miscdevice mmap_miscdev = {
  50.         .minor = MMAP_MINOR,
  51.         .name = "mmap",
  52.         .fops = &mmap_fops,
  53. };

  54. static int __init mmap_init(void)
  55. {
  56.         int ret = 0;
  57.         page = alloc_page(GFP_KERNEL);
  58.         printk("page=%p, addr=%p\n", page, page_address(page));
  59.         ret = misc_register(&mmap_miscdev);
  60.         if (ret)
  61.                 printk(KERN_ERR "mmap: Can't register misc device %d\n", MMAP_MINOR);
  62.         return ret;
  63. }

  64. static void mmap_cleanup(void)
  65. {
  66.         if (page)
  67.                 __free_page(page);
  68.         misc_deregister(&mmap_miscdev);  
  69. }

  70. module_init(mmap_init);
  71. module_exit(mmap_cleanup);
  72. MODULE_LICENSE("GPL");
  73. MODULE_ALIAS_MISCDEV(MMAP_MINOR);
ƴa

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include <sys/mman.h>

  5. int main()
  6. {
  7.         int fd = open("mmap_dev", O_RDWR);
  8.         printf("fd=%d\n", fd);
  9.         if (fd < 0)
  10.                 return 1;
  11.         char *p = mmap(0, 10, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
  12.         printf("mmap=%p\n", p);
  13.         if (p != MAP_FAILED)
  14.                 printf("map[0]=%d, pid=%d\n", *(int *)p, getpid());
  15. }
ƴ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