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

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

?? mmap.c

?? LINUX設備驅動2源代碼
?? 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一区二区三区免费野_久草精品视频
美女一区二区在线观看| 91影院在线观看| 成人黄页毛片网站| 91麻豆精品国产91久久久久| 中文字幕的久久| 精品一区二区在线观看| 欧美日韩午夜影院| 亚洲日本护士毛茸茸| 国产精品亚洲成人| 日韩一级欧美一级| 亚洲成人动漫一区| 色香蕉久久蜜桃| 中文字幕在线一区二区三区| 国产最新精品免费| 欧美一区二区性放荡片| 亚洲精品中文字幕在线观看| 国产成人在线看| 久久久久国产精品免费免费搜索| 石原莉奈在线亚洲二区| 欧美性色欧美a在线播放| 亚洲色图制服丝袜| 成人h版在线观看| 欧美国产视频在线| 成人黄色在线看| 国产精品久久一级| 成人激情综合网站| 欧美国产一区二区| 91在线免费视频观看| 欧美国产乱子伦| 国产成人精品亚洲日本在线桃色| 久久一留热品黄| 国产一区二区精品久久99| 欧美v日韩v国产v| 精品一区二区国语对白| 日韩一区二区三区视频| 久久99精品国产91久久来源| 26uuu色噜噜精品一区二区| 国内外精品视频| 精品电影一区二区| 国产综合一区二区| 18成人在线观看| 欧洲av一区二区嗯嗯嗯啊| 亚洲国产精品尤物yw在线观看| 欧美日韩精品欧美日韩精品一综合| 亚洲综合激情网| 宅男在线国产精品| 精品一区二区三区欧美| 欧美激情一区二区三区不卡| 91麻豆精品在线观看| 一区二区三区四区不卡视频| 91麻豆精品国产无毒不卡在线观看| 秋霞国产午夜精品免费视频| 久久久99久久| 色综合久久99| 美国精品在线观看| 国产精品污www在线观看| 99久久精品免费| 午夜欧美一区二区三区在线播放| 91精品国产91热久久久做人人| 国产裸体歌舞团一区二区| 日韩一区有码在线| 日韩精品专区在线影院观看| 成人黄色国产精品网站大全在线免费观看 | 欧美中文字幕一二三区视频| 日韩电影免费在线看| 国产欧美一区二区精品忘忧草 | 国产精品一二二区| 亚洲最色的网站| 久久久久综合网| 欧美四级电影在线观看| 国产毛片精品国产一区二区三区| 亚洲色图在线播放| 亚洲精品在线免费播放| 欧美性猛交xxxxxx富婆| 国产麻豆精品95视频| 亚洲国产日韩在线一区模特| 最新国产精品久久精品| 欧美一级艳片视频免费观看| 成人免费av资源| 韩国av一区二区三区在线观看| 亚洲国产裸拍裸体视频在线观看乱了 | 本田岬高潮一区二区三区| 亚州成人在线电影| 国产精品免费看片| 精品国产乱码久久久久久1区2区| 色偷偷久久一区二区三区| 国产精品一二三区| 日本欧美在线看| 亚洲午夜视频在线观看| 国产精品久线在线观看| 久久丝袜美腿综合| 日韩欧美电影一二三| 欧美色手机在线观看| av在线这里只有精品| 国产乱子伦视频一区二区三区| 日韩高清在线电影| 五月综合激情日本mⅴ| 亚洲四区在线观看| 国产精品久久午夜夜伦鲁鲁| 亚洲精品在线一区二区| 91精品国产综合久久福利软件| 色婷婷激情久久| 91色九色蝌蚪| 一本一本大道香蕉久在线精品 | 成人a区在线观看| 国产不卡在线视频| 狠狠色丁香久久婷婷综合丁香| 婷婷综合久久一区二区三区| 一个色综合av| 亚洲国产精品欧美一二99| 一个色综合网站| 亚洲成人777| 亚洲一级在线观看| 日日摸夜夜添夜夜添亚洲女人| 亚洲成人在线网站| 午夜精品成人在线视频| 日韩成人精品在线观看| 日韩高清不卡一区二区| 看片的网站亚洲| 国产一区二区三区四区五区美女| 激情综合色综合久久| 国产高清久久久久| 99精品视频中文字幕| 91香蕉国产在线观看软件| 在线亚洲+欧美+日本专区| 欧美日韩视频在线一区二区| 欧美日本在线视频| 日韩三级电影网址| 久久九九国产精品| 亚洲免费观看高清完整版在线观看 | 懂色av一区二区三区蜜臀| 成人免费va视频| 精品视频一区三区九区| 欧美一区二区三区四区高清| 日韩精品自拍偷拍| 国产精品久久久久三级| 亚洲成人综合在线| 精品一区二区三区香蕉蜜桃| 成人午夜短视频| 欧美中文字幕久久| 精品国产制服丝袜高跟| 国产日产欧产精品推荐色| 一区二区三区精密机械公司| 欧美aaaaaa午夜精品| 色综合天天综合| 制服丝袜成人动漫| 久久精品人人爽人人爽| 一区二区三区鲁丝不卡| 久久成人免费日本黄色| 97久久超碰国产精品电影| 欧美另类videos死尸| 国产亚洲午夜高清国产拍精品| 一区二区三区欧美亚洲| 国产一区福利在线| 欧美日韩久久一区| 国产亚洲欧美日韩在线一区| 亚洲成人资源网| 国产99久久久精品| 欧美一级黄色录像| 一区二区三区在线播| 国产真实乱子伦精品视频| 欧美三日本三级三级在线播放| 久久精品亚洲麻豆av一区二区 | 中文字幕在线观看一区二区| 日韩国产一区二| 色婷婷精品久久二区二区蜜臂av | 91女厕偷拍女厕偷拍高清| 欧美一区二区三区在线看| 亚洲色图欧洲色图婷婷| 国产在线不卡一卡二卡三卡四卡| 欧洲精品在线观看| 国产精品无人区| 狠狠v欧美v日韩v亚洲ⅴ| 欧美日产国产精品| 洋洋成人永久网站入口| 99久久精品99国产精品| 久久久国产精华| 久久av中文字幕片| 欧美片网站yy| 夜夜亚洲天天久久| 色婷婷国产精品| 中文字幕在线一区免费| 高清国产一区二区三区| 久久先锋影音av鲁色资源网| 日韩av网站免费在线| 欧美日韩二区三区| 亚洲国产另类av| 欧美系列日韩一区| 一区二区激情视频| 欧美亚洲动漫制服丝袜| 亚洲欧美日韩国产手机在线| 成人av在线播放网址| 中文字幕五月欧美| 99久久久免费精品国产一区二区| 欧美国产综合色视频| 成人av第一页| 中文字幕亚洲综合久久菠萝蜜| 99久久国产综合精品色伊| 自拍av一区二区三区| 91久久久免费一区二区|