日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Eboot 中给nandflash分区实现

發布時間:2025/4/16 编程问答 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Eboot 中给nandflash分区实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提到分區就不得不提到MBR,不得不提到分區表。

什么是MBR

硬盤的0柱面、0磁頭、1扇區稱為主引導扇區,NANDFLASH由BLOCK和Sector組成,所以NANDFLASH的第0 BLOCK,第1 Sector為主引導扇區,FDISK程序寫到該扇區的內容稱為主引導記錄(MBR)。該記錄占用512個字節,它用于硬盤啟動時將系統控制權交給用戶指定的,并在分區表中登記了的某個操作系統區。

?

MBR的組成
一個扇區的硬盤主引導記錄MBR由如圖6-15所示的4個部分組成。
·主引導程序(偏移地址0000H--0088H),它負責從活動分區中裝載,并運行系統引導程序。
·出錯信息數據區,偏移地址0089H--00E1H為出錯信息,00E2H--01BDH全為0字節。
·分區表(DPT,Disk Partition Table)含4個分區項,偏移地址01BEH--01FDH,每個分區表項長16個字節,共64字節為分區項1、分區項2、分區項3、分區項4。
·結束標志字,偏移地址01FE--01FF的2個字節值為結束標志55AA,如果該標志錯誤系統就不能啟動。


圖6-15 MBR的組成結構圖

MBR中的分區信息結構


??? 占用512個字節的MBR中,偏移地址01BEH--01FDH的64個字節,為4個分區項內容(分區信息表)。它是由磁盤介質類型及用戶在使用 FDISK定義分區說確定的。在實際應用中,FDISK對一個磁盤劃分的主分區可少于4個,但最多不超過4個。每個分區表的項目是16個字節,其內容含義 如表6-19所示。
表6-19 分區項表(16字節)內容及含義

?

?

EBOOT中對NAND分區主要代碼,eboot目錄下的fmd.cpp文件,與NAND驅動基本相同,所以,要對NAND進行分區,就得對NAND驅動非常熟悉。透徹了解。然后就是
E:/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/ETHDBG/BOOTPART/bootpart.cpp文件了。該文件主要通過調用NANDFLASH的讀寫操作來寫入MBR,也是今天主要的分析對象。

?

主要函數。

?

/*? BP_OpenPartition

?*

?*? Opens/creates a partition depending on the creation flags.? If it is opening

?*? and the partition has already been opened, then it returns a handle to the

?*? opened partition.? Otherwise, it loads the state information of that partition

?*? into memory and returns a handle.

?*

?*? ENTRY

?*????? dwStartSector - Logical sector to start the partition.? NEXT_FREE_LOC if none

?*????????? specified.? Ignored if opening existing partition.

?*????? dwNumSectors - Number of logical sectors of the partition.? USE_REMAINING_SPACE

?*????????? to indicate to take up the rest of the space on the flash for that partition (should

?*????????? only be used when creating extended partitions).? This parameter is ignored

?*????????? if opening existing partition.

?*????? dwPartType - Type of partition to create/open.

?*????? fActive - TRUE indicates to create/open the active partition.? FALSE for

?*????????? inactive.

?*????? dwCreationFlags - PART_CREATE_NEW to create only.? Fail if it already

?*????????? exists.? PART_OPEN_EXISTING to open only.? Fail if it doesn't exist.

?*????????? PART_OPEN_ALWAYS creates if it does not exist and opens if it

?*????????? does exist.

?*

?*? EXIT

?*????? Handle to the partition on success.? INVALID_HANDLE_VALUE on error.

?*/

HANDLE BP_OpenPartition(DWORD dwStartSector, DWORD dwNumSectors, DWORD dwPartType, BOOL fActive, DWORD dwCreationFlags)

?


注:示例代碼為本人EBOOT中分區實現源碼(WINCE5.0+S3C2440+128MNAND,MBR寫在第4個BLOCK,分一個BINFS格式分區和一個FAT格式分區)。

?

BOOL WriteRegionsToBootMedia(DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr)

在把SDRAM中的NK燒寫到NAND中去之前,先創建一個BINFS分區。

hPart = BP_OpenPartition( (NK_START_BLOCK+1)*PAGES_PER_BLOCK,? // next block of MBR???? BINFS_BLOCK*PAGES_PER_BLOCK,//SECTOR_TO_BLOCK_SIZE(FILE_TO_SECTOR_SIZE(dwBINFSPartLength))*PAGES_PER_BLOCK,? //align to block

????????????????????????????? PART_BINFS,

????????????????????????????? TRUE,

????????????????????????????? PART_OPEN_ALWAYS);


第一個參數分區的起始sector 為(NK_START_BLOCK+1)*PAGES_PER_BLOCK,

第二個參數分區的結束 sector為BINFS_BLOCK*PAGES_PER_BLOCK,

第三個參數分區的格式為PART_BINFS,即BINFS格式,

第四個參數指示該分區為活動分區,fActive = TURE,

第五個參數PART_OPEN_ALWAYS指示如果分區不存在就創建該分區,存在就OPEN該分區,返回分區句柄。

?

HANDLE BP_OpenPartition(DWORD dwStartSector, DWORD dwNumSectors, DWORD dwPartType, BOOL fActive, DWORD dwCreationFlags)

{

??????? DWORD dwPartIndex;

??????? BOOL fExists;

?

??????? ASSERT (g_pbMBRSector);

???????

??????? if (!IsValidMBR()) {

??????????? DWORD dwFlags = 0;

??????????

??????????? //fly

???????????? RETAILMSG(1, (TEXT("BP_OpenPartition:: dwStartSector=0x%x ,dwNumSectors= 0x%x.,dwPartType = 0x%x/r/n"), dwStartSector, dwNumSectors,dwPartType));

??????????? if (dwCreationFlags == PART_OPEN_EXISTING) {

??????????????? RETAILMSG(1, (TEXT("OpenPartition: Invalid MBR.? Cannot open existing partition 0x%x./r/n"), dwPartType));

??????????????? return INVALID_HANDLE_VALUE;

??????????? }

???????????

??????????? RETAILMSG(1, (TEXT("OpenPartition: Invalid MBR.? Formatting flash./r/n")));

??????????? if (g_FlashInfo.flashType == NOR) {

??????????????? dwFlags |= FORMAT_SKIP_BLOCK_CHECK;

??????????? }

??????????? //fly

???????????? RETAILMSG(1, (TEXT("BP_LowLevelFormat: g_pbMBRSector=0x%x, g_dwMBRSectorNum= 0x%x./r/n"), *g_pbMBRSector, g_dwMBRSectorNum));

??????????? BP_LowLevelFormat (SECTOR_TO_BLOCK(dwStartSector), SECTOR_TO_BLOCK(dwNumSectors), dwFlags);

??????????? dwPartIndex = 0;

??????????? fExists = FALSE;

??????? }

??????? else {

??????????? fExists = GetPartitionTableIndex(dwPartType, fActive, &dwPartIndex);???????

??????? }

?

??????? RETAILMSG(1, (TEXT("OpenPartition: Partition Exists=0x%x for part 0x%x./r/n"), fExists, dwPartType));

??????? if (fExists) {

??????????? // Partition was found.?

??????????? if (dwCreationFlags == PART_CREATE_NEW)

??????????????? return INVALID_HANDLE_VALUE;

???????????

??????????? if (g_partStateTable[dwPartIndex].pPartEntry == NULL) {

??????????????? // Open partition.? If this is the boot section partition, then file pointer starts after MBR

??????????????? g_partStateTable[dwPartIndex].pPartEntry = (PPARTENTRY)(g_pbMBRSector + PARTTABLE_OFFSET + sizeof(PARTENTRY)*dwPartIndex);

??????????????? g_partStateTable[dwPartIndex].dwDataPointer = 0;

??????????? }?

?????????? if ( dwNumSectors > g_partStateTable[dwPartIndex].pPartEntry->Part_TotalSectors )

????????????? return CreatePartition (dwStartSector, dwNumSectors, dwPartType, fActive, dwPartIndex);

?????????? else?????????

?????????????????? return (HANDLE)&g_partStateTable[dwPartIndex];???????????

??????? }

??????? else {

?

??????????? // If there are already 4 partitions, or creation flag specified OPEN_EXISTING, fail.

??????????? if ((dwPartIndex == NUM_PARTS) || (dwCreationFlags == PART_OPEN_EXISTING))

??????????????? return INVALID_HANDLE_VALUE;

?

??????????? // Create new partition

??????????? return CreatePartition (dwStartSector, dwNumSectors, dwPartType, fActive, dwPartIndex);

??????? }

?

??????? return INVALID_HANDLE_VALUE;

???????

}

進入函數,首先做的事就是檢測MBR的有效性。通過函數IsValidMBR()實現。

檢測MBR的有效性,首先要知道MBR保存在哪里,前面說過NANDFLASH的第0 BLOCK,第1 Sector為主引導扇區,也就是MBR,但是NAND如果被當作啟動芯片,○地址一般被BOOTLOADER代碼占據,MBR只有放在后面的BLOCK中。所以我把第0 個BLOCK放NBOOT,第1個BLOCK放TOC,第2個BLOCK放EBOOT,第3個BLOCK保留,第4個BLOCK就放MBR。

static BOOL IsValidMBR()

{

??? // Check to see if the MBR is valid

??? // MBR block is always located at logical sector 0

??? g_dwMBRSectorNum = GetMBRSectorNum();???????

?

??? RETAILMSG (1, (TEXT("IsValidMBR: MBR sector = 0x%x/r/n"), g_dwMBRSectorNum));

??

??? if ((g_dwMBRSectorNum == INVALID_ADDR) || !FMD_ReadSector (g_dwMBRSectorNum, g_pbMBRSector, NULL, 1)) {

?????? RETAILMSG (1, (TEXT("IsValidMBR-----return FALSE-------------------/r/n")));

??????? return FALSE;?

??? }???

??? return ((g_pbMBRSector[0] == 0xE9) &&

???????? (g_pbMBRSector[1] == 0xfd) &&

???????? (g_pbMBRSector[2] == 0xff) &&

???????? (g_pbMBRSector[SECTOR_SIZE_FS-2] == 0x55) &&

???????? (g_pbMBRSector[SECTOR_SIZE_FS-1] == 0xAA));

}?

IsValidMBR()實現的第一行就是給全局變量g_dwMBRSectorNum 賦值,顯而易見,g_dwMBRSectorNum就是指示保存MBR的那個Sector了。

g_dwMBRSectorNum = GetMBRSectorNum();?? //是獲得保存MBR的那個Sector

static DWORD GetMBRSectorNum ()

{

??? DWORD dwBlockNum = 3, dwSector = 0;

??? SectorInfo si;

???????

??? while (dwBlockNum < g_FlashInfo.dwNumBlocks) {

?

??????? if (!IS_BLOCK_UNUSABLE (dwBlockNum)) {

??????????? dwSector = dwBlockNum * g_FlashInfo.wSectorsPerBlock;

???????????

??????????? if (!FMD_ReadSector (dwSector, NULL, &si, 1)) {

??????????????? RETAILMSG(1, (TEXT("GetMBRSectorNum: Could not read sector 0x%x./r/n"), dwSector));

??????????????? return INVALID_ADDR;

??????????? }

??????????? // Check to see if logical sector number is 0

??????????? if (si.dwReserved1 == 0) {

????????????? //RETAILMSG(1,(TEXT("dwBlockNum=%d/r/n"),dwBlockNum));

??????????????? return dwSector;

??????????? }

??????? }

?

??????? dwBlockNum++;

?

??? }

?

??? return INVALID_ADDR;

}

這里dwBlockNum直接給了個3,因為NBOOT,TOC,EBOOT已經把前三個BLOCK用了。所以MBR的選擇直接排除了前三個BLOCK了。

#define IS_BLOCK_UNUSABLE(blockID) ((FMD_GetBlockStatus (blockID) & (BLOCK_STATUS_BAD|BLOCK_STATUS_RESERVED)) > 0)

然后確定BLOCK是否可使用的BLOCK,最后通si.dwReserved1 == 0來判斷是不是選擇這個Sector來保存MBR。

IsValidMBR()中還有一個重要的結構就是g_pbMBRSector數組,它就是MBR了。

函數返回時,MBR必須符合下列記錄。

??? return ((g_pbMBRSector[0] == 0xE9) &&

???????? (g_pbMBRSector[1] == 0xfd) &&

???????? (g_pbMBRSector[2] == 0xff) &&

???????? (g_pbMBRSector[SECTOR_SIZE_FS-2] == 0x55) &&

???????? (g_pbMBRSector[SECTOR_SIZE_FS-1] == 0xAA));

可以看到只有開始三個字節為0XE9,FD,FF,當然,還有熟悉的結束標志符0X55AA。

?

如果沒有檢測到MBR,則先對NANDFLASH進行低級格式化。BP_LowLevelFormat (SECTOR_TO_BLOCK(dwStartSector), SECTOR_TO_BLOCK(dwNumSectors), dwFlags);再創建分區,CreatePartition (dwStartSector, dwNumSectors, dwPartType, fActive, dwPartIndex);。

?

BOOL BP_LowLevelFormat(DWORD dwStartBlock, DWORD dwNumBlocks, DWORD dwFlags)

{

??? dwNumBlocks = min (dwNumBlocks, g_FlashInfo.dwNumBlocks);

?

??? RETAILMSG(1,(TEXT("fly::Enter LowLevelFormat [0x%x, 0x%x]./r/n"), dwStartBlock,dwNumBlocks));// dwStartBlock + dwNumBlocks - 1));

?

??? // Erase all the flash blocks.

??? if (!EraseBlocks(dwStartBlock, dwNumBlocks, dwFlags))

??????? return(FALSE);

?

??? // Determine first good starting block

??? while (IS_BLOCK_UNUSABLE (dwStartBlock) && dwStartBlock < g_FlashInfo.dwNumBlocks) {

??????? dwStartBlock++;

??? }

?

??? if (dwStartBlock >= g_FlashInfo.dwNumBlocks) {

??????? RETAILMSG(1,(TEXT("BP_LowLevelFormat: no good blocks/r/n")));???????

??????? return FALSE;

??? }

?

??? // MBR goes in the first sector of the starting block.? This will be logical sector 0.

??? g_dwMBRSectorNum = dwStartBlock * g_FlashInfo.wSectorsPerBlock;

?

??? RETAILMSG(1,(TEXT("fly:g_dwMBRSectorNum=%d/r/n"),g_dwMBRSectorNum));

?

??? // Create an MBR.

??? CreateMBR();

??? return(TRUE);

}

在對NANDFLASH進行低格時,主要對壞塊的處理。if (!EraseBlocks(dwStartBlock, dwNumBlocks, dwFlags))檢測每一個Sector,每個BLOCK只要有一個Sector不能讀寫這個塊都會被處理成壞塊,這樣才能保證系統的穩定性。在函數的最后調用了??? CreateMBR();來創建一個MBR。static BOOL CreateMBR()

{

??? // This, plus a valid partition table, is all the CE partition manager needs to recognize

??? // the MBR as valid. It does not contain boot code.

?

??? memset (g_pbMBRSector, 0xff, g_FlashInfo.wDataBytesPerSector);

??? g_pbMBRSector[0] = 0xE9;

??? g_pbMBRSector[1] = 0xfd;

??? g_pbMBRSector[2] = 0xff;

??? g_pbMBRSector[SECTOR_SIZE_FS-2] = 0x55;

??? g_pbMBRSector[SECTOR_SIZE_FS-1] = 0xAA;

?

??? // Zero out partition table so that mspart treats entries as empty.

??? memset (g_pbMBRSector+PARTTABLE_OFFSET, 0, sizeof(PARTENTRY) * NUM_PARTS);

?

??? return WriteMBR();

?

}? 當然。因為還沒有進行分區,這里寫入的MBR分區表部分是空的。static BOOL WriteMBR()

{

??? DWORD dwMBRBlockNum = g_dwMBRSectorNum / g_FlashInfo.wSectorsPerBlock;

?

??? //dwMBRBlockNum = 1 ;

?

??? RETAILMSG(1, (TEXT("WriteMBR: MBR block = 0x%x,g_dwMBRSectorNum = 0x%x./r/n"), dwMBRBlockNum,g_dwMBRSectorNum));

?

??? memset (g_pbBlock, 0xff, g_dwDataBytesPerBlock);

??? memset (g_pSectorInfoBuf, 0xff, sizeof(SectorInfo) * g_FlashInfo.wSectorsPerBlock);

???????

??? // No need to check return, since a failed read means data hasn't been written yet.

??? ReadBlock (dwMBRBlockNum, g_pbBlock, g_pSectorInfoBuf);

?

??? if (!FMD_EraseBlock (dwMBRBlockNum)) {

??????? RETAILMSG (1, (TEXT("CreatePartition: error erasing block 0x%x/r/n"), dwMBRBlockNum));

??????? return FALSE;

??? }

?

??? memcpy (g_pbBlock + (g_dwMBRSectorNum % g_FlashInfo.wSectorsPerBlock) * g_FlashInfo.wDataBytesPerSector, g_pbMBRSector, g_FlashInfo.wDataBytesPerSector);

??? g_pSectorInfoBuf->bOEMReserved &= ~OEM_BLOCK_READONLY;

??? g_pSectorInfoBuf->wReserved2 &= ~SECTOR_WRITE_COMPLETED;

??? g_pSectorInfoBuf->dwReserved1 = 0;

?

??? RETAILMSG(1, (TEXT("fly::WriteMBR: MBR block = 0x%x./r/n"), dwMBRBlockNum));

?

??? if (!WriteBlock (dwMBRBlockNum, g_pbBlock, g_pSectorInfoBuf)) {

??????? RETAILMSG (1, (TEXT("CreatePartition: could not write to block 0x%x/r/n"), dwMBRBlockNum));

??????? return FALSE;

??? }

?

??? return TRUE;

???

}

在WriteMBR()函數中,就寫入了判斷MBR 的一些標志到BLOCK,??? g_pSectorInfoBuf->bOEMReserved &= ~OEM_BLOCK_READONLY;

??? g_pSectorInfoBuf->wReserved2 &= ~SECTOR_WRITE_COMPLETED;

??? g_pSectorInfoBuf->dwReserved1 = 0;

Wince系統啟動時,具體是NANDFLASH驅動加載成功后,MOUNT文件系統到NANDFLASH之前,也會通過讀取這些SectorInfo來得到MBR 保存的BLOCK,進而讀取MBR,獲得分區信息,從而把各分區MOUNT到相應文件系統。格式化完成,MBR也寫入成功后就可以開始新建分區了。

/*? CreatePartition

?*

?*? Creates a new partition.? If it is a boot section partition, then it formats

?*? flash.

?*

?*? ENTRY

?*????? dwStartSector - Logical sector to start the partition.? NEXT_FREE_LOC if?

?*????????? none specified.?

?*????? dwNumSectors - Number of logical sectors of the partition.? USE_REMAINING_SPACE

?*????????? to indicate to take up the rest of the space on the flash for that partition.

?*????? dwPartType - Type of partition to create.

?*????? fActive - TRUE indicates to create the active partition.? FALSE for

?*????????? inactive.

?*????? dwPartIndex - Index of the partition entry on the MBR

?*

?*? EXIT

?*????? Handle to the partition on success.? INVALID_HANDLE_VALUE on error.

?*/

?

static HANDLE CreatePartition (DWORD dwStartSector, DWORD dwNumSectors, DWORD dwPartType, BOOL fActive, DWORD dwPartIndex)

{

??? DWORD dwBootInd = 0;

?

??? RETAILMSG(1, (TEXT("CreatePartition: Enter CreatePartition for 0x%x./r/n"), dwPartType));

???

??? if (fActive)

??????? dwBootInd |= PART_IND_ACTIVE;

??? if (dwPartType == PART_BOOTSECTION || dwPartType == PART_BINFS || dwPartType == PART_XIP)

??????? dwBootInd |= PART_IND_READ_ONLY;???

?

???? // If start sector is invalid, it means find next free sector

??? if (dwStartSector == NEXT_FREE_LOC) {???????

??????? dwStartSector = FindFreeSector();

??????? if (dwStartSector == INVALID_ADDR) {

??????????? RETAILMSG(1, (TEXT("CreatePartition: can't find free sector./r/n")));

??????????? return INVALID_HANDLE_VALUE;

??????? }

?

??????? // Start extended partition on a block boundary

??????? if ((dwPartType == PART_EXTENDED) && (dwStartSector % g_FlashInfo.wSectorsPerBlock)) {

??????????? dwStartSector = (dwStartSector / g_FlashInfo.wSectorsPerBlock + 1) * g_FlashInfo.wSectorsPerBlock;

??????? }

??? }

?

??? // If num sectors is invalid, fill the rest of the space up

??? if (dwNumSectors == USE_REMAINING_SPACE) {

?

??????? DWORD dwLastLogSector = LastLogSector();

??????? if (dwLastLogSector == INVALID_ADDR)

??????????? return INVALID_HANDLE_VALUE;

?

??????? // Determine the number of blocks to reserve for the FAL compaction when creating an extended partition.

??????? DWORD dwReservedBlocks = g_FlashInfo.dwNumBlocks / PERCENTAGE_OF_MEDIA_TO_RESERVE;

??????? if((dwReservedBlocks = g_FlashInfo.dwNumBlocks / PERCENTAGE_OF_MEDIA_TO_RESERVE) < MINIMUM_FLASH_BLOCKS_TO_RESERVE) {

??????????? dwReservedBlocks = MINIMUM_FLASH_BLOCKS_TO_RESERVE;

??????? }

???????

??????? dwNumSectors = dwLastLogSector - dwStartSector + 1 - dwReservedBlocks * g_FlashInfo.wSectorsPerBlock;

??? }

??

??? if (!AreSectorsFree (dwStartSector, dwNumSectors)){

??????? RETAILMSG (1, (TEXT("fly:::::CreatePartition: sectors [0x%x, 0x%x] requested are out of range or taken by another partition/r/n"), dwStartSector, dwNumSectors));

??????? return INVALID_HANDLE_VALUE;

??? }

?

??? RETAILMSG(1, (TEXT("CreatePartition: Start = 0x%x, Num = 0x%x./r/n"), dwStartSector, dwNumSectors));

???

??? AddPartitionTableEntry (dwPartIndex, dwStartSector, dwNumSectors, (BYTE)dwPartType, (BYTE)dwBootInd);

?

??? if (dwBootInd & PART_IND_READ_ONLY) {

??????? if (!WriteLogicalNumbers (dwStartSector, dwNumSectors, TRUE)) {

??????????? RETAILMSG(1, (TEXT("CreatePartition: can't mark sector info./r/n")));

??????????? return INVALID_HANDLE_VALUE;

??????? }

??? }

?

??? if (!WriteMBR())

??????? return INVALID_HANDLE_VALUE;

?

??? g_partStateTable[dwPartIndex].pPartEntry = (PPARTENTRY)(g_pbMBRSector + PARTTABLE_OFFSET + sizeof(PARTENTRY)*dwPartIndex);

??? g_partStateTable[dwPartIndex].dwDataPointer = 0;

?

??? return (HANDLE)&g_partStateTable[dwPartIndex];???????????

}

如果第二個參數為-1,則視為將余下的所有空間劃為一個分區。LastLogSector();函數獲得最后一個邏輯Sector。static DWORD LastLogSector()

{

??? if (g_dwLastLogSector) {

?????? return g_dwLastLogSector;

??? }

?

??? DWORD dwMBRBlock = g_dwMBRSectorNum / g_FlashInfo.wSectorsPerBlock;

??? DWORD dwUnusableBlocks = dwMBRBlock;

?

??? for (DWORD i = dwMBRBlock; i < g_FlashInfo.dwNumBlocks; i++) {

??????? if (IS_BLOCK_UNUSABLE (i))

??????????? dwUnusableBlocks++;

??? }

???

??? g_dwLastLogSector = (g_FlashInfo.dwNumBlocks - dwUnusableBlocks) * g_FlashInfo.wSectorsPerBlock - 1;

?

??? RETAILMSG(1, (TEXT("fly:::LastLogSector: Last log sector is: 0x%x./r/n"), g_dwLastLogSector));

???

??? return g_dwLastLogSector;

}

即g_dwLastLogSector = (g_FlashInfo.dwNumBlocks - dwUnusableBlocks) * g_FlashInfo.wSectorsPerBlock - 1;//(NAND 的BLOCK總數 – MBR保存的那個BLOCK)* 每個BLOCK的Sector數 – 保存MBR的那個Sector。得到的就是從MBR那個Sector之后的所有Sector,即邏輯大小。

AreSectorsFree (dwStartSector, dwNumSectors)函數判斷參數提供的起始Sector和個數有沒有超出來NAND的界限,或者邏輯分區的界限。???

重頭戲開始了。通過AddPartitionTableEntry (dwPartIndex, dwStartSector, dwNumSectors, (BYTE)dwPartType, (BYTE)dwBootInd); 準備分區信息寫入分區表。

/*? AddPartitionTableEntry

?*

?*? Generates the partition entry for the partition table and copies the entry

?*? into the MBR that is stored in memory.

?*?

?*

?*? ENTRY

?*????? entry - index into partition table

?*????? startSector - starting logical sector

?*????? totalSectors - total logical sectors

?*????? fileSystem - type of partition

?*????? bootInd - byte in partition entry that stores various flags such as

?*????????? active and read-only status.

?*

?*? EXIT

?*/

?

static void AddPartitionTableEntry(DWORD entry, DWORD startSector, DWORD totalSectors, BYTE fileSystem, BYTE bootInd)

{

??? PARTENTRY partentry = {0};

??? Addr startAddr;

??? Addr endAddr;

?

??? ASSERT(entry < 4);

?

??? // no checking with disk info and start/total sectors because we allow

??? // bogus partitions for testing purposes

?

??? // initially known partition table entry

??? partentry.Part_BootInd = bootInd;

??? partentry.Part_FileSystem = fileSystem;

??? partentry.Part_StartSector = startSector;

??? partentry.Part_TotalSectors = totalSectors;

?

??? // logical block addresses for the first and final sector (start on the second head)

??? startAddr.type = LBA;

??? startAddr.lba = partentry.Part_StartSector;

??? endAddr.type = LBA;

??? endAddr.lba = partentry.Part_StartSector + partentry.Part_TotalSectors-1;

?

??? // translate the LBA addresses to CHS addresses

??? startAddr = LBAtoCHS(&g_FlashInfo, startAddr);

??? endAddr = LBAtoCHS(&g_FlashInfo, endAddr);

?

??? // starting address

??? partentry.Part_FirstTrack = (BYTE)(startAddr.chs.cylinder & 0xFF);

??? partentry.Part_FirstHead = (BYTE)(startAddr.chs.head & 0xFF);

??? // lower 6-bits == sector, upper 2-bits = cylinder upper 2-bits of 10-bit cylinder #

??? partentry.Part_FirstSector = (BYTE)((startAddr.chs.sector & 0x3F) | ((startAddr.chs.cylinder & 0x0300) >> 2));

?

??? // ending address:

??? partentry.Part_LastTrack = (BYTE)(endAddr.chs.cylinder & 0xFF);

??? partentry.Part_LastHead = (BYTE)(endAddr.chs.head & 0xFF);

??? // lower 6-bits == sector, upper 2-bits = cylinder upper 2-bits of 10-bit cylinder #

??? partentry.Part_LastSector = (BYTE)((endAddr.chs.sector & 0x3F) | ((endAddr.chs.cylinder & 0x0300) >> 2));

?

??? memcpy(g_pbMBRSector+PARTTABLE_OFFSET+(sizeof(PARTENTRY)*entry), &partentry, sizeof(PARTENTRY));

}

這里面的地址信息是一種叫CHS(Cyinder/Head/Sector)的地址。eboot中有將邏輯地址LBS(Logical Block Addr)與這種地址互相轉換的函數LBAtoCHS,CHSToLBA。
Addr LBAtoCHS(FlashInfo *pFlashInfo, Addr lba)
{
??? Addr chs;
??? DWORD tmp = pFlashInfo->dwNumBlocks * pFlashInfo->wSectorsPerBlock;

??? chs.type = CHS;
??? chs.chs.cylinder = (WORD)(lba.lba / tmp);????????????????????????????????????? // 柱面,應該始終是0
??? tmp = lba.lba % tmp;
??? chs.chs.head = (WORD)(tmp / pFlashInfo->wSectorsPerBlock);???????????????????? // 塊地址
??? chs.chs.sector = (WORD)((tmp % pFlashInfo->wSectorsPerBlock) + 1);???? // 扇區+1

??? return chs;
}

Addr CHStoLBA(FlashInfo *pFlashInfo, Addr chs)
{
??? Addr lba;

??? lba.type = LBA;
??? lba.lba = ((chs.chs.cylinder * pFlashInfo->dwNumBlocks + chs.chs.head)
??????? * pFlashInfo->wSectorsPerBlock)+ chs.chs.sector - 1;

return lba;
}

如果分區的格式有只讀屬性,則通過WriteLogicalNumbers()函數寫分區的Sectorinfo,把這部分空間保護起來。

static BOOL WriteLogicalNumbers (DWORD dwStartSector, DWORD dwNumSectors, BOOL fReadOnly)

{

??? DWORD dwNumSectorsWritten = 0;

?

??? DWORD dwPhysSector = Log2Phys (dwStartSector);

??? DWORD dwBlockNum = dwPhysSector / g_FlashInfo.wSectorsPerBlock;

??? DWORD dwOffset = dwPhysSector % g_FlashInfo.wSectorsPerBlock;

???

??? while (dwNumSectorsWritten < dwNumSectors) {

?

??????? // If bad block, move to the next block

??????? if (IS_BLOCK_UNUSABLE (dwBlockNum)) {

??????????? dwBlockNum++;

??????????? continue;

??????? }

?

??????? memset (g_pbBlock, 0xff, g_dwDataBytesPerBlock);

??????? memset (g_pSectorInfoBuf, 0xff, sizeof(SectorInfo) * g_FlashInfo.wSectorsPerBlock);

??????? // No need to check return, since a failed read means data hasn't been written yet.

??????? ReadBlock (dwBlockNum, g_pbBlock, g_pSectorInfoBuf);

??????? if (!FMD_EraseBlock (dwBlockNum)) {

??????????? return FALSE;

??????? }

?

??????? DWORD dwSectorsToWrite = g_FlashInfo.wSectorsPerBlock - dwOffset;

??????? PSectorInfo pSectorInfo = g_pSectorInfoBuf + dwOffset;

?

??????? // If this is the last block, then calculate sectors to write if there isn't a full block to update

??????? if ((dwSectorsToWrite + dwNumSectorsWritten) > dwNumSectors)

??????????? dwSectorsToWrite = dwNumSectors - dwNumSectorsWritten;

???????

??????? for (DWORD iSector = 0; iSector < dwSectorsToWrite; iSector++, pSectorInfo++, dwNumSectorsWritten++) {

??????????? // Assert read only by setting bit to 0 to prevent wear-leveling by FAL

??????????? if (fReadOnly)

??????????????? pSectorInfo->bOEMReserved &= ~OEM_BLOCK_READONLY;

??????????? // Set to write completed so FAL can map the sector?

??????????? pSectorInfo->wReserved2 &= ~SECTOR_WRITE_COMPLETED;???????

??????????? // Write the logical sector number

??????????? pSectorInfo->dwReserved1 = dwStartSector + dwNumSectorsWritten;???????????

??????? }

??????? if (!WriteBlock (dwBlockNum, g_pbBlock, g_pSectorInfoBuf))

??????????? return FALSE;

???????

??????? dwOffset = 0;

??????? dwBlockNum++;

??? }

??? return TRUE;

}

這就是為什么系統啟動后,我們無法寫入文件的BINFS文件系統格式分區的原因了。而FAT格式就可以。最后調用WriteMBR()完全MBR的寫入,分區完畢。

讓我們繼續回到BP_OpenPartition函數中,如果從一開始IsValidMBR()就檢測到有效的MBR,GetPartitionTableIndex(dwPartType, fActive, &dwPartIndex);獲得分區表。和dwPartIndex分區表的索引號。

static BOOL GetPartitionTableIndex (DWORD dwPartType, BOOL fActive, PDWORD pdwIndex)

{

??? PPARTENTRY pPartEntry = (PPARTENTRY)(g_pbMBRSector + PARTTABLE_OFFSET);

??? DWORD iEntry = 0;

???

??? for (iEntry = 0; iEntry < NUM_PARTS; iEntry++, pPartEntry++) {

??????? if ((pPartEntry->Part_FileSystem == dwPartType) && (((pPartEntry->Part_BootInd & PART_IND_ACTIVE) != 0) == fActive)) {

??????????? *pdwIndex = iEntry;

??????????? return TRUE;

??????? }

??????? if (!IsValidPart (pPartEntry)) {

??????????? *pdwIndex = iEntry;

??????????? return FALSE;

??????? }

??? }

?

??? return FALSE;

}

?

重要結構:PARTENTRY

// end of master boot record contains 4 partition entries

typedef struct _PARTENTRY {

??????? BYTE??????????? Part_BootInd;?????????? // If 80h means this is boot partition

??????? BYTE??????????? Part_FirstHead;???????? // Partition starting head based 0

??????? BYTE??????????? Part_FirstSector;?????? // Partition starting sector based 1

??????? BYTE??????????? Part_FirstTrack;??????? // Partition starting track based 0

??????? BYTE??????????? Part_FileSystem;??????? // Partition type signature field

??????? BYTE??????????? Part_LastHead;????????? // Partition ending head based 0

??????? BYTE??????????? Part_LastSector;??????? // Partition ending sector based 1

??????? BYTE??????????? Part_LastTrack;???????? // Partition ending track based 0

??????? DWORD?????????? Part_StartSector;?????? // Logical starting sector based 0

??????? DWORD?????????? Part_TotalSectors;????? // Total logical sectors in partition

} PARTENTRY;

分區表就是通過這個結構寫入MBR,起始地址,分區大小,分區格式,對應結構寫入MBR所在的Sector就可以了。在檢測有效分區時static BOOL IsValidPart (PPARTENTRY pPartEntry)

{

??? return (pPartEntry->Part_FileSystem != 0xff) && (pPartEntry->Part_FileSystem != 0);

}

就是通過對分區表文件系統格式的判斷了。

?

?

把NAND后面的空間,全部分為一個FAT格式的分區。

??? //

??? // create extended partition in whatever is left

??? //

??? hPartEx = BP_OpenPartition( (NK_START_BLOCK+1+BINFS_BLOCK) * PAGES_PER_BLOCK,

??????????????????????????????? NEXT_FREE_LOC,?? // (1024 - (NK_START_BLOCK+1+SECTOR_TO_BLOCK_SIZE(FILE_TO_SECTOR_SIZE(dwBINFSPartLength)))) * PAGES_PER_BLOCK,

??????????????????????????????? PART_DOS32,

??????????????????????????????? TRUE,

??????????????????????????????? PART_OPEN_ALWAYS);

?

??? if (hPartEx == INVALID_HANDLE_VALUE )

??? {

??????? EdbgOutputDebugString("*** WARN: StoreImageToBootMedia: Failed to open/create Extended partition ***/r/n");

??? }

?

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/hugohong/archive/2009/05/20/4204700.aspx

總結

以上是生活随笔為你收集整理的Eboot 中给nandflash分区实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

97品白浆高清久久久久久 | 国产伦精品一区二区三区… | 国产一级a毛片视频爆浆 | 久久久国产精品免费 | 欧美另类巨大 | 婷婷爱五月天 | 久久电影国产免费久久电影 | 91看片淫黄大片一级在线观看 | 人人添人人澡人人澡人人人爽 | 国产精品白虎 | 国产精品1区2区3区在线观看 | 婷婷色吧| 亚洲一区不卡视频 | 激情影院在线 | 欧美日韩一区二区视频在线观看 | av中文字幕第一页 | 亚欧洲精品视频在线观看 | 国产系列 在线观看 | 亚洲综合色视频 | 精品国产一区二区三区男人吃奶 | 欧美精品在线视频 | 亚洲精选视频在线 | 91入口在线观看 | 香蕉视频在线播放 | 亚洲国产午夜 | 69av视频在线观看 | 黄av免费| 五月开心婷婷 | 久久午夜国产精品 | 久久国产精品99精国产 | 99久久精品国产亚洲 | 黄色特一级片 | 日本资源中文字幕在线 | 午夜久久久影院 | 国产精品日韩欧美 | 久久精品久久99精品久久 | 国产又粗又硬又爽的视频 | 日韩中文字幕免费看 | 91麻豆国产福利在线观看 | 国产成人在线观看免费 | 精品免费观看 | 93久久精品日日躁夜夜躁欧美 | 国产精品久久久久影视 | 日韩在线观看视频一区二区三区 | 国产一区在线不卡 | 日韩中文字幕a | 免费看黄色小说的网站 | 激情久久小说 | 在线精品视频免费播放 | 中文字幕中文字幕在线中文字幕三区 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 午夜国产福利视频 | 97人人爽人人| 97在线观| 欧美福利视频 | 免费进去里的视频 | 国产字幕av | 人人干人人做 | 18久久久久 | 日韩免费三级 | 91.麻豆视频| 国产视频资源在线观看 | 99国产在线观看 | 国产精品美女免费 | 深爱激情五月婷婷 | av片子在线观看 | 亚洲免费精彩视频 | 天天干天天做 | 欧美日韩不卡在线视频 | 免费在线激情电影 | 亚洲精品一区二区久 | 深夜国产福利 | 国产主播大尺度精品福利免费 | 欧美尹人 | 亚洲高清在线精品 | 综合婷婷丁香 | 一级黄色在线免费观看 | 亚洲成人动漫在线观看 | 亚洲国产成人久久 | 正在播放日韩 | 最近免费在线观看 | 国产传媒中文字幕 | 国产黄色美女 | 91av视频网站 | 婷婷亚洲五月色综合 | 欧美日韩裸体免费视频 | 一区二区视频免费在线观看 | 欧美日韩观看 | 日日夜夜天天久久 | 久久精品久久精品久久39 | 国产第一页福利影院 | 国产男女免费完整视频 | 国产高清视频免费在线观看 | 日韩精品一区二区三区水蜜桃 | 1区2区视频 | 日本特黄一级片 | 中文字幕黄色网址 | 欧美国产三区 | 国产精品久久久久久久久久三级 | 中文字幕亚洲字幕 | 亚洲va欧美va| 91亚洲精品久久久蜜桃网站 | 麻豆久久 | 日韩三级中文字幕 | 在线观看视频国产 | 天天摸日日操 | 国产精品av电影 | 91日本在线播放 | 婷婷久久综合九色综合 | 1024在线看片 | 少妇av片 | 成人啪啪18免费游戏链接 | 婷婷丁香六月 | 在线电影日韩 | 91精品久久久久久久久久久久久 | 最近中文字幕在线播放 | 99电影456麻豆| 亚洲综合色丁香婷婷六月图片 | 色五婷婷 | 午夜精品一二三区 | 丁香 婷婷 激情 | 成人久久视频 | 色福利网 | 91天堂素人约啪 | 91视频传媒| www蜜桃视频 | 高清中文字幕 | 中文字幕亚洲欧美日韩 | 欧美日韩高清一区二区 | 亚洲成人xxx | 国产国语在线 | 人人插人人射 | 久久香蕉一区 | 91桃色在线播放 | 成年人视频免费在线播放 | 91精品网站在线观看 | 在线播放亚洲 | av 在线观看 | 国产区精品视频 | 日韩丝袜| 亚洲精品456在线播放乱码 | 激情六月婷婷久久 | 久草www | www.色就是色 | 久久综合狠狠综合久久激情 | 黄色av一区二区三区 | 色综合五月 | 操操操操网 | 成人a在线观看高清电影 | 亚洲一级久久 | 九九九在线观看 | 欧美日韩免费在线视频 | 国产美女在线精品免费观看 | 亚洲天天摸日日摸天天欢 | 亚洲另类视频在线观看 | 欧洲色综合 | 美女av在线免费 | 精品一区 在线 | 在线电影a | 亚洲精品美女在线观看播放 | 日韩在线免费高清视频 | 久久成人人人人精品欧 | 日韩精品一区二区免费视频 | 亚洲在线高清 | 九九爱免费视频在线观看 | 国产精品一区二区视频 | 人人干网站 | 91大神精品视频在线观看 | 国产精品人人做人人爽人人添 | 美女很黄免费网站 | 日本xxxxav| 亚洲久在线 | 久久免费国产精品1 | 成人午夜黄色 | 国产午夜精品福利视频 | 免费情趣视频 | 一级α片 | 天天干,夜夜爽 | 人操人 | 九九九视频在线 | 日日夜日日干 | 日韩在线短视频 | 麻豆视频在线播放 | 久久精品激情 | 久久久99精品免费观看 | av中文字幕网站 | 国产福利91精品一区 | 日本最大色倩网站www | 成人h视频 | 综合色狠狠| 贫乳av女优大全 | 精品久久久久久久久久岛国gif | 免费观看国产成人 | 欧美一级激情 | 中文在线字幕免 | 亚洲高清视频在线 | 免费av网站在线看 | 国产短视频在线播放 | 国产一区二区三区网站 | 超碰97网站 | 亚洲精品www久久久久久 | 日本xxxx.com | 成年人在线免费看视频 | 亚洲 欧美 成人 | 国内视频一区二区 | 五月天天av | 三级av免费看 | 日韩久久久 | 丁香婷婷久久久综合精品国产 | 国产成人1区 | 中文高清av | 免费男女羞羞的视频网站中文字幕 | 特级西西444www大精品视频免费看 | 在线精品视频免费播放 | 日韩午夜精品 | 久久久久久草 | 国产高清不卡av | 久久婷婷五月综合色丁香 | 成人丁香花 | 中文字幕第一页在线播放 | 免费看精品久久片 | 色婷婷骚婷婷 | 在线观看中文字幕第一页 | 亚洲一区二区高潮无套美女 | 久久精品久久精品久久39 | 久久影视中文字幕 | 成人国产在线 | 福利网在线 | av网址最新| 日韩av不卡播放 | 国产在线色站 | 日韩一区二区三区视频在线 | 国产无吗一区二区三区在线欢 | av大片免费在线观看 | 久久99视频精品 | 四虎亚洲精品 | 五月婷婷色 | 国产精品久久99综合免费观看尤物 | 99热这里精品 | 欧美人牲| 久在线观看视频 | 五月婷婷丁香在线观看 | 91九色综合 | 日韩精品免费一区二区三区 | 国产亚洲精品日韩在线tv黄 | 日韩在线播放av | 亚洲午夜久久久久 | 色多多污污 | 国产亚洲一级高清 | 国产成人精品亚洲精品 | 亚洲最快最全在线视频 | 国产精品手机在线播放 | 97精品在线视频 | 香蕉视频在线免费 | 国产黄在线播放 | 免费高清在线观看成人 | 欧美另类重口 | 精品超碰 | 四虎亚洲精品 | 91精品一区在线观看 | 欧美综合在线视频 | 五月天亚洲婷婷 | 99在线观看| 波多在线视频 | 国产精品女 | 亚洲涩涩网站 | 碰超在线观看 | 水蜜桃亚洲一二三四在线 | 久久观看| 九九热只有精品 | 97在线精品国自产拍中文 | 干 操 插 | 天天色综合1 | 伊人五月天综合 | 久久亚洲欧美 | 在线 国产 亚洲 欧美 | 亚洲一区二区观看 | 成人理论电影 | 日韩精品在线免费观看 | 99久久精品无码一区二区毛片 | 国产在线 一区二区三区 | 99精品免费久久久久久久久 | 91视频88av | 91精品999 | 精品在线观看免费 | 色片网站在线观看 | 成 人 免费 黄 色 视频 | 日韩免费看片 | 色婷婷av在线 | 在线观看91av | 青青河边草观看完整版高清 | 91av网址| 九九热免费视频在线观看 | 欧美日韩视频一区二区三区 | 人人视频网站 | 日韩欧美成 | 国产精品午夜在线 | 免费观看性生活大片 | 日韩网站一区二区 | 米奇四色影视 | 日批视频国产 | 蜜臀av在线一区二区三区 | 国产成免费视频 | 人成电影网 | 国产精品一区久久久久 | 免费在线观看成人 | 国产精品一区二 | 97色在线观看 | 成人黄色电影在线观看 | 中文字幕日韩无 | 激情欧美一区二区免费视频 | 久久新| 天天操夜夜干 | 99久久www免费 | 成人91在线观看 | 九九视频网 | 国产一区二区在线精品 | 日韩高清一二三区 | 中文字幕成人av | 日日夜夜国产 | 999国内精品永久免费视频 | 丁香国产视频 | 久久 在线 | 激情五月六月婷婷 | 国产精品一区二区三区四 | 欧洲一区二区三区精品 | 亚洲精品视频大全 | 九九色在线 | 超碰人人在线观看 | 三级av免费 | .国产精品成人自产拍在线观看6 | 成人av在线播放网站 | 久久国产精品免费一区二区三区 | 97人人精品| 日日干激情五月 | 亚洲最大av网 | 亚洲视频第一页 | 久久99在线观看 | 国产成人av电影在线观看 | 免费欧美 | 国产精品专区h在线观看 | 中文字幕影视 | 日韩欧美一区二区三区在线 | 国产91精品久久久久久 | 日韩视频三区 | 日韩在线观 | 日韩网站在线播放 | 激情丁香久久 | 色噜噜日韩精品一区二区三区视频 | 丁香激情网| 久久婷婷激情 | 免费在线观看国产精品 | 日韩高清av| 国产午夜精品理论片在线 | 色网站在线免费观看 | 97免费视频在线 | 91欧美精品| 久久久99精品免费观看app | 97视频在线免费播放 | 韩国av一区 | 久久视影 | 日韩欧美综合精品 | 国产精品破处视频 | 蜜桃av人人夜夜澡人人爽 | 婷婷色av| 一区二区三区电影在线播 | 91精品啪在线观看国产 | 午夜视频在线观看一区二区三区 | 国产精品一区免费在线观看 | 中文字幕精品www乱入免费视频 | 国产精品一区二区三区免费看 | 日日躁夜夜躁aaaaxxxx | 日韩欧美电影 | 亚洲综合婷婷 | 久久久久久高潮国产精品视 | 美女视频黄在线 | 久久九九精品久久 | 国产精品久久久久久一二三四五 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 天天色天天骑天天射 | 精品不卡视频 | 国产999免费视频 | 国产尤物在线 | 玖玖爱免费视频 | 2019中文 | 日韩网站免费观看 | 嫩草91影院 | 最近2019中文免费高清视频观看www99 | 香蕉91视频| 成人免费精品 | www.国产精品 | 国产精品久久免费看 | 午夜手机看片 | 中文字幕乱码日本亚洲一区二区 | 美女视频网站久久 | 久久九九影视网 | 97在线观看免费高清完整版在线观看 | 国产精品久久久久久a | 深爱激情开心 | 日日干视频 | 麻豆免费在线播放 | 国产精品成人久久 | 九九热在线精品视频 | 久久久久国产成人精品亚洲午夜 | 深爱婷婷久久综合 | 91成人精品国产刺激国语对白 | 欧美天堂久久 | 国产亚洲视频在线免费观看 | 国产小视频免费在线观看 | 91在线免费观看网站 | 91精品一 | 久久精品8| 婷婷中文字幕在线观看 | 中文网丁香综合网 | 久久国产精品久久精品国产演员表 | 亚洲欧洲精品一区二区精品久久久 | 一区在线电影 | 九九亚洲精品 | 久久久999免费视频 日韩网站在线 | 日韩成人中文字幕 | 久久免费av电影 | 国产丝袜美腿在线 | 91亚洲精品国产 | 亚洲欧美经典 | 五月婷婷在线观看视频 | 亚洲高清视频一区二区三区 | 操操操com | 免费看黄20分钟 | 久久九九免费视频 | 精品亚洲男同gayvideo网站 | av中文天堂在线 | 福利久久久 | 久久久久久久久久电影 | 五月婷综合网 | 日韩欧美国产激情在线播放 | 日韩有色| 亚洲综合干| a黄色片| 久久99热这里只有精品 | 激情五月婷婷综合网 | 精品免费一区二区三区 | 久久精品99国产精品酒店日本 | 久草热视频 | 久草视频播放 | 特级西西444www大胆高清无视频 | 久久综合亚洲鲁鲁五月久久 | 一级黄色毛片 | 婷婷四房综合激情五月 | 蜜桃视频日本 | 日韩久久一区二区 | 91探花国产综合在线精品 | 久久久黄视频 | 久章草在线观看 | 日韩在线观看你懂的 | 国产96精品| 香蕉精品在线观看 | 色在线中文字幕 | 国产精品欧美一区二区三区不卡 | 久草香蕉在线视频 | 色综合天 | 狠狠干狠狠插 | 免费久久网 | 国产精品av在线免费观看 | 亚洲一区二区三区在线看 | 亚洲 欧美 变态 国产 另类 | 国产不卡在线看 | 久久电影网站中文字幕 | 国内精品免费久久影院 | 成人午夜黄色 | 久久久久久免费毛片精品 | 午夜色影院| 亚洲专区中文字幕 | 欧美另类巨大 | 国产精品久免费的黄网站 | 精品视频在线视频 | 香蕉视频4aa| 一区中文字幕在线观看 | 在线色亚洲 | 在线成人短视频 | 亚洲国产av精品毛片鲁大师 | 日日操日日插 | 97成人啪啪网 | 国产在线观看免费观看 | 碰超在线97人人 | 久草99| 69久久夜色精品国产69 | 日本久久99 | 麻豆视频免费播放 | www.色com| 国产护士在线 | 夜夜天天干| 国产裸体永久免费视频网站 | 久久国语| 亚州黄色一级 | 丝袜美腿在线视频 | 黄色毛片视频 | 片网站| 六月色丁香 | 日韩激情综合 | 337p日本大胆噜噜噜噜 | 激情偷乱人伦小说视频在线观看 | 色婷婷av一区二 | 欧美日韩观看 | 欧美日韩中文字幕综合视频 | 色天天中文 | 亚洲成人午夜av | 亚洲精品国偷拍自产在线观看 | 91麻豆精品国产91久久久更新时间 | 久热精品国产 | 免费av福利 | 亚洲精品网址在线观看 | 欧美日韩国产一区二区在线观看 | 欧美国产日韩一区二区 | 五月天丁香 | 蜜臀av性久久久久av蜜臀妖精 | 天天爱天天射 | 日本久久久久久久久久 | 欧美福利视频 | 日韩欧美亚州 | 精品美女视频 | 中文字幕在线观看一区二区 | 在线观看中文字幕av | 日韩免费视频线观看 | 2022国产精品视频 | 久久美女高清视频 | 国产丝袜在线 | 国产区精品视频 | 91九色自拍| 天天插综合 | 中文字幕电影网 | 黄a网站 | 国产黄色视 | 日韩精品中文字幕在线 | 国产二区免费视频 | 亚洲激情在线播放 | 亚洲日日射 | 亚洲精品视频免费在线观看 | 欧美日韩高清在线观看 | 日本久久精品 | 毛片网站免费在线观看 | 手机av电影在线 | 亚洲色图av | 月丁香婷婷 | 性色av一区二区三区在线观看 | 国内小视频在线观看 | 伊人色综合久久天天 | 成人午夜网 | 免费在线观看av网址 | 欧美在线观看视频一区二区 | 99re久久精品国产 | 人人爽人人澡人人添人人人人 | 国产中文欧美日韩在线 | 欧美一级视频一区 | 一区二区三区在线观看免费视频 | 在线观看av小说 | 日本精品久久久久久 | 亚洲欧美婷婷六月色综合 | 精品色999| 成人免费在线视频 | 欧美极品少妇xxxx | 国产最新91| 一本一本久久a久久精品综合 | 人人舔人人插 | 日韩在线视频播放 | 欧美动漫一区二区三区 | 五月天综合在线 | 午夜精品电影 | 国产一级黄色电影 | 高清av在线 | 黄色视屏在线免费观看 | 91九色porn在线资源 | 色婷婷av一区二 | 在线观看亚洲精品 | 国产精品一区二区久久国产 | 五月婷婷毛片 | 日韩美在线 | 亚洲国产免费看 | 91视频免费国产 | 国产精品久久久久一区二区三区共 | 国产精品系列在线观看 | 亚洲视频www | 日本中文字幕网址 | 亚洲国产欧洲综合997久久, | 日本精品视频网站 | 成人免费观看av | 国产精品乱码久久久 | 五月婷婷六月丁香在线观看 | 亚洲精品乱码久久久久久久久久 | 在线欧美最极品的av | 91精品国产亚洲 | 日韩免费在线观看网站 | 精品久久久久国产免费第一页 | 国产高清不卡av | 少妇bbw搡bbbb搡bbb | 天天操天天操天天操天天 | 探花视频在线观看+在线播放 | 全久久久久久久久久久电影 | 日本中文字幕一二区观 | 国产精品12345 | av成人免费观看 | 精品在线99| www看片网站 | 免费在线观看国产黄 | 日韩毛片精品 | 亚洲片在线 | 久草精品电影 | 日韩视频精品在线 | 九色视频网 | 免费看的黄色 | 亚洲无吗av | 黄色www免费| 99久久久久国产精品免费 | 久久久免费毛片 | 日韩在线观看视频中文字幕 | 在线观看国产 | 狠狠激情中文字幕 | 丁香久久五月 | www免费网站在线观看 | 在线观看视频黄色 | 毛片一二区 | 国产精品久久久777 成人手机在线视频 | 国产精品自在欧美一区 | 亚洲婷婷伊人 | 亚洲一区 av | 亚洲日本中文字幕在线观看 | 中文av在线播放 | 992tv在线 | 欧美色操| 国产综合精品一区二区三区 | 99综合电影在线视频 | 91黄色视屏| 欧美日韩一区久久 | 国产资源 | 国产伦精品一区二区三区… | 精品色综合 | 久草精品视频在线观看 | 日韩字幕| 久久国产精品免费一区二区三区 | 9999精品视频 | 日韩午夜av| 日韩久久久 | 在线观看一区 | 免费久久网站 | 国产精品久久久电影 | 国产一区二区在线影院 | 91亚洲国产成人久久精品网站 | 六月丁香婷婷在线 | 国产成人免费在线观看 | 97中文字幕| 在线国产一区二区 | 97日日 | 深爱激情五月婷婷 | 久久五月天综合 | 91精彩视频在线观看 | 国产午夜精品福利视频 | 九九欧美 | 在线观看久草 | 成片人卡1卡2卡3手机免费看 | 国产精品婷婷 | 亚洲男人天堂2018 | 亚洲欧美日韩国产一区二区三区 | 香蕉久草 | 国产区在线 | 亚洲在线精品视频 | 在线草 | 天天色天天射天天综合网 | 岛国一区在线 | 国产高清在线a视频大全 | 国产一区av在线 | 一区二区三区播放 | 天天操夜夜操天天射 | 日韩黄色免费在线观看 | 中文字幕国内精品 | 日韩在线不卡视频 | 77国产精品 | 精品人人爽 | 亚洲女裸体 | 成人av网站在线观看 | 欧美国产三区 | 激情小说 五月 | 免费毛片一区二区三区久久久 | 欧美精品一区二区三区四区在线 | 最新极品jizzhd欧美 | 狠狠的操你 | 99精品欧美一区二区 | 日本三级国产 | 日韩视频1区 | 久久久久成人免费 | 五月婷婷综合网 | 国产一区二区三区在线免费观看 | 区一区二区三在线观看 | 亚洲国产欧美一区二区三区丁香婷 | 91系列在线 | 日韩,中文字幕 | 久久av一区二区三区亚洲 | 日韩激情免费视频 | 四虎精品成人免费网站 | 日韩三级视频在线观看 | 麻豆视频免费看 | 国产精品日韩在线播放 | 中文字幕国产一区二区 | 国产精品欧美久久久久久 | 99成人精品| 中文字幕第 | 天天激情在线 | 日韩在线第一区 | 国产玖玖精品视频 | 国内精品久久久久久久影视简单 | 国产精品9999久久久久仙踪林 | 免费日韩 精品中文字幕视频在线 | 天天干,天天射,天天操,天天摸 | 精品欧美乱码久久久久久 | 黄色一级在线观看 | 久久综合婷婷国产二区高清 | 日韩电影在线观看一区 | 亚洲国产精品小视频 | 色婷婷综合久色 | 亚洲va综合va国产va中文 | 一级片观看| 亚洲春色综合另类校园电影 | 狠狠狠色丁香婷婷综合久久五月 | 国产在线观看免费 | 中文字幕首页 | 亚洲精品欧美精品 | 久久久久成人精品免费播放动漫 | 国产一区二区精品在线 | 999视频网| 精品久久久久久综合日本 | 黄色毛片观看 | 日日草av| 欧美日韩精品在线一区二区 | 伊人手机在线 | 久久av中文字幕片 | 在线观看色网站 | 精品主播网红福利资源观看 | 成人国产综合 | 日韩欧美一区视频 | 国产精品久久久区三区天天噜 | av线上免费观看 | 国产精品一区二区三区在线免费观看 | 999久久a精品合区久久久 | 国产99久久久国产精品免费二区 | 日本一区二区不卡高清 | 日韩区欠美精品av视频 | 久久免费精品视频 | 人人舔人人插 | 久草在线看片 | 久久超级碰 | 日韩成人免费在线观看 | 中文字幕丝袜 | 日韩在线观看三区 | 国产视频中文字幕 | 91精品视频一区 | 中文字幕在线观看第一区 | 国产精品99久久久久久小说 | 久久亚洲区| 国产精品mm | 女人18片毛片90分钟 | 久久精品首页 | 香蕉影院在线观看 | 国产99免费视频 | 精品一区二区三区久久久 | 一级精品视频在线观看宜春院 | 国产一区二区在线免费 | 久久成人国产精品一区二区 | 久热超碰 | 麻豆视频国产在线观看 | 久草资源在线观看 | av在线不卡观看 | 香蕉精品视频在线观看 | 综合网伊人 | 97视频人人澡人人爽 | 韩日电影在线 | 91视频观看免费 | 在线亚洲观看 | 久草资源免费 | 久久激情综合 | 在线免费试看 | 亚洲第一区在线播放 | 国产精品刺激对白麻豆99 | 日本黄色免费大片 | 久久欧洲视频 | 日韩在线资源 | 成年人免费看片网站 | 99在线精品免费视频九九视 | a黄在线观看 | 麻豆传媒在线视频 | 青青河边草免费 | 中文字幕在线一区二区三区 | 91视频久久| 久久a热6| 操操操影院 | 最新午夜 | 日韩欧美精品在线视频 | 91最新在线 | 天天激情天天干 | 日韩理论影院 | 久久国色夜色精品国产 | 国产剧情一区二区在线观看 | 国产分类视频 | 国产馆在线播放 | 成人夜晚看av | 97在线资源 | 久久免费视频精品 | japanesexxxhd奶水| 国产精品美女久久久久久久 | va视频在线观看 | 久久免费精品国产 | 日韩视频免费在线 | 在线日本看片免费人成视久网 | 国产精品女人久久久久久 | 久久午夜国产 | 日韩试看 | 337p日本欧洲亚洲大胆裸体艺术 | 精品九九九 | 日夜夜精品视频 | 国产成人精品一区二区三区免费 | 99精品免费久久久久久久久日本 | 91片黄在线观 | 国产人成精品一区二区三 | 日韩久久激情 | 中文字幕在线看视频国产 | 日韩av有码在线 | 日批视频 | 亚洲欧美va | 中文字幕国产亚洲 | 成人在线观看免费视频 | 国产视频亚洲视频 | 久久新视频 | 久草手机视频 | 亚洲精区二区三区四区麻豆 | 人人揉人人揉人人揉人人揉97 | 午夜精品一二三区 | 中文字幕亚洲不卡 | 午夜丁香视频在线观看 | 久久一区二区三区超碰国产精品 | 免费手机黄色网址 | 人人爽久久久噜噜噜电影 | 国产视频久久 | 一区三区在线欧 | 手机av在线免费观看 | 国产91丝袜在线播放动漫 | 久久伊人操 | 一区二区三区免费在线观看 | 亚洲高清激情 | 天天天在线综合网 | www.69xx| 亚洲免费av网站 | 中文一区在线观看 | 美女黄频| 狠狠网| 久久麻豆视频 | 91久久一区二区 | 亚洲最新视频在线播放 | 美腿丝袜一区二区三区 | 久久在视频 | 欧美成人精品在线 | 亚洲九九爱 | aaaaaa毛片| 色99中文字幕 | 国产美女视频免费 | 国产成人中文字幕 | 国产91精品看黄网站在线观看动漫 | 国产精品一区二区免费视频 | 十八岁以下禁止观看的1000个网站 | av亚洲产国偷v产偷v自拍小说 | 欧美 亚洲 另类 激情 另类 | 国产综合视频在线观看 | 毛片永久新网址首页 | 欧美日韩不卡一区二区 | 日韩特级毛片 | 狠狠色综合网站久久久久久久 | 九九热在线观看 | 免费高清在线视频一区· | 精品久久久久久亚洲综合网站 | 久久久久久久久艹 | 在线观看日韩视频 | 99操视频 | 五月的婷婷 | 久久久精品午夜 | 国产视 | 久久久久久久久久久久电影 | 97激情影院 | 四虎国产精 | av在线短片 | 国产精品久久久久久婷婷天堂 | 黄色资源在线观看 | 久久 亚洲视频 | 国产亚洲婷婷 | 99久久婷婷国产综合精品 | 人人插人人艹 | 亚洲综合爱 | 99热99re6国产在线播放 | 免费观看完整版无人区 | av免费片| 又湿又紧又大又爽a视频国产 | 美女av在线免费 | 97在线观看免费视频 | 日本夜夜草视频网站 | 黄色亚洲片 | 免费日韩精品 | 久久成人人人人精品欧 | 国产群p视频 | 欧洲精品在线视频 | 欧美a级片免费看 | 夜夜操夜夜干 | 亚洲视频精品在线 | 二区三区av | 欧美日韩国内在线 | 久久久久久久久久网站 | 99免费| 国产在线播放一区二区 | 久久精品视频中文字幕 | 在线观看av国产 | 青青啪| 欧美精品一区二区三区一线天视频 | 中文字幕乱码电影 | 精品久久一区 | 三上悠亚在线免费 | 一本一道久久a久久精品 | 最新国产精品久久精品 | aⅴ视频在线 | 久久成年人网站 | 91精品国产91久久久久福利 | 亚洲免费av片 | 日批视频在线播放 | 丁香六月色 | 久久国产精品小视频 | 女人18毛片90分钟 | 国产成人精品一区二区三区福利 | 韩国一区视频 | 五月激情亚洲 | 国产在线色站 | 婷婷久久综合九色综合 | 丁香六月久久综合狠狠色 | 久久五月精品 | 91禁在线看| 91精品久久久久久久久久久久久 | 成人在线黄色 | 91精品在线看 | 夜夜操夜夜干 | 久久免费黄色大片 | 国产中文字幕一区二区 | 91精品在线免费视频 | 国产福利网站 | 一区二区丝袜 | 婷婷色六月天 | www.夜夜操.com | 午夜在线免费观看视频 | 91成人免费在线视频 | 久久天堂精品视频 | 国产一区在线免费观看 | 欧美一级电影在线观看 | 全久久久久久久久久久电影 | 久久久久二区 | 国产在线视频在线观看 | 久久综合射 | 久久影视一区二区 | 久久五月婷婷丁香 | 精品国产乱子伦一区二区 | 亚洲综合色av | 午夜丁香网 | 在线国产专区 | 黄色不卡av| 日韩一区二区三区高清在线观看 | 亚洲专区在线视频 | 日韩av一区二区三区在线观看 | 在线视频日韩 | 国产成人久久精品亚洲 | 成人免费观看完整版电影 | 久久国产热视频 | 亚洲一区二区精品视频 | 91自拍视频在线 | 中文字幕亚洲欧美 | 国产成人免费av电影 | 亚洲丁香日韩 | 精品久久一二三区 | 国产精品成人免费精品自在线观看 | 国产精品系列在线 | 91在线产啪 | 91在线精品播放 | 国产精品自拍av | 在线免费黄 | 久久精品99国产精品酒店日本 | 欧美日韩中文在线 | 国产免费高清 | 在线观看亚洲免费视频 | 精品成人国产 | av成人动漫 | 国内精品久久久久国产 | 国产精品手机看片 | 久久久久福利视频 | 日韩视频一区二区 | 色吧av色av| 精品av在线播放 | 超碰免费久久 | 免费在线观看污网站 | 中文字幕在线日亚洲9 |