亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mmap.c

?? linux device driver源碼
?? C
字號:
/*  -*- C -*- * mmap.c -- memory mapping for the scullp char module * * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet * Copyright (C) 2001 O'Reilly & Associates * * The source code in this file can be freely used, adapted, * and redistributed in source or binary form, so long as an * acknowledgment appears in derived source files.  The citation * should list that the code comes from the book "Linux Device * Drivers" by Alessandro Rubini and Jonathan Corbet, published * by O'Reilly & Associates.   No warranty is attached; * we cannot take responsibility for errors or fitness for use. * * $Id: _mmap.c.in,v 1.21 2001/07/18 22:28:18 rubini Exp $ */#ifndef __KERNEL__#  define __KERNEL__#endif#ifndef MODULE#  define MODULE#endif#include <linux/config.h>#define __NO_VERSION__#include <linux/module.h>#include <linux/mm.h>     /* everything */#include <linux/errno.h>  /* error codes */#include <asm/pgtable.h>#include "scullp.h"        /* local definitions *//* * Given a VMA, get our device pointer from it. */static inline ScullP_Dev *scullp_vma_to_dev (struct vm_area_struct *vma){#if defined(LINUX_24)    return (ScullP_Dev *) vma->vm_private_data;#elif defined(LINUX_22)    struct inode *inode = INODE_FROM_F(vma->vm_file);     return scullp_devices + MINOR(inode->i_rdev);#else /* LINUX_20 */    return scullp_devices + MINOR(vma->vm_inode->i_rdev);#endif}/* * open and close: just keep track of how many times the device is * mapped, to avoid releasing it. */void scullp_vma_open(struct vm_area_struct *vma){    ScullP_Dev *dev = scullp_vma_to_dev(vma);    dev->vmas++;    MOD_INC_USE_COUNT;}void scullp_vma_close(struct vm_area_struct *vma){    ScullP_Dev *dev = scullp_vma_to_dev(vma);    dev->vmas--;    MOD_DEC_USE_COUNT;}/* * The nopage method: the core of the file. It retrieves the * page required from the scullp device and returns it to the * user. The count for the page must be incremented, because * it is automatically decremented at page unmap. * * For this reason, "order" must be zero. Otherwise, only the first * page has its count incremented, and the allocating module must * release it as a whole block. Therefore, it isn't possible to map * pages from a multipage block: when they are unmapped, their count * is individually decreased, and would drop to 0. */struct page *scullp_vma_nopage(struct vm_area_struct *vma,                                unsigned long address, int write){    unsigned long offset;    ScullP_Dev *ptr, *dev = scullp_vma_to_dev(vma);    struct page *page = NOPAGE_SIGBUS;    void *pageptr = NULL; /* default to "missing" */    down(&dev->sem);    offset = (address - vma->vm_start) + VMA_OFFSET(vma);    if (offset >= dev->size) goto out; /* out of range */    /*     * Now retrieve the scullp device from the list,then the page.     * If the device has holes, the process receives a SIGBUS when     * accessing the hole.     */    offset >>= PAGE_SHIFT; /* offset is a number of pages */    for (ptr = dev; ptr && offset >= dev->qset;) {        ptr = ptr->next;        offset -= dev->qset;    }    if (ptr && ptr->data) pageptr = ptr->data[offset];    if (!pageptr) goto out; /* hole or end-of-file */    page = virt_to_page(pageptr);        /* got it, now increment the count */    get_page(page);out:    up(&dev->sem);    return page;}#ifndef LINUX_24unsigned long scullp_vma_nopage_old(struct vm_area_struct *vma,                unsigned long address, int write){    struct page *page = scullp_vma_nopage(vma, address, write);    if (page)#ifdef LINUX_20        return (page->map_nr << PAGE_SHIFT);#else  /* 2.2 */        return (unsigned long) __va ((page - mem_map) << PAGE_SHIFT);#endif    return 0;}#define scullp_vma_nopage scullp_vma_nopage_old /* for the ops table */#endif /* not 2.4 */struct vm_operations_struct scullp_vm_ops = {    open:     scullp_vma_open,    close:  scullp_vma_close,    nopage:   scullp_vma_nopage,};#ifndef LINUX_20int scullp_mmap(struct file *filp, struct vm_area_struct *vma){    struct inode *inode = INODE_FROM_F(filp);    /* refuse to map if order is not 0 */    if (scullp_devices[MINOR(inode->i_rdev)].order)        return -ENODEV;    if (VMA_OFFSET(vma) & (PAGE_SIZE-1))                        return -ENXIO; /* need aligned offsets */	    /* don't do anything here: "nopage" will fill the holes */    vma->vm_ops = &scullp_vm_ops;    vma->vm_flags |= VM_RESERVED;#ifdef LINUX_24					    vma->vm_private_data = scullp_devices + MINOR(inode->i_rdev);#else						    vma->vm_file = filp;			#endif						    scullp_vma_open(vma);    return 0;}#else /* LINUX_20 */int scullp_mmap(struct inode *inode, struct file *filp,                struct vm_area_struct *vma){    /* refuse to map if order is not 0 */    if (scullp_devices[MINOR(inode->i_rdev)].order)        return -ENODEV;    if (VMA_OFFSET(vma) & (PAGE_SIZE-1))        return -ENXIO; /* need aligned offsets */    /* don't do anything here: "nopage" will fill the holes */    vma->vm_ops = &scullp_vm_ops;    vma->vm_inode = inode;    inode->i_count++;    scullp_vma_open(vma);    return 0;}#endif /* LINUX_20 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品亚洲人成人网在线播放| 精品视频一区二区不卡| 久久日一线二线三线suv| 美国欧美日韩国产在线播放| 日韩免费视频一区二区| 91视频xxxx| 亚洲国产精品综合小说图片区| 欧美日韩中字一区| 麻豆国产精品一区二区三区| 久久亚洲综合色| 成人精品视频一区二区三区尤物| 18成人在线观看| 欧美日韩久久久久久| 韩国在线一区二区| 亚洲日穴在线视频| 欧美理论片在线| 丰满亚洲少妇av| 亚洲一区在线看| 日韩欧美一区中文| 91社区在线播放| 美腿丝袜在线亚洲一区| 国产精品欧美一区喷水| 欧美色图免费看| 国产一区不卡在线| 亚洲影院久久精品| 精品乱码亚洲一区二区不卡| 99久久国产综合精品女不卡| 日韩高清不卡一区二区| 国产精品视频免费| 日韩欧美国产不卡| 99国产欧美另类久久久精品| 久久精品理论片| 亚洲欧美日韩人成在线播放| 日韩欧美一区中文| 在线观看视频一区二区欧美日韩| 精品影院一区二区久久久| 亚洲另类在线视频| 久久久久九九视频| 在线成人免费观看| 国产天堂亚洲国产碰碰| 欧美午夜在线一二页| 韩国精品一区二区| 亚洲bdsm女犯bdsm网站| 中文一区在线播放| 日韩欧美在线综合网| 在线观看视频91| 99久久精品国产麻豆演员表| 精品一区二区成人精品| 三级一区在线视频先锋| 亚洲日韩欧美一区二区在线| 久久久精品国产免费观看同学| 欧美日韩国产乱码电影| 色婷婷精品大在线视频| 成人教育av在线| 国产在线视频不卡二| 美腿丝袜亚洲色图| 午夜精品一区二区三区三上悠亚| 日韩毛片高清在线播放| 中文在线资源观看网站视频免费不卡| 精品国产免费一区二区三区四区 | 国产午夜精品久久久久久久| 欧美性生活影院| 91视频com| 91麻豆成人久久精品二区三区| 国产成人av电影在线播放| 激情小说欧美图片| 久久国产日韩欧美精品| 美腿丝袜亚洲综合| 开心九九激情九九欧美日韩精美视频电影 | 亚洲天堂免费看| 欧美剧在线免费观看网站| 色老综合老女人久久久| 成人综合激情网| 国产高清不卡一区二区| 国产一区91精品张津瑜| 精品一区免费av| 国产伦精一区二区三区| 久久99久久99小草精品免视看| 免费三级欧美电影| 精东粉嫩av免费一区二区三区| 强制捆绑调教一区二区| 另类的小说在线视频另类成人小视频在线| 亚洲电影在线免费观看| 亚洲最大成人综合| 亚洲国产欧美在线| 视频在线观看91| 久久99久久久久久久久久久| 另类成人小视频在线| 另类小说视频一区二区| 激情综合五月婷婷| 国产一区 二区 三区一级| 成人国产精品免费观看视频| 97精品国产露脸对白| 在线免费一区三区| 欧美日韩中文精品| 日韩一级片网站| 国产欧美久久久精品影院| 国产精品黄色在线观看| 一区二区三区 在线观看视频| 亚洲成人你懂的| 久久99精品久久久久久国产越南| 国产一本一道久久香蕉| 9i在线看片成人免费| 欧美裸体一区二区三区| 久久日韩粉嫩一区二区三区| 国产精品成人免费在线| 午夜久久福利影院| 国产成人在线免费| 欧美日韩一区视频| 精品国产成人在线影院| 国产精品盗摄一区二区三区| 亚洲高清免费观看高清完整版在线观看 | 91精品国产综合久久久久久久久久 | 91精品国产色综合久久不卡电影| 337p粉嫩大胆噜噜噜噜噜91av | 日韩欧美视频在线| 中文字幕欧美日韩一区| 亚洲无线码一区二区三区| 久久精品99久久久| 色哟哟国产精品| 欧美va亚洲va| 亚洲一区二区欧美| 国产精品亚洲一区二区三区妖精 | 国产精品亚洲第一| 欧美视频一区在线观看| 欧美高清在线精品一区| 青娱乐精品在线视频| 国产日韩欧美激情| 亚洲动漫第一页| 成人在线综合网| 日韩三级av在线播放| 一区二区三区日韩欧美| 国产福利电影一区二区三区| 欧美日韩一区二区在线观看视频| 国产三级一区二区| 日本欧洲一区二区| 在线欧美日韩国产| 国产精品盗摄一区二区三区| 紧缚捆绑精品一区二区| 这里只有精品免费| 亚洲精品免费看| 成年人午夜久久久| 日韩三级视频在线观看| 午夜久久久久久久久久一区二区| 91亚洲精华国产精华精华液| 久久久久久久综合色一本| 人人爽香蕉精品| 欧美中文字幕不卡| 一区二区三区中文字幕精品精品 | 综合久久久久久久| 国产成人av网站| 精品欧美一区二区久久| 日本怡春院一区二区| 欧美视频精品在线观看| 伊人婷婷欧美激情| 91久久精品网| 亚洲一区二区四区蜜桃| heyzo一本久久综合| 中文久久乱码一区二区| 韩国成人在线视频| 91精品国产色综合久久不卡蜜臀 | 成人丝袜18视频在线观看| 精品第一国产综合精品aⅴ| 午夜成人免费电影| 91精品久久久久久久99蜜桃| 日韩精品一二三| 欧美一区二区三区在线观看 | 成人国产精品免费观看动漫| 国产丝袜美腿一区二区三区| 丁香另类激情小说| 国产无人区一区二区三区| 国产精品88888| 国产日韩欧美不卡在线| 成人黄色免费短视频| 中文字幕日韩欧美一区二区三区| thepron国产精品| 亚洲欧美色综合| 在线亚洲高清视频| 婷婷开心激情综合| 日韩一区二区三区视频| 极品瑜伽女神91| 国产精品色眯眯| 97久久超碰精品国产| 亚洲国产视频网站| 欧美一区二区免费观在线| 美女网站一区二区| 国产色爱av资源综合区| 成人av动漫在线| 天天综合色天天| 欧美精品一区二区精品网| 成人激情黄色小说| 亚洲成av人综合在线观看| 精品国产精品一区二区夜夜嗨| 豆国产96在线|亚洲| 一区二区三区在线观看国产| 91精品国产综合久久香蕉的特点| 在线观看一区二区视频| 毛片一区二区三区| 国产精品国产自产拍在线| 欧美日韩午夜精品|