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

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

?? yaffs_guts.c

?? yaffs2 source code for linux2.4/2.6. include the utile
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * * Copyright (C) 2002-2007 Aleph One Ltd. *   for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning <charles@aleph1.co.uk> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */const char *yaffs_guts_c_version =    "$Id: yaffs_guts.c,v 1.78 2009/01/27 02:52:45 charles Exp $";#include "yportenv.h"#include "yaffsinterface.h"#include "yaffs_guts.h"#include "yaffs_tagsvalidity.h"#include "yaffs_getblockinfo.h"#include "yaffs_tagscompat.h"#ifndef  CONFIG_YAFFS_USE_OWN_SORT#include "yaffs_qsort.h"#endif#include "yaffs_nand.h"#include "yaffs_checkptrw.h"#include "yaffs_nand.h"#include "yaffs_packedtags2.h"#define YAFFS_PASSIVE_GC_CHUNKS 2#include "yaffs_ecc.h"/* Robustification (if it ever comes about...) */static void yaffs_RetireBlock(yaffs_Device * dev, int blockInNAND);static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND, int erasedOk);static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,				     const __u8 * data,				     const yaffs_ExtendedTags * tags);static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,				    const yaffs_ExtendedTags * tags);/* Other local prototypes */static int yaffs_UnlinkObject( yaffs_Object *obj);static int yaffs_ObjectHasCachedWriteData(yaffs_Object *obj);static void yaffs_HardlinkFixup(yaffs_Device *dev, yaffs_Object *hardList);static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device * dev,					     const __u8 * buffer,					     yaffs_ExtendedTags * tags,					     int useReserve);static int yaffs_PutChunkIntoFile(yaffs_Object * in, int chunkInInode,				  int chunkInNAND, int inScan);static yaffs_Object *yaffs_CreateNewObject(yaffs_Device * dev, int number,					   yaffs_ObjectType type);static void yaffs_AddObjectToDirectory(yaffs_Object * directory,				       yaffs_Object * obj);static int yaffs_UpdateObjectHeader(yaffs_Object * in, const YCHAR * name,				    int force, int isShrink, int shadows);static void yaffs_RemoveObjectFromDirectory(yaffs_Object * obj);static int yaffs_CheckStructures(void);static int yaffs_DeleteWorker(yaffs_Object * in, yaffs_Tnode * tn, __u32 level,			      int chunkOffset, int *limit);static int yaffs_DoGenericObjectDeletion(yaffs_Object * in);static yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blockNo);static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,				  int chunkInNAND);static int yaffs_UnlinkWorker(yaffs_Object * obj);static void yaffs_DestroyObject(yaffs_Object * obj);static int yaffs_TagsMatch(const yaffs_ExtendedTags * tags, int objectId,			   int chunkInObject);loff_t yaffs_GetFileSize(yaffs_Object * obj);static int yaffs_AllocateChunk(yaffs_Device * dev, int useReserve, yaffs_BlockInfo **blockUsedPtr);static void yaffs_VerifyFreeChunks(yaffs_Device * dev);static void yaffs_CheckObjectDetailsLoaded(yaffs_Object *in);static void yaffs_VerifyDirectory(yaffs_Object *directory);#ifdef YAFFS_PARANOIDstatic int yaffs_CheckFileSanity(yaffs_Object * in);#else#define yaffs_CheckFileSanity(in)#endifstatic void yaffs_InvalidateWholeChunkCache(yaffs_Object * in);static void yaffs_InvalidateChunkCache(yaffs_Object * object, int chunkId);static void yaffs_InvalidateCheckpoint(yaffs_Device *dev);static int yaffs_FindChunkInFile(yaffs_Object * in, int chunkInInode,				 yaffs_ExtendedTags * tags);static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos);static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device * dev,					  yaffs_FileStructure * fStruct,					  __u32 chunkId);/* Function to calculate chunk and offset */static void yaffs_AddrToChunk(yaffs_Device *dev, loff_t addr, int *chunkOut, __u32 *offsetOut){	int chunk;	__u32 offset;		chunk  = (__u32)(addr >> dev->chunkShift);			if(dev->chunkDiv == 1)	{		/* easy power of 2 case */		offset = (__u32)(addr & dev->chunkMask);	}	else	{		/* Non power-of-2 case */				loff_t chunkBase;				chunk /= dev->chunkDiv;				chunkBase = ((loff_t)chunk) * dev->nDataBytesPerChunk;		offset = (__u32)(addr - chunkBase);	}	*chunkOut = chunk;	*offsetOut = offset;}/* Function to return the number of shifts for a power of 2 greater than or equal  * to the given number * Note we don't try to cater for all possible numbers and this does not have to * be hellishly efficient. */ static __u32 ShiftsGE(__u32 x){	int extraBits;	int nShifts;		nShifts = extraBits = 0;		while(x>1){		if(x & 1) extraBits++;		x>>=1;		nShifts++;	}	if(extraBits) 		nShifts++;			return nShifts;}/* Function to return the number of shifts to get a 1 in bit 0 */ static __u32 Shifts(__u32 x){	int nShifts;		nShifts =  0;		if(!x) return 0;		while( !(x&1)){		x>>=1;		nShifts++;	}			return nShifts;}/*  * Temporary buffer manipulations. */static int yaffs_InitialiseTempBuffers(yaffs_Device *dev)	{	int i;	__u8 *buf = (__u8 *)1;			memset(dev->tempBuffer,0,sizeof(dev->tempBuffer));			for (i = 0; buf && i < YAFFS_N_TEMP_BUFFERS; i++) {		dev->tempBuffer[i].line = 0;	/* not in use */		dev->tempBuffer[i].buffer = buf =		    YMALLOC_DMA(dev->totalBytesPerChunk);	}			return buf ? YAFFS_OK : YAFFS_FAIL;	}__u8 *yaffs_GetTempBuffer(yaffs_Device * dev, int lineNo){	int i, j;	dev->tempInUse++;	if(dev->tempInUse > dev->maxTemp)		dev->maxTemp = dev->tempInUse;	for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {		if (dev->tempBuffer[i].line == 0) {			dev->tempBuffer[i].line = lineNo;			if ((i + 1) > dev->maxTemp) {				dev->maxTemp = i + 1;				for (j = 0; j <= i; j++)					dev->tempBuffer[j].maxLine =					    dev->tempBuffer[j].line;			}			return dev->tempBuffer[i].buffer;		}	}	T(YAFFS_TRACE_BUFFERS,	  (TSTR("Out of temp buffers at line %d, other held by lines:"),	   lineNo));	for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {		T(YAFFS_TRACE_BUFFERS, (TSTR(" %d "), dev->tempBuffer[i].line));	}	T(YAFFS_TRACE_BUFFERS, (TSTR(" " TENDSTR)));	/*	 * If we got here then we have to allocate an unmanaged one	 * This is not good.	 */	dev->unmanagedTempAllocations++;	return YMALLOC(dev->nDataBytesPerChunk);}void yaffs_ReleaseTempBuffer(yaffs_Device * dev, __u8 * buffer,				    int lineNo){	int i;		dev->tempInUse--;		for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {		if (dev->tempBuffer[i].buffer == buffer) {			dev->tempBuffer[i].line = 0;			return;		}	}	if (buffer) {		/* assume it is an unmanaged one. */		T(YAFFS_TRACE_BUFFERS,		  (TSTR("Releasing unmanaged temp buffer in line %d" TENDSTR),		   lineNo));		YFREE(buffer);		dev->unmanagedTempDeallocations++;	}}/* * Determine if we have a managed buffer. */int yaffs_IsManagedTempBuffer(yaffs_Device * dev, const __u8 * buffer){	int i;	for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {		if (dev->tempBuffer[i].buffer == buffer)			return 1;	}    for (i = 0; i < dev->nShortOpCaches; i++) {        if( dev->srCache[i].data == buffer )            return 1;    }    if (buffer == dev->checkpointBuffer)      return 1;    T(YAFFS_TRACE_ALWAYS,	  (TSTR("yaffs: unmaged buffer detected.\n" TENDSTR)));    return 0;}/* * Chunk bitmap manipulations */static Y_INLINE __u8 *yaffs_BlockBits(yaffs_Device * dev, int blk){	if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) {		T(YAFFS_TRACE_ERROR,		  (TSTR("**>> yaffs: BlockBits block %d is not valid" TENDSTR),		   blk));		YBUG();	}	return dev->chunkBits +	    (dev->chunkBitmapStride * (blk - dev->internalStartBlock));}static Y_INLINE void yaffs_VerifyChunkBitId(yaffs_Device *dev, int blk, int chunk){	if(blk < dev->internalStartBlock || blk > dev->internalEndBlock ||	   chunk < 0 || chunk >= dev->nChunksPerBlock) {	   T(YAFFS_TRACE_ERROR,	    (TSTR("**>> yaffs: Chunk Id (%d:%d) invalid"TENDSTR),blk,chunk));	    YBUG();	}}static Y_INLINE void yaffs_ClearChunkBits(yaffs_Device * dev, int blk){	__u8 *blkBits = yaffs_BlockBits(dev, blk);	memset(blkBits, 0, dev->chunkBitmapStride);}static Y_INLINE void yaffs_ClearChunkBit(yaffs_Device * dev, int blk, int chunk){	__u8 *blkBits = yaffs_BlockBits(dev, blk);	yaffs_VerifyChunkBitId(dev,blk,chunk);	blkBits[chunk / 8] &= ~(1 << (chunk & 7));}static Y_INLINE void yaffs_SetChunkBit(yaffs_Device * dev, int blk, int chunk){	__u8 *blkBits = yaffs_BlockBits(dev, blk);		yaffs_VerifyChunkBitId(dev,blk,chunk);	blkBits[chunk / 8] |= (1 << (chunk & 7));}static Y_INLINE int yaffs_CheckChunkBit(yaffs_Device * dev, int blk, int chunk){	__u8 *blkBits = yaffs_BlockBits(dev, blk);	yaffs_VerifyChunkBitId(dev,blk,chunk);	return (blkBits[chunk / 8] & (1 << (chunk & 7))) ? 1 : 0;}static Y_INLINE int yaffs_StillSomeChunkBits(yaffs_Device * dev, int blk){	__u8 *blkBits = yaffs_BlockBits(dev, blk);	int i;	for (i = 0; i < dev->chunkBitmapStride; i++) {		if (*blkBits)			return 1;		blkBits++;	}	return 0;}static int yaffs_CountChunkBits(yaffs_Device * dev, int blk){	__u8 *blkBits = yaffs_BlockBits(dev, blk);	int i;	int n = 0;	for (i = 0; i < dev->chunkBitmapStride; i++) {		__u8 x = *blkBits;		while(x){			if(x & 1)				n++;			x >>=1;		}					blkBits++;	}	return n;}/*  * Verification code */ static int yaffs_SkipVerification(yaffs_Device *dev){	return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY | YAFFS_TRACE_VERIFY_FULL));}static int yaffs_SkipFullVerification(yaffs_Device *dev){	return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY_FULL));}static int yaffs_SkipNANDVerification(yaffs_Device *dev){	return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY_NAND));}static const char * blockStateName[] = {"Unknown","Needs scanning","Scanning","Empty","Allocating","Full","Dirty","Checkpoint","Collecting","Dead"};static void yaffs_VerifyBlock(yaffs_Device *dev,yaffs_BlockInfo *bi,int n){	int actuallyUsed;	int inUse;		if(yaffs_SkipVerification(dev))		return;			/* Report illegal runtime states */	if(bi->blockState >= YAFFS_NUMBER_OF_BLOCK_STATES)		T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has undefined state %d"TENDSTR),n,bi->blockState));			switch(bi->blockState){	 case YAFFS_BLOCK_STATE_UNKNOWN:	 case YAFFS_BLOCK_STATE_SCANNING:	 case YAFFS_BLOCK_STATE_NEEDS_SCANNING:		T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has bad run-state %s"TENDSTR),		n,blockStateName[bi->blockState]));	}		/* Check pages in use and soft deletions are legal */		actuallyUsed = bi->pagesInUse - bi->softDeletions;		if(bi->pagesInUse < 0 || bi->pagesInUse > dev->nChunksPerBlock ||	   bi->softDeletions < 0 || bi->softDeletions > dev->nChunksPerBlock ||	   actuallyUsed < 0 || actuallyUsed > dev->nChunksPerBlock)		T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has illegal values pagesInUsed %d softDeletions %d"TENDSTR),		n,bi->pagesInUse,bi->softDeletions));				/* Check chunk bitmap legal */	inUse = yaffs_CountChunkBits(dev,n);	if(inUse != bi->pagesInUse)		T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has inconsistent values pagesInUse %d counted chunk bits %d"TENDSTR),			n,bi->pagesInUse,inUse));		/* Check that the sequence number is valid.	 * Ten million is legal, but is very unlikely 	 */	if(dev->isYaffs2 && 	   (bi->blockState == YAFFS_BLOCK_STATE_ALLOCATING || bi->blockState == YAFFS_BLOCK_STATE_FULL) &&	   (bi->sequenceNumber < YAFFS_LOWEST_SEQUENCE_NUMBER || bi->sequenceNumber > 10000000 ))		T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has suspect sequence number of %d"TENDSTR),		n,bi->sequenceNumber));		}static void yaffs_VerifyCollectedBlock(yaffs_Device *dev,yaffs_BlockInfo *bi,int n){	yaffs_VerifyBlock(dev,bi,n);		/* After collection the block should be in the erased state */	/* This will need to change if we do partial gc */		if(bi->blockState != YAFFS_BLOCK_STATE_COLLECTING &&	   bi->blockState != YAFFS_BLOCK_STATE_EMPTY){		T(YAFFS_TRACE_ERROR,(TSTR("Block %d is in state %d after gc, should be erased"TENDSTR),			n,bi->blockState));	}}static void yaffs_VerifyBlocks(yaffs_Device *dev){	int i;	int nBlocksPerState[YAFFS_NUMBER_OF_BLOCK_STATES];	int nIllegalBlockStates = 0;		if(yaffs_SkipVerification(dev))		return;	memset(nBlocksPerState,0,sizeof(nBlocksPerState));			for(i = dev->internalStartBlock; i <= dev->internalEndBlock; i++){		yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);		yaffs_VerifyBlock(dev,bi,i);		if(bi->blockState < YAFFS_NUMBER_OF_BLOCK_STATES)			nBlocksPerState[bi->blockState]++;		else			nIllegalBlockStates++;						}		T(YAFFS_TRACE_VERIFY,(TSTR(""TENDSTR)));	T(YAFFS_TRACE_VERIFY,(TSTR("Block summary"TENDSTR)));		T(YAFFS_TRACE_VERIFY,(TSTR("%d blocks have illegal states"TENDSTR),nIllegalBlockStates));	if(nBlocksPerState[YAFFS_BLOCK_STATE_ALLOCATING] > 1)		T(YAFFS_TRACE_VERIFY,(TSTR("Too many allocating blocks"TENDSTR)));	for(i = 0; i < YAFFS_NUMBER_OF_BLOCK_STATES; i++)		T(YAFFS_TRACE_VERIFY,		  (TSTR("%s %d blocks"TENDSTR),		  blockStateName[i],nBlocksPerState[i]));		if(dev->blocksInCheckpoint != nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT])		T(YAFFS_TRACE_VERIFY,		 (TSTR("Checkpoint block count wrong dev %d count %d"TENDSTR),		 dev->blocksInCheckpoint, nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT]));		 	if(dev->nErasedBlocks != nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY])		T(YAFFS_TRACE_VERIFY,		 (TSTR("Erased block count wrong dev %d count %d"TENDSTR),		 dev->nErasedBlocks, nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY]));		 	if(nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING] > 1)		T(YAFFS_TRACE_VERIFY,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲女同女同女同女同女同69| 国产成人免费视频精品含羞草妖精| 蜜芽一区二区三区| 成人一区二区三区视频| 在线不卡中文字幕| 亚洲乱码中文字幕| 成人黄色网址在线观看| 精品毛片乱码1区2区3区| 亚洲午夜精品在线| 91黄色在线观看| 国产精品护士白丝一区av| 国产一区二区三区四区五区美女 | 日韩视频在线永久播放| 亚洲一区二区三区在线播放| 大白屁股一区二区视频| 久久久综合网站| 加勒比av一区二区| 日韩免费观看高清完整版在线观看| 一区二区三区国产豹纹内裤在线| 成人av动漫在线| 国产亚洲污的网站| 狠狠v欧美v日韩v亚洲ⅴ| 69精品人人人人| 亚洲成av人片一区二区| 欧美在线三级电影| 亚洲精品少妇30p| 91天堂素人约啪| 亚洲特级片在线| 91视频.com| 亚洲欧美日韩久久| 91久久久免费一区二区| 一区二区三区中文字幕电影| 色综合久久久久久久| 亚洲精品亚洲人成人网| 欧洲一区在线电影| 亚洲人被黑人高潮完整版| 色综合天天视频在线观看| 中文字幕一区av| 91久久奴性调教| 午夜精品国产更新| 91精品一区二区三区久久久久久| 日韩av电影天堂| 精品免费日韩av| 国产91精品精华液一区二区三区| 中文字幕高清不卡| 色综合av在线| 午夜精品久久久久影视| 欧美tk—视频vk| 成人激情午夜影院| 一区二区三区蜜桃| 欧美一级高清片| 处破女av一区二区| 亚洲综合清纯丝袜自拍| 欧美成人一级视频| 99久久精品免费精品国产| 午夜欧美一区二区三区在线播放| 日韩午夜在线播放| 成人黄色网址在线观看| 亚洲国产精品久久人人爱| 欧美大胆一级视频| 成人av资源在线| 日韩国产精品大片| 国产精品久久久久永久免费观看 | aaa国产一区| 日韩国产欧美在线观看| 亚洲国产精品成人综合| 欧美精品视频www在线观看 | 欧美日韩中文字幕精品| 理论片日本一区| 亚洲人成网站影音先锋播放| 日韩欧美中文字幕公布| 99久久99精品久久久久久 | 色婷婷国产精品| 3d动漫精品啪啪1区2区免费| 久久精品网站免费观看| 91免费视频网| 九色porny丨国产精品| 亚洲精品国产品国语在线app| 免费不卡在线视频| 日韩午夜电影在线观看| 色伊人久久综合中文字幕| 老司机精品视频在线| 一区二区在线免费观看| 国产欧美一区视频| 欧美大片日本大片免费观看| 欧美视频在线观看一区二区| 粉嫩在线一区二区三区视频| 久久99精品久久久久久久久久久久| 亚洲美女免费视频| 国产精品乱人伦| 久久久久久久久一| 精品久久一二三区| 欧美日韩国产高清一区二区三区| 国产91在线观看| 国内精品第一页| 蜜臀国产一区二区三区在线播放| 亚洲成人福利片| 亚洲一区二区三区视频在线| 中文字幕综合网| 中文字幕永久在线不卡| 国产精品区一区二区三区| 久久久久国色av免费看影院| 精品美女一区二区| 精品国产污网站| 日韩欧美精品在线| 欧美一区二区三区在| 欧美一区二区网站| 欧美一区二区播放| 欧美成人精品3d动漫h| 日韩一区二区三区视频| 欧美一二三区在线| 欧美电影免费观看高清完整版在 | 欧美疯狂性受xxxxx喷水图片| 91高清视频在线| 色猫猫国产区一区二在线视频| proumb性欧美在线观看| 成人av资源在线| 色噜噜狠狠色综合中国| 在线看不卡av| 欧美少妇一区二区| 日韩亚洲欧美一区| 26uuu久久综合| 国产精品素人一区二区| 日韩一区在线播放| 中文字幕一区在线观看视频| 亚洲最快最全在线视频| 一区二区三区国产豹纹内裤在线| 亚洲成人一区二区| 久久精品99国产国产精| 国产精品一区三区| 成人aa视频在线观看| 欧美系列在线观看| 日韩欧美国产一区二区在线播放| 久久蜜臀精品av| 国产精品传媒视频| 偷拍一区二区三区四区| 精品制服美女丁香| 91亚洲国产成人精品一区二区三 | 日本午夜一本久久久综合| 久久66热偷产精品| www.在线成人| 欧美精品自拍偷拍| 欧美激情一区二区三区蜜桃视频| 亚洲综合成人在线| 国产毛片精品一区| 欧洲视频一区二区| 26uuu欧美日本| 亚洲激情成人在线| 激情五月婷婷综合| 日本伦理一区二区| 欧美精品一区二区高清在线观看| ...xxx性欧美| 久久国产精品露脸对白| 97久久超碰精品国产| 欧美va天堂va视频va在线| 亚洲天堂a在线| 国产一区二区在线观看视频| 91久久精品一区二区三区| 精品日韩欧美在线| 亚洲第一会所有码转帖| 国产91精品精华液一区二区三区| 欧美嫩在线观看| 综合欧美一区二区三区| 国产一区二区三区日韩| 欧美三级午夜理伦三级中视频| 国产亚洲午夜高清国产拍精品| 亚洲国产日韩精品| eeuss鲁一区二区三区| 日韩一区二区电影| 亚洲自拍偷拍综合| 99久久99久久免费精品蜜臀| 久久免费精品国产久精品久久久久| 亚洲h精品动漫在线观看| 成人sese在线| 亚洲国产精品传媒在线观看| 久久91精品久久久久久秒播| 337p亚洲精品色噜噜狠狠| 亚洲美女视频在线| 成人av动漫网站| 国产欧美日本一区二区三区| 国内国产精品久久| 91精品国产日韩91久久久久久| 亚洲国产cao| 欧美色图第一页| 一区二区三区在线免费观看| 99久久99精品久久久久久| 中文字幕av一区二区三区免费看| 韩国三级电影一区二区| 日韩一区二区影院| 免费av成人在线| 欧美mv日韩mv| 七七婷婷婷婷精品国产| 欧美一区二区三区人| 五月综合激情网| 欧美一二三区精品| 激情久久五月天| 久久精品亚洲精品国产欧美| 懂色av一区二区夜夜嗨| 国产精品色噜噜| 91蜜桃网址入口|