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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ramdiskcbio.c

?? vxwork源代碼
?? C
字號(hào):
/* ramDiskCbio.c - RAM Disk Cached Block Driver *//* Copyright 1998-2002 Wind River Systems, Inc. *//*modification history--------------------01j,12dec01,jkf  fixing diab build warnings01i,09dec01,jkf  SPR#71637, fix for SPR#68387 caused ready changed bugs.01h,30jul01,jkf  SPR#69031, common code for both AE & 5.x.01g,14jun01,jyo  SPR#67729: Updating blkSubDev, cbioSubDev, isDriver in                 ramDiskDevCreate().01f,19apr00,dat  doc fixes01e,29feb00,jkf  T3 changes01d,31aug99,jkf  CBIO API changes01c,31jul99,jkf  T2 merge, tidiness & spelling.01b,07jun98,lrn  re-integration, doc01a,15jan98,lrn  written, preliminary*//*DESCRIPTIONThis module implements a RAM-disk driver with a CBIO interfacewhich can be directly utilized by dosFsLib without the use of the Disk Cache module dcacheCbio.  This results in anultra-compact RAM footprint.  This module is implemented using the CBIO API (see cbioLib())This module is delivered in source as a functional example of a basic CBIO module.CAVEATThis module may be used for SRAM or other non-volatile RAM cards to store a file system, but that configuration will be susceptibleto data corruption in events of system failure which are not normallyobserved with magnetic disks, i.e. using this driver with an SRAM cardcan not guard against interruptions in midst of updating a particularsector, resulting in that sector become internally inconsistent.SEE ALSOdosFsLib, cbioLib*//* includes */#include "vxWorks.h"#include "stdlib.h"#include "semLib.h"#include "ioLib.h"#include "string.h"#include "errno.h"#include "assert.h"#include "private/dosFsVerP.h"#include "private/cbioLibP.h" /* only CBIO modules may include this file */#include "ramDiskCbio.h"/* Implementation dependent fields */#define	cbioBlkShift	cbioPriv0extern void logMsg( const char *fmt, ... );LOCAL STATUS ramDiskBlkRW    (    CBIO_DEV_ID		dev,    block_t		startBlock,    block_t		numBlocks,    addr_t		buffer,    CBIO_RW		rw,    cookie_t		*pCookie    );LOCAL STATUS ramDiskBytesRW    (    CBIO_DEV_ID 	dev,    block_t		startBlock,    off_t		offset,    addr_t		buffer,    size_t		nBytes,    CBIO_RW		rw,    cookie_t		*pCookie    );LOCAL STATUS ramDiskBlkCopy    (    CBIO_DEV_ID 	dev,    block_t		srcBlock,    block_t		dstBlock,    block_t		numBlocks    );LOCAL STATUS ramDiskIoctl    (    CBIO_DEV_ID	dev,    UINT32	command,    addr_t	arg    );/* CBIO_FUNCS, one per cbio driver */LOCAL CBIO_FUNCS cbioFuncs = {(FUNCPTR) ramDiskBlkRW,			      (FUNCPTR) ramDiskBytesRW,			      (FUNCPTR) ramDiskBlkCopy,			      (FUNCPTR) ramDiskIoctl};int ramDiskDebug = 0;#define	INFO_MSG	logMsg#define	DEBUG_MSG	if(ramDiskDebug) logMsg/********************************************************************************* ramDiskBlkRW - Read/Write blocks* * This routine transfers between a user buffer and the lower layer hardware* It is optimized for block transfers.  ** dev - the CBIO handle of the device being accessed (from creation routine)* * startBlock - the starting block of the transfer operation* * numBlocks - the total number of blocks to transfer* * buffer - address of the memory buffer used for the transfer* * rw - indicates the direction of transfer up or down (READ/WRITE)* * *pCookie - pointer to cookie used by upper layer such as dosFsLib(),* it should be preserved.** RETURNS OK or ERROR and may otherwise set errno.**/LOCAL STATUS ramDiskBlkRW    (    CBIO_DEV_ID		dev,    block_t		startBlock,    block_t		numBlocks,    addr_t		buffer,    CBIO_RW		rw,    cookie_t		*pCookie    )    {    CBIO_DEV *	pDev = (void *) dev ;    caddr_t 	pStart;    size_t 	nBytes ;    if( TRUE == CBIO_READYCHANGED (dev) )	{	errno = S_ioLib_DISK_NOT_PRESENT ;	return ERROR;	}    if( (startBlock) > pDev->cbioParams.nBlocks ||    	(startBlock+numBlocks) > pDev->cbioParams.nBlocks )	return ERROR;    startBlock += pDev->cbioParams.blockOffset;    pStart = pDev->cbioMemBase + ( startBlock << pDev->cbioBlkShift ) ;    nBytes = numBlocks << pDev->cbioBlkShift ;    DEBUG_MSG("ramDiskBlkRW: blk %d # %d -> addr %x, %x bytes\n",	startBlock, numBlocks, pStart, nBytes );    if( semTake( pDev->cbioMutex, WAIT_FOREVER) == ERROR )	return ERROR;    switch( rw )	{	case CBIO_READ:	    bcopy( pStart, buffer, nBytes );	    break;	case CBIO_WRITE:	    bcopy( buffer, pStart,  nBytes );	    break;	}    semGive(pDev->cbioMutex);    return OK;    }/********************************************************************************* ramDiskBytesRW - Read/Write bytes** This routine transfers between a user buffer and the lower layer hardware* It is optimized for byte transfers.  ** dev - the CBIO handle of the device being accessed (from creation routine)* * startBlock - the starting block of the transfer operation* * offset - offset in bytes from the beginning of the starting block* * buffer - address of the memory buffer used for the transfer* * nBytes - number of bytes to transfer* * rw - indicates the direction of transfer up or down (READ/WRITE)* * *pCookie - pointer to cookie used by upper layer such as dosFsLib(),* it should be preserved.* * RETURNS OK or ERROR and may otherwise set errno.*/LOCAL STATUS ramDiskBytesRW    (    CBIO_DEV_ID 	dev,    block_t		startBlock,    off_t		offset,    addr_t		buffer,    size_t		nBytes,    CBIO_RW		rw,    cookie_t		*pCookie    )    {    CBIO_DEV * 	pDev = dev ;    caddr_t 	pStart;    if( TRUE == CBIO_READYCHANGED (dev) )	{	errno = S_ioLib_DISK_NOT_PRESENT ;	return ERROR;	}    if( startBlock >= pDev->cbioParams.nBlocks )	return ERROR;    /* verify that all bytes are within one block range */    if (((offset + nBytes) > pDev->cbioParams.bytesPerBlk ) ||	(offset <0) || (nBytes <=0))	return ERROR;    /* calculate actual memory address of data */    startBlock += pDev->cbioParams.blockOffset;    pStart = pDev->cbioMemBase + ( startBlock << pDev->cbioBlkShift ) ;    pStart += offset ;    DEBUG_MSG("ramDiskBytesRW: blk %d + %d # %d bytes -> addr %x, %x bytes\n",	startBlock, offset, nBytes, pStart, nBytes );    if( semTake( pDev->cbioMutex, WAIT_FOREVER) == ERROR )	return ERROR;    switch( rw )	{	case CBIO_READ:	    bcopy( pStart, buffer, nBytes );	    break;	case CBIO_WRITE:	    bcopy( buffer, pStart,  nBytes );	    break;	}    semGive(pDev->cbioMutex);    return OK;    }/********************************************************************************* ramDiskBlkCopy - Copy sectors * * This routine makes copies of one or more blocks on the lower layer hardware.* It is optimized for block copies on the subordinate layer.  * * dev - the CBIO handle of the device being accessed (from creation routine)* * srcBlock - source start block of the copy* * dstBlock - destination start block of the copy* * num_block - number of blocks to copy** RETURNS OK or ERROR and may otherwise set errno.*/LOCAL STATUS ramDiskBlkCopy    (    CBIO_DEV_ID 	dev,    block_t		srcBlock,    block_t		dstBlock,    block_t		numBlocks    )    {    CBIO_DEV	*pDev = (void *) dev ;    caddr_t pSrc, pDst;    size_t nBytes ;    if( TRUE == CBIO_READYCHANGED (dev) )	{	errno = S_ioLib_DISK_NOT_PRESENT ;	return ERROR;	}    if( (srcBlock) > pDev->cbioParams.nBlocks ||        (dstBlock) > pDev->cbioParams.nBlocks )	return ERROR;    if( (srcBlock+numBlocks) > pDev->cbioParams.nBlocks ||        (dstBlock+numBlocks) > pDev->cbioParams.nBlocks )	return ERROR;    srcBlock += pDev->cbioParams.blockOffset;    dstBlock += pDev->cbioParams.blockOffset;    pSrc = pDev->cbioMemBase + ( srcBlock << pDev->cbioBlkShift ) ;    pDst = pDev->cbioMemBase + ( dstBlock << pDev->cbioBlkShift ) ;    nBytes = numBlocks << pDev->cbioBlkShift ;    DEBUG_MSG("ramDiskBlkCopy: blk %d to %d # %d -> addr %x,to %x %x bytes\n",	srcBlock, dstBlock, numBlocks, pSrc, pDst, nBytes );    if( semTake( pDev->cbioMutex, WAIT_FOREVER) == ERROR )	return ERROR;    /* Do the actual copying */    bcopy( pSrc, pDst, nBytes );    semGive(pDev->cbioMutex);    return OK;    }/********************************************************************************* ramDiskIoctl - Misc control operations * * This performs the requested ioctl() operation.* * CBIO modules can expect the following ioctl() codes from cbioLib.h:* CBIO_RESET - reset the CBIO device and the lower layer* CBIO_STATUS_CHK - check device status of CBIO device and lower layer* CBIO_DEVICE_LOCK - Prevent disk removal * CBIO_DEVICE_UNLOCK - Allow disk removal* CBIO_DEVICE_EJECT - Unmount and eject device* CBIO_CACHE_FLUSH - Flush any dirty cached data* CBIO_CACHE_INVAL - Flush & Invalidate all cached data* CBIO_CACHE_NEWBLK - Allocate scratch block** dev - the CBIO handle of the device being accessed (from creation routine)* * command - ioctl() command being issued* * arg - specific to the particular ioctl() function requested or un-used.** RETURNS OK or ERROR and may otherwise set errno.*/LOCAL STATUS ramDiskIoctl    (    CBIO_DEV_ID	dev,    UINT32	command,    addr_t	arg    )    {    switch ( command )	{	case CBIO_RESET :		/* HELP is this really okay for a driver to do? */		CBIO_READYCHANGED (dev) = FALSE; 		return (OK);	case CBIO_STATUS_CHK : /* These are no-ops for the RAM Disk : */	case CBIO_DEVICE_LOCK :	case CBIO_DEVICE_UNLOCK :	case CBIO_DEVICE_EJECT :	case CBIO_CACHE_FLUSH :	case CBIO_CACHE_INVAL :	    if( TRUE == CBIO_READYCHANGED (dev) )		{		errno = S_ioLib_DISK_NOT_PRESENT ;		return ERROR;		}	    return OK;	case CBIO_CACHE_NEWBLK:	    if( TRUE == CBIO_READYCHANGED (dev) )		{		errno = S_ioLib_DISK_NOT_PRESENT ;		return ERROR;		}	    else		{		/* zero out the new block */		caddr_t pBlk ;		block_t blk = (long) arg ;		int nBytes = 1 << dev->cbioBlkShift ;		if( blk >= dev->cbioParams.nBlocks )		    return ERROR;		blk += dev->cbioParams.blockOffset ;		pBlk = dev->cbioMemBase + ( blk << dev->cbioBlkShift ) ;		bzero( pBlk, nBytes );		return OK;		}	default:	    errno = EINVAL;	    return (ERROR);	}    }/********************************************************************************* shiftCalc - calculate how many shift bits** How many shifts <n< are needed such that <mask> == 1 << <N>* This is very useful for replacing multiplication with shifts,* where it is known a priori that the multiplier is 2^k.** RETURNS: Number of shifts.*/LOCAL int shiftCalc    (    u_long mask    )    {    int i;    for (i=0; i<32; i++)	{	if (mask & 1)	    break ;	mask = mask >> 1 ;	}    return( i );    }/********************************************************************************* ramDiskDevCreate - Initialize a RAM Disk device** This function creates a compact RAM-Disk device that can be directly* utilized by dosFsLib, without the intermediate disk cache.* It can be used for non-volatile RAM as well as volatile RAM disks.** The RAM size is specified in terms of total number of blocks in the* device and the block size in bytes. The minimal block size is 32 bytes.* If <pRamAddr> is NULL, space will be allocated from the default memory* pool.** RETURNS: a CBIO handle that can be directly used by dosFsDevCreate()* or NULL if the requested amount of RAM is not available.** CAVEAT: When used with NV-RAM, this module can not eliminate mid-block* write interruption, which may cause file system corruption not* existent in common disk drives.** SEE ALSO: dosFsDevCreate().*/CBIO_DEV_ID ramDiskDevCreate    (    char  *pRamAddr,     /* where it is in memory (0 = malloc)     */    int   bytesPerBlk,   /* number of bytes per block              */    int   blksPerTrack,  /* number of blocks per track             */    int   nBlocks,       /* number of blocks on this device        */    int   blkOffset      /* no. of blks to skip at start of device */    )    {    CBIO_DEV_ID pDev = NULL ;    size_t	diskSize;    char	shift;    /* Fill in defaults for args with 0 value */    if( bytesPerBlk == 0)	bytesPerBlk = 64 ;    if( nBlocks == 0)	nBlocks = 2048 ;    if( blksPerTrack == 0)	blksPerTrack = 16 ;    /* first check that bytesPerBlk is 2^n */    shift = shiftCalc( bytesPerBlk );    if( bytesPerBlk != ( 1 << shift ) )	{	errno = EINVAL;	return( NULL );	}    /* calculate memory pool size in bytes */    diskSize = nBlocks << shift ;    cbioLibInit();	/* just in case */    /* Create CBIO device - generic (cbioDevCreate, cbioLib.c) */    pDev = (CBIO_DEV_ID) cbioDevCreate ( pRamAddr, diskSize );    if( pDev == NULL )	return( NULL );    /* If we got here, then generic device is allocated */    pDev->cbioDesc	= "RAM Disk Driver";    pDev->cbioParams.cbioRemovable	= FALSE ;    CBIO_READYCHANGED (pDev)     	= FALSE ;    pDev->cbioParams.nBlocks		= nBlocks ;    pDev->cbioParams.bytesPerBlk	= bytesPerBlk ;    pDev->cbioParams.blocksPerTrack	= blksPerTrack ;    pDev->cbioParams.nHeads		= 1 ;    pDev->cbioParams.blockOffset		= blkOffset ;    pDev->cbioMode		= O_RDWR ;    pDev->cbioParams.lastErrBlk	= NONE ;    pDev->cbioParams.lastErrno	= 0 ;    pDev->cbioBlkShift		= shift ;    /* cbioFuncs is staticly allocated in each driver. */    pDev->pFuncs = &cbioFuncs;    /*      * SPR#67729: Fill in the members blksubDev, cbioSubDev and isDriver      * appropriately      */    pDev->blkSubDev = NULL;  /* This layer does not have a BLKDEV below it */    pDev->cbioSubDev = pDev; /* Stores a pointer to itself   */                             /* since this is the last layer */    pDev->isDriver = TRUE;   /* For ramDiskCbio we are the lowest layer */    DEBUG_MSG("ramDiskDevCreate: dev %x, size %x\n", pDev, diskSize );    /* return device handle */    return( pDev );    }/********************************************************************************* ramDiskShow - show current parameters of the RAM disk device** This function is not implemented.* * NOMANUAL*/STATUS ramDiskShow( CBIO_DEV_ID dev, int verb )    {    return OK;    }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区二区高清| 欧美一级免费大片| 中文字幕一区二区在线观看| 成人av在线资源网| 亚洲人成亚洲人成在线观看图片 | 精品国偷自产国产一区| 国产综合色产在线精品| 久久精品网站免费观看| 99视频国产精品| 亚洲自拍与偷拍| 在线不卡中文字幕播放| 加勒比av一区二区| 国产精品久久免费看| 色综合婷婷久久| 日韩国产在线一| 久久综合九色综合欧美就去吻 | 国产精品私人自拍| 99精品国产热久久91蜜凸| 亚洲国产日韩一级| 日韩免费高清av| 99在线精品免费| 婷婷一区二区三区| 久久久国产午夜精品 | 国产成人综合视频| 亚洲精品写真福利| 欧美一级专区免费大片| 国产99精品国产| 亚洲成a人片在线观看中文| 精品福利av导航| 99视频一区二区| 日韩电影一区二区三区四区| 亚洲国产精品二十页| 欧美揉bbbbb揉bbbbb| 国产精品主播直播| 亚洲福利国产精品| 国产精品色婷婷久久58| 欧美精品久久天天躁| 成人白浆超碰人人人人| 日韩成人dvd| 亚洲精品免费在线播放| 精品久久久久av影院| 日本乱人伦一区| 国产一区二区三区精品欧美日韩一区二区三区 | proumb性欧美在线观看| 奇米精品一区二区三区四区 | 中文字幕亚洲在| 制服丝袜亚洲精品中文字幕| 97精品电影院| 国产成a人亚洲| 九九视频精品免费| 日本欧洲一区二区| 亚洲成人av一区| 一区二区在线观看免费视频播放| 久久久久高清精品| 欧美xfplay| 91精品久久久久久久久99蜜臂| 色综合久久久久久久| 丁香六月综合激情| 国内精品久久久久影院色| 亚洲一二三区视频在线观看| 国产精品激情偷乱一区二区∴| 欧美成人乱码一区二区三区| 91精品国产一区二区| 欧美日韩一区三区四区| 91视视频在线观看入口直接观看www| 久久精品噜噜噜成人88aⅴ| 亚洲精品乱码久久久久久久久| 久久久亚洲精品一区二区三区| 欧美日韩不卡视频| 一本大道av一区二区在线播放 | 麻豆精品在线观看| 亚洲高清免费在线| 亚洲乱码国产乱码精品精小说 | 精品久久久三级丝袜| 精品视频一区二区三区免费| 99re热这里只有精品视频| 国产91精品精华液一区二区三区 | caoporn国产一区二区| 精品一区中文字幕| 日韩高清不卡一区| 亚洲成精国产精品女| 亚洲激情图片小说视频| 欧美激情一区在线观看| 国产精品免费免费| 国产日韩精品一区| 久久嫩草精品久久久久| 精品国产伦一区二区三区免费| 91精品免费在线| 一本一道久久a久久精品| 久草这里只有精品视频| 国内外精品视频| 国产自产高清不卡| 久久精品国产亚洲高清剧情介绍| 日韩精品视频网站| 亚洲精品欧美综合四区| 欧美特级限制片免费在线观看| 91精品国产综合久久精品| 精品视频一区二区三区免费| 91在线观看下载| 丁香六月久久综合狠狠色| 成a人片国产精品| 成人伦理片在线| 色视频一区二区| 欧美日本一区二区三区四区 | 成人av电影在线网| 成人黄色在线视频| 91香蕉视频在线| av在线播放成人| 欧美一区二区私人影院日本| 精品人在线二区三区| 国产丝袜欧美中文另类| 国产精品久久久久影视| 亚洲自拍偷拍av| 日韩高清一区二区| 国产老妇另类xxxxx| 国产高清成人在线| 欧美日韩国产色站一区二区三区| 欧美一区二区三区在线视频| 精品成人免费观看| 国产女人18毛片水真多成人如厕 | 欧美性色综合网| 欧美精品一级二级| 久久―日本道色综合久久| 国产三级精品在线| 一区二区三区欧美在线观看| 日韩精品欧美成人高清一区二区| 国产一区二区在线观看免费| 91美女在线观看| 91精品国产91久久久久久一区二区| 91精品国产综合久久久久久久 | av一本久道久久综合久久鬼色| 在线看一区二区| 日韩午夜三级在线| 国产视频一区不卡| 蜜桃精品视频在线| 99久久精品免费看国产免费软件| 欧美撒尿777hd撒尿| 日本一区二区视频在线| 亚洲福利一区二区| 懂色中文一区二区在线播放| 精品视频一区二区不卡| 精品福利在线导航| 蜜臀va亚洲va欧美va天堂| 91麻豆精品在线观看| 久久久久国产一区二区三区四区| 一区二区三区日本| 国产成人免费视频网站高清观看视频| 91黄色免费看| 久久久国产综合精品女国产盗摄| 亚洲一区二区欧美日韩| 久久国产三级精品| 91精品视频网| 伊人性伊人情综合网| 国产精品1区2区3区在线观看| 在线不卡的av| 亚洲一区二区三区四区的| 国产69精品久久久久777| 宅男在线国产精品| 丝袜美腿亚洲色图| 91丨九色丨国产丨porny| 久久九九99视频| 老司机精品视频在线| 欧美精品一区二区不卡| 亚洲另类在线制服丝袜| 成人免费高清在线| 日韩一区二区三区四区| 怡红院av一区二区三区| 91视频91自| 成人欧美一区二区三区黑人麻豆 | 色香蕉成人二区免费| 国产亚洲精品aa| 免费看欧美女人艹b| 欧美亚洲动漫精品| 一区二区三区精品在线| 91在线国产观看| 亚洲欧洲精品天堂一级 | 国产精品一区二区三区乱码| 精品乱人伦小说| 久久精品噜噜噜成人88aⅴ | 在线影视一区二区三区| 亚洲综合偷拍欧美一区色| 91色在线porny| 亚洲欧美日本韩国| 色综合久久九月婷婷色综合| 综合色天天鬼久久鬼色| 97se狠狠狠综合亚洲狠狠| 国产精品久久看| 成人午夜碰碰视频| 亚洲成人综合视频| 宅男在线国产精品| 麻豆精品精品国产自在97香蕉| 日韩欧美色综合| 国产激情91久久精品导航| 国产精品婷婷午夜在线观看| 99久久精品一区| 一区二区三区在线影院| 欧美综合欧美视频| 免费不卡在线视频| 久久久久88色偷偷免费| av男人天堂一区|