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

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

?? mmap.c

?? Linux設備驅動程序第二版
?? C
字號:
/*  -*- C -*- * mmap.c -- memory mapping for the scullv 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 "scullv.h"        /* local definitions */#ifdef LINUX_20static struct mm_struct *init_mm_ptr;#define init_mm (*init_mm_ptr) /* to avoid ifdefs later */static void retrieve_init_mm_ptr(void){    struct task_struct *p;    for (p = current ; (p = p->next_task) != current ; )        if (p->pid == 0)            break;    init_mm_ptr = p->mm;}#endif/* * Given a VMA, get our device pointer from it. */static inline ScullV_Dev *scullv_vma_to_dev (struct vm_area_struct *vma){#if defined(LINUX_24)    return (ScullV_Dev *) vma->vm_private_data;#elif defined(LINUX_22)    struct inode *inode = INODE_FROM_F(vma->vm_file);     return scullv_devices + MINOR(inode->i_rdev);#else /* LINUX_20 */    return scullv_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 scullv_vma_open(struct vm_area_struct *vma){    ScullV_Dev *dev = scullv_vma_to_dev(vma);    dev->vmas++;    MOD_INC_USE_COUNT;}void scullv_vma_close(struct vm_area_struct *vma){    ScullV_Dev *dev = scullv_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 scullv 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 *scullv_vma_nopage(struct vm_area_struct *vma,                                unsigned long address, int write){    unsigned long offset;    ScullV_Dev *ptr, *dev = scullv_vma_to_dev(vma);    struct page *page = NOPAGE_SIGBUS;    void *pageptr = NULL; /* default to "missing" */    pgd_t *pgd; pmd_t *pmd; pte_t *pte;    unsigned long lpage;    down(&dev->sem);    offset = (address - vma->vm_start) + VMA_OFFSET(vma);    if (offset >= dev->size) goto out; /* out of range */    /*     * Now retrieve the scullv 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 */    /*     * After scullv lookup, "page" is now the address of the page     * needed by the current process. Since it's a vmalloc address,     * first retrieve the unsigned long value to be looked up     * in page tables.     */    lpage = VMALLOC_VMADDR(pageptr);#ifdef LINUX_24						    spin_lock(&init_mm.page_table_lock);#endif  						    pgd = pgd_offset(&init_mm, lpage);    pmd = pmd_offset(pgd, lpage);    pte = pte_offset(pmd, lpage);#ifdef LINUX_24  					    page = pte_page(*pte);    spin_unlock(&init_mm.page_table_lock);#else  							    page = mem_map + MAP_NR(pte_page(*pte));  		#endif  						        /* got it, now increment the count */    get_page(page);out:    up(&dev->sem);    return page;}#ifndef LINUX_24unsigned long scullv_vma_nopage_old(struct vm_area_struct *vma,                unsigned long address, int write){    struct page *page = scullv_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 scullv_vma_nopage scullv_vma_nopage_old /* for the ops table */#endif /* not 2.4 */struct vm_operations_struct scullv_vm_ops = {    open:     scullv_vma_open,    close:  scullv_vma_close,    nopage:   scullv_vma_nopage,};#ifndef LINUX_20int scullv_mmap(struct file *filp, struct vm_area_struct *vma){    struct inode *inode = INODE_FROM_F(filp);    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 = &scullv_vm_ops;    vma->vm_flags |= VM_RESERVED;#ifdef LINUX_24					    vma->vm_private_data = scullv_devices + MINOR(inode->i_rdev);#else						    vma->vm_file = filp;			#endif						    scullv_vma_open(vma);    return 0;}#else /* LINUX_20 */int scullv_mmap(struct inode *inode, struct file *filp,                struct vm_area_struct *vma){    if (VMA_OFFSET(vma) & (PAGE_SIZE-1))        return -ENXIO; /* need aligned offsets */    /*     * A pointer to init_mm is needed to access page tables     */    if (!init_mm_ptr)        retrieve_init_mm_ptr();    /* don't do anything here: "nopage" will fill the holes */    vma->vm_ops = &scullv_vm_ops;    vma->vm_inode = inode;    inode->i_count++;    scullv_vma_open(vma);    return 0;}#endif /* LINUX_20 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩视频免费观看高清在线视频| 国产一区二区在线看| 久久久精品国产免大香伊| 欧美日韩和欧美的一区二区| 91久久精品一区二区三区| 99久久免费视频.com| 9久草视频在线视频精品| 成人在线综合网| 91香蕉视频黄| 日本乱码高清不卡字幕| 精品国产免费久久 | 国产亚洲精品超碰| 欧美极品美女视频| 成人欧美一区二区三区白人| 亚洲日本va在线观看| 亚洲狠狠丁香婷婷综合久久久| 亚洲一区二区三区在线播放| 亚洲国产va精品久久久不卡综合| 日韩成人dvd| 精品一区二区三区免费观看| 国产盗摄视频一区二区三区| 成人精品免费网站| 色婷婷亚洲精品| 在线91免费看| 欧美国产精品一区二区| 亚洲欧美国产77777| 亚洲va韩国va欧美va精品| 激情六月婷婷久久| 91老师国产黑色丝袜在线| 欧美性受极品xxxx喷水| 精品国产乱码久久久久久久久| 国产精品的网站| 免费在线成人网| 成人污污视频在线观看| 91精品在线一区二区| 国产区在线观看成人精品| 亚洲高清视频的网址| 激情国产一区二区| 欧美色图12p| 久久久天堂av| 视频精品一区二区| 成人av在线播放网址| 欧美精品亚洲二区| 18欧美亚洲精品| 国产一区二区三区久久久| 色哟哟国产精品免费观看| 久久嫩草精品久久久久| 亚洲二区在线观看| 成人黄页毛片网站| 精品国产一区二区三区久久久蜜月 | 精品国产一区二区国模嫣然| 一区二区三区电影在线播| 国产精品影视在线| 日韩午夜激情电影| 婷婷中文字幕一区三区| 99r国产精品| 国产女主播视频一区二区| 日本亚洲电影天堂| 欧美日韩成人一区| 亚洲国产三级在线| 色狠狠综合天天综合综合| 国产精品国产三级国产专播品爱网| 久久av资源站| 91精品国产综合久久小美女| 亚洲精品久久嫩草网站秘色| eeuss鲁一区二区三区| 久久精品免费在线观看| 亚洲欧美日韩电影| 日韩亚洲欧美综合| 亚洲国产一区视频| 91视频在线观看| 国产丝袜欧美中文另类| 国产一区二区在线看| 精品久久久久久久久久久院品网| 日本va欧美va瓶| 欧美一级黄色大片| 九色|91porny| 2022国产精品视频| 国产精品中文字幕日韩精品| 久久久久久久久久久久久久久99| 久久99精品久久久| 久久蜜桃av一区二区天堂| 黄页网站大全一区二区| 欧美伊人久久久久久久久影院| 免费欧美日韩国产三级电影| 色狠狠一区二区三区香蕉| 亚洲精品视频在线看| 欧美一级欧美三级在线观看| 偷拍与自拍一区| 精品女同一区二区| 国产成人夜色高潮福利影视| 欧美国产精品久久| av亚洲产国偷v产偷v自拍| 伊人性伊人情综合网| 欧美伊人精品成人久久综合97| 亚洲一本大道在线| 日韩欧美激情在线| 成人教育av在线| 一区2区3区在线看| 日韩欧美自拍偷拍| 成人国产免费视频| 亚洲一卡二卡三卡四卡无卡久久 | 国产三级久久久| 亚洲一二三区在线观看| 欧美视频中文一区二区三区在线观看| 樱花草国产18久久久久| 欧美美女激情18p| 精品一区二区免费在线观看| 中文字幕欧美三区| 欧美日韩三级一区| 国产风韵犹存在线视精品| 夜色激情一区二区| 日韩一区二区三区av| thepron国产精品| 美女视频黄频大全不卡视频在线播放 | 国产成人av网站| 亚洲黄色小说网站| 久久影视一区二区| 欧美日韩精品欧美日韩精品一综合| 国产在线日韩欧美| 秋霞午夜av一区二区三区| 日本不卡123| 久久精品人人做人人综合| 91麻豆swag| 国产精品一区在线| 偷窥少妇高潮呻吟av久久免费| 久久婷婷久久一区二区三区| 欧美无砖砖区免费| 成人在线视频一区| 韩国在线一区二区| 日韩av不卡一区二区| 亚洲同性gay激情无套| 欧美哺乳videos| 欧美久久久久久久久中文字幕| 成人黄色在线看| 国产一区91精品张津瑜| 午夜精品久久久| 亚洲欧美视频一区| 日本一区二区成人| 久久久久久久久久看片| 在线播放欧美女士性生活| 97se狠狠狠综合亚洲狠狠| 日韩av成人高清| 麻豆精品视频在线观看| 亚洲一区二区视频在线观看| 亚洲国产成人一区二区三区| 日韩欧美卡一卡二| 欧美电视剧在线看免费| 日韩一级黄色片| 欧美一区二区三区啪啪| 欧美日韩色一区| 欧美日韩高清在线播放| 欧美日韩一区二区三区视频| 日本精品一级二级| 欧美伊人久久大香线蕉综合69 | 亚洲区小说区图片区qvod| 国产日韩欧美综合在线| 国产欧美一区二区三区在线看蜜臀| 久久综合色之久久综合| 久久综合久久综合亚洲| 69堂国产成人免费视频| 91在线porny国产在线看| 国产精品一区二区久久不卡| 久久成人免费网| 国产曰批免费观看久久久| 蓝色福利精品导航| 国产一区二区精品久久| 大白屁股一区二区视频| 99久久综合精品| 欧美亚洲丝袜传媒另类| 欧美一区二区三区公司| 欧美成人vps| 自拍偷拍亚洲欧美日韩| 亚洲图片欧美综合| 久久国产免费看| 成人激情午夜影院| 欧美视频中文一区二区三区在线观看| 欧美一区二区啪啪| 久久精品视频在线免费观看| 亚洲欧美日韩一区| 天天影视网天天综合色在线播放| 国产精品乱人伦| 一区2区3区在线看| 美女视频黄 久久| 成人综合婷婷国产精品久久蜜臀 | 国产99精品国产| 91蜜桃在线免费视频| 欧美一级片在线观看| 中文字幕高清不卡| 日日夜夜免费精品| 99国产精品久久久| 精品少妇一区二区三区视频免付费| 中文字幕一区二区三区不卡| 亚洲电影在线播放| 成人在线视频一区二区| 欧美精品高清视频| 国产精品嫩草99a| 日本成人超碰在线观看| 色婷婷综合激情| 欧美精品一区二区蜜臀亚洲|