12909|44

88

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

怎么样才能使bootloader支持binfs? [复制链接]

最近想搞multi bin后来发现我的bootloader是优龙的,不支持binfs分区格式化,
我想把eboot下的代码移植过来,应该可以的。

但是我对则个binfs有点疑惑。按照道理说,binfs是针对nk.bin的,但是我们下载的时候却是nk.nb0,有些人下载nk.bin,但是下载完还是要解压成nk.nb0的。
我想问,binfs是怎么和nk.nb0联系起来的?

请大家指点。
这个问题还是有点意思的。

最新回复

hzdysymbol 说的 不是我们不想帮你,而是实在没有精力来研究你的贴子,看代码研究问题也很费时间的 给你一个思路: 1. 在bootloader中按正常的FAT格式格式化Image的分区 2. 读出这个分区的分区表,也就是第一个Sector,这个应该不能叫MBR,但CE里的代码是叫CreateMBR 3. 修改这个分区表的标志位成BINFS,记下分区的起始Sector,查一下PPARTENTRY结构体 4. 把生成出来的xip.bin文件烧到从起始Sector开始的位置 在开机的时候只需要读出前面XIPKernel大小的Image,然后跳转到相应的地址就OK了 可不可以提供一个MBR,的512的数字看看  详情 回复 发表于 2009-3-20 15:57
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
刚才上传那本书 没有讲到这个,我先看看PB帮助文档,代码,也许到一些外国网站转转会有收获的。
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
下载的时候是bin啊,下载的过程中解压的。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
nk.bin是烧写到NAND,是有压缩的,ce启动后将其解压到RAM里,这时RAM里与nk.nb0其实是一样的。
调试当中,有更改时不必要每次都烧写到NAND,build后通过usb将nk.nb0下载到RAM里执行,就可看到运行结果。
都没问题了,再将nk.bin烧写到NAND里。对我来说,nk.nb0只在调试时有用。
理论上如果NOR足够大,就可以直接下载nk.nb0到NOR,而且程序可以在NOR里运行,节省了RAM。
如果是用nk.nb0不用解压缩就可直接执行,如果是nk.bin就需要解压缩后才能执行。所以binfs跟是不用nk.bin,还是nk.nb0是没关系的。
在下载nk.bin的eboot里就有个FORMAT BINFS命令,将NAND格式成binfs,后面就是驱动要识别的问题。
你如果想实现binfs的话,一个办法是按照网上binfs实现方法的文章去改你的bsp。
还有就是找个别的开发板的已实现binfs的bsp试试。
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

5
 
移植 Windows CE 里面的 BootPart 驱动到 Bootloader 就行了。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 guetcw 的回复:
下载的时候是bin啊,下载的过程中解压的。


你使用eboot才是下载nk.bin
我是直接下载nk.nb0的。解压会下载很慢。

——我先尝试再说了。不行再来求救。
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 3 楼 arm7000 的回复:
nk.bin是烧写到NAND,是有压缩的,ce启动后将其解压到RAM里,这时RAM里与nk.nb0其实是一样的。
调试当中,有更改时不必要每次都烧写到NAND,build后通过usb将nk.nb0下载到RAM里执行,就可看到运行结果。
都没问题了,再将nk.bin烧写到NAND里。对我来说,nk.nb0只在调试时有用。
理论上如果NOR足够大,就可以直接下载nk.nb0到NOR,而且程序可以在NOR里运行,节省了RAM。
如果是用nk.nb0不用解压缩就可直接执行,如果是nk.…


binfs,是微软实现的啊。
bootloader只是格式化binfs分区而已。

binfs是专门针对NK的,和NK.nb0有密切关系。
我看看代码先,看他是怎么组织的。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
EBOOT一般有这个功能
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 
The following registry key example specifies that BinFS is the default file system:
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash]
   "DefaultFileSystem"="BINFS"——默认的文件系统怎么会是BINFS呢?据我所知,BINFS不是必须的,我以前就没有用它
   "PartitionDriver"="mspart.dll"
   "MountFlags"=dword:11
   "Folder"="NAND Flash"
   "Name"="FLASH Disk Block Device"
The following registry key example prevents FATFS from attempting to shadow the \Windows directory:

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MsFlash\FATFS]
   "MountFlags"=dword:0
A MountFlags value of dword:11 specifies that you mount the file system as an external ROM file system that shadows the \Windows directory. Eliminating the MountFlags value causes the \BINFS directory to be visible to the user. In both cases, you can access the BinFS contents using the \BINFS directory.——这红色字体的是什么意思?
是不是指windows文件夹挂载的是FAT还是binfs?

请大家提示一下。

 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

10
 
——————————————呜呜,很扫兴哦。要使bootloader支持binfs分区要用到微软不开源的库的。太郁闷了。
在PB帮助文档里面有
If a boot loader includes support for the binary ROM image file system (BinFS), the boot loader can partition, format, and write data to a specified media device. Through the Bootpart library, the boot loader writes to flash media. The boot loader uses the Bootpart library to create partitioning. This partitioning is necessary for both BinFS and another file system, such as FAT, to be flashed on the same media device. To accomplish partitioning, the boot loader uses the Bootpart library to create a BinFS partition along with an extended partition. The OS uses these partitions to create one or more data partitions inside of the extended partition. The extended partition is required because the OS cannot modify the master boot record (MBR) once the boot loader's Bootpart library partitions flash memory.

The Bootpart library can create a boot partition to store boot arguments. The flash memory blocks that contain the MBR sector, the BinFS memory region, and the boot arguments partition are marked as read-only. In addition, the BinFS and boot partitions are marked as read-only so that the partitions cannot be formatted or deleted.

Bootpart enables code for a Flash Media Driver (FMD) to be abstracted from the boot loader. The boot loader creates the partition and reads or writes to the partition by specifying a byte offset into the partition, as well as a length value. Bootpart can also perform a low level format on the flash media.

To support BinFS, your boot loader must link to the Bootpart library located in the %_WINCEROOT%\Public\Common\Oak\Drivers\EthDbg\Bootpart directory.

For more information on the Bootpart library see, Bootpart Library Functions. You can view a sample boot loader that supports BinFS in the %_WINCEROOT%\Platform\SMDK2410\Eboot directory.

看看去,如果不行,就找找PB6.0看看,6.0应该开源了。

和微软过不去,使用ADS的bootloader,果然会吃亏啊。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

11
 
移植未必没有希望,貌似已经开源了。
找到C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BOOTPART
看看BOOTPART下面的sources
=============================================================
!if 0
Copyright (c) Microsoft Corporation.  All rights reserved.
!endif
!if 0
Use of this source code is subject to the terms of the Microsoft end-user
license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
If you did not accept the terms of the EULA, you are not authorized to use
this source code. For a copy of the EULA, please see the LICENSE.RTF on your
install media.
!endif
!IF 0


Module Name:

    sources.

Abstract:

    This file specifies the target component being built and the list of
    sources files needed to build that component.  Also specifies optional
    compiler switches and libraries that are unique for the component being
    built.

!ENDIF

TARGETNAME=bootpart
TARGETTYPE=LIBRARY
CDEFINES=$(CDEFINES) -DIN_KERNEL -DWINCEMACRO -DCOREDLL
NOMIPS16CODE=1


SOURCES=bootpart.cpp \
        util.cpp

INCLUDES=$(_PUBLICROOT)\common\oak\drivers\block\msflashfmd\inc


——从这个看来,这个bootpart并没有连接什么库。
所以机会还是有的。
刚开始我以为这个给增加binfs分区很简单。自己制定计划说一个月把ADS增加此功能,并且实现multi bin功能。
............
继续看代码吧。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

12
 
呵呵,向你学习来了
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 10 楼 gooogleman 的回复:
移植未必没有希望,貌似已经开源了。
找到C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BOOTPART
看看BOOTPART下面的sources
=============================================================
!if 0
Copyright (c) Microsoft Corporation.  All rights reserved.
!endif
!if 0
Use of this source code is subject to the terms of the Microsoft end-user
license agreement (EULA) under which you licens…

是的,开源了,里面什么信息都有。。。。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

14
 
这个binfs的功能就是实现NK的分步加载而已,并没有实现什么存储功能,其实也没有必要。
现在我先修改bootloader先,过几天再来看看binfs是怎么实现的,在启动的时候是怎么实现分步加载的。
估计binfs里面是一些分析、读写NK.nb0文件的函数。
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(初级)

15
 
/********************************************************************************************
再来接力------------
==================================
刚才我看了一下eboot中9) Format Boot Media for BinFS这个菜单的实现过程,
发现在这个过程中调用了BP_LowLevelFormat这个函数实现,这个函数决定了NK存放的起始block,并且把MBR写
入到这个block中。现在我把代码贴出来给大家分析一下。
*********************************************************************************************/



/*  BP_LowLevelFormat
*
*  Called when preparing flash for a multiple-BIN download.
*  Erases, verifies, and writes logical sector numbers in the range to be written.
*
*  ENTRY
*      dwStartBlock - starting physical block for format
*      dwNumBlocks - number of physical blocks to format
*      dwFlags - Flags used in formatting.
*
*  EXIT
*      TRUE returned on success and FALSE on failure.
*/

BOOL BP_LowLevelFormat(DWORD dwStartBlock, DWORD dwNumBlocks, DWORD dwFlags)
{
    dwNumBlocks = min (dwNumBlocks, g_FlashInfo.dwNumBlocks);

    RETAILMSG(1,(TEXT("Enter LowLevelFormat [0x%x, 0x%x].\r\n"), dwStartBlock, 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;

        // Create an MBR.
    CreateMBR();

    RETAILMSG (1, (TEXT("Done.\r\n\r\n")));
    return(TRUE);
}

//我对这个函数的疑问是为什么,这个MBR要写入到存放NK之前的block?在微软的白皮书中是存放在FAT区域的第一个block的?
//哪位高人来指点一下啊,谢谢。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
  1. /********************************************************************************************
  2. 再来接力------------
  3. ==================================
  4. 刚才我看了一下eboot中[color=#FF0000]9) Format Boot Media for BinFS[/color]这个菜单的实现过程,
  5. 发现在这个过程中调用了BP_LowLevelFormat这个函数实现,这个函数决定了NK存放的起始block,并且把MBR写
  6. 入到这个block中。现在我把代码贴出来给大家分析一下。
  7. *********************************************************************************************/



  8. /*  BP_LowLevelFormat
  9. *
  10. *  Called when preparing flash for a multiple-BIN download.
  11. *  Erases, verifies, and writes logical sector numbers in the range to be written.
  12. *
  13. *  ENTRY
  14. *      dwStartBlock - starting physical block for format
  15. *      dwNumBlocks - number of physical blocks to format
  16. *      dwFlags - Flags used in formatting.
  17. *
  18. *  EXIT
  19. *      TRUE returned on success and FALSE on failure.
  20. */

  21. BOOL BP_LowLevelFormat(DWORD dwStartBlock, DWORD dwNumBlocks, DWORD dwFlags)
  22. {
  23.     dwNumBlocks = min (dwNumBlocks, g_FlashInfo.dwNumBlocks);

  24.     RETAILMSG(1,(TEXT("Enter LowLevelFormat [0x%x, 0x%x].\r\n"), dwStartBlock, dwStartBlock + dwNumBlocks - 1));

  25.     // Erase all the flash blocks.
  26.     if (!EraseBlocks(dwStartBlock, dwNumBlocks, dwFlags))
  27.         return(FALSE);

  28.     // Determine first good starting block
  29.     while (IS_BLOCK_UNUSABLE (dwStartBlock) && dwStartBlock < g_FlashInfo.dwNumBlocks) {
  30.         dwStartBlock++;
  31.     }

  32.     if (dwStartBlock >= g_FlashInfo.dwNumBlocks) {
  33.         RETAILMSG(1,(TEXT("BP_LowLevelFormat: no good blocks\r\n")));        
  34.         return FALSE;
  35.     }

  36.     // MBR goes in the first sector of the starting block.  This will be logical sector 0.
  37.     g_dwMBRSectorNum = dwStartBlock * g_FlashInfo.wSectorsPerBlock;

  38.         // Create an MBR.
  39.     CreateMBR();

  40.     RETAILMSG (1, (TEXT("Done.\r\n\r\n")));
  41.     return(TRUE);
  42. }

  43. //我对这个函数的疑问是为什么,这个MBR要写入到存放NK之前的block?在微软的白皮书中是存放在FAT区域的第一个block的?
  44. //哪位高人来指点一下啊,谢谢。
复制代码
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

17
 

  1. //------------------------------------------------------------------------------
  2. //
  3. //------------------------------------------------------------------------------
  4. static BOOL CreateMBR()
  5. {
  6.     // This, plus a valid partition table, is all the CE partition manager needs to recognize
  7.     // the MBR as valid. It does not contain boot code.

  8.     memset (g_pbMBRSector, 0xff, g_FlashInfo.wDataBytesPerSector);
  9.     [color=#FF0000]g_pbMBRSector[0] = 0xE9;——这个为什么是E9?如果是EB会怎么样?
  10.     g_pbMBRSector[1] = 0xfd;——这个代表什么意思?
  11.     g_pbMBRSector[2] = 0xff;——这个是是什么意思?[/color]
  12. //在FAT文件系统白皮书中,必须保证FAT卷扇区[510]必须等于0x55,扇区[511]必须等于0xAA
  13.     g_pbMBRSector[SECTOR_SIZE-2] = 0x55;
  14.     g_pbMBRSector[SECTOR_SIZE-1] = 0xAA;

  15.     // Zero out partition table so that mspart treats entries as empty.
  16.     memset (g_pbMBRSector+PARTTABLE_OFFSET, 0, sizeof(PARTENTRY) * NUM_PARTS);

  17.     return WriteMBR();

  18. }  


  19. //------------------------------------------------------------------------------
  20. //写入MBR
  21. //------------------------------------------------------------------------------
  22. static BOOL WriteMBR()
  23. {
  24.     DWORD dwMBRBlockNum = g_dwMBRSectorNum / g_FlashInfo.wSectorsPerBlock;

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

  26.     memset (g_pbBlock, 0xff, g_dwDataBytesPerBlock);
  27.     memset (g_pSectorInfoBuf, 0xff, sizeof(SectorInfo) * g_FlashInfo.wSectorsPerBlock);
  28.         
  29.     // No need to check return, since a failed read means data hasn't been written yet.
  30.     ReadBlock (dwMBRBlockNum, g_pbBlock, g_pSectorInfoBuf);

  31.     if (!FMD_EraseBlock (dwMBRBlockNum)) {
  32.         RETAILMSG (1, (TEXT("CreatePartition: error erasing block 0x%x\r\n"), dwMBRBlockNum));
  33.         return FALSE;
  34.     }

  35.     memcpy (g_pbBlock + (g_dwMBRSectorNum % g_FlashInfo.wSectorsPerBlock) * g_FlashInfo.wDataBytesPerSector, g_pbMBRSector, g_FlashInfo.wDataBytesPerSector);
  36.     g_pSectorInfoBuf->bOEMReserved &= ~OEM_BLOCK_READONLY;
  37.     g_pSectorInfoBuf->wReserved2 &= ~SECTOR_WRITE_COMPLETED;
  38.     g_pSectorInfoBuf->dwReserved1 = 0;

  39.     if (!WriteBlock (dwMBRBlockNum, g_pbBlock, g_pSectorInfoBuf)) {
  40.         RETAILMSG (1, (TEXT("CreatePartition: could not write to block 0x%x\r\n"), dwMBRBlockNum));
  41.         return FALSE;
  42.     }

  43.     return TRUE;
  44.    
  45. }
复制代码
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

18
 
  1. 怎么我的问题就没有人回答呢?是不是分数太少,嫌少就说一声啊。我可以加分的。
  2. =====================================================================
  3. //下面来看分区的关键函数

  4. /*  BP_OpenPartition
  5. *
  6. *  Opens/creates a partition depending on the creation flags.  If it is opening
  7. *  and the partition has already been opened, then it returns a handle to the
  8. *  opened partition.  Otherwise, it loads the state information of that partition
  9. *  into memory and returns a handle.  
  10. *
  11. *  ENTRY
  12. *      dwStartSector - Logical sector to start the partition.  NEXT_FREE_LOC if none
  13. *          specified.  Ignored if opening existing partition.
  14. *      dwNumSectors - Number of logical sectors of the partition.  USE_REMAINING_SPACE
  15. *          to indicate to take up the rest of the space on the flash for that partition (should
  16. *          only be used when creating extended partitions).  This parameter is ignored
  17. *          if opening existing partition.
  18. *      dwPartType - Type of partition to create/open.
  19. *      fActive - TRUE indicates to create/open the active partition.  FALSE for
  20. *          inactive.
  21. *      dwCreationFlags - PART_CREATE_NEW to create only.  Fail if it already
  22. *          exists.  PART_OPEN_EXISTING to open only.  Fail if it doesn't exist.
  23. *          PART_OPEN_ALWAYS creates if it does not exist and opens if it
  24. *          does exist.
  25. *  BP_OpenPartition调用CreatePartition来创建分区,同时BP_OpenPartition被WriteOSImageToBootMedia和ReadOSImageFromBootMedia调用
  26. *  EXIT
  27. *      Handle to the partition on success.  INVALID_HANDLE_VALUE on error.
  28. */

  29. HANDLE BP_OpenPartition(DWORD dwStartSector, DWORD dwNumSectors, DWORD dwPartType, BOOL fActive, DWORD dwCreationFlags)
  30. {
  31.         DWORD dwPartIndex;
  32.         BOOL fExists;

  33.         ASSERT (g_pbMBRSector);
  34.         
  35.         if (!IsValidMBR()) {
  36.             DWORD dwFlags = 0;

  37.             if (dwCreationFlags == PART_OPEN_EXISTING) {
  38.                 RETAILMSG(1, (TEXT("OpenPartition: Invalid MBR.  Cannot open existing partition 0x%x.\r\n"), dwPartType));
  39.                 return INVALID_HANDLE_VALUE;
  40.             }
  41.             
  42.             RETAILMSG(1, (TEXT("OpenPartition: Invalid MBR.  Formatting flash.\r\n")));
  43.             if (g_FlashInfo.flashType == NOR) {
  44.                 dwFlags |= FORMAT_SKIP_BLOCK_CHECK;
  45.             }
  46.             BP_LowLevelFormat (0, g_FlashInfo.dwNumBlocks, dwFlags);
  47.             dwPartIndex = 0;
  48.             fExists = FALSE;
  49.         }
  50.         else {
  51.             fExists = GetPartitionTableIndex(dwPartType, fActive, &dwPartIndex);        
  52.         }

  53.         RETAILMSG(1, (TEXT("OpenPartition: Partition Exists=0x%x for part 0x%x.\r\n"), fExists, dwPartType));
  54.         if (fExists) {

  55.             // Partition was found.  
  56.             if (dwCreationFlags == PART_CREATE_NEW)
  57.                 return INVALID_HANDLE_VALUE;
  58.             
  59.             if (g_partStateTable[dwPartIndex].pPartEntry == NULL) {
  60.                 // Open partition.  If this is the boot section partition, then file pointer starts after MBR
  61.                 g_partStateTable[dwPartIndex].pPartEntry = (PPARTENTRY)(g_pbMBRSector + PARTTABLE_OFFSET + sizeof(PARTENTRY)*dwPartIndex);
  62.                 g_partStateTable[dwPartIndex].dwDataPointer = 0;
  63.             }            
  64.             return (HANDLE)&g_partStateTable[dwPartIndex];            
  65.         }
  66.         else {

  67.             // If there are already 4 partitions, or creation flag specified OPEN_EXISTING, fail.
  68.             if ((dwPartIndex == NUM_PARTS) || (dwCreationFlags == PART_OPEN_EXISTING))
  69.                 return INVALID_HANDLE_VALUE;

  70.             // Create new partition
  71.             return CreatePartition (dwStartSector, dwNumSectors, dwPartType, fActive, dwPartIndex);
  72.         }

  73.         return INVALID_HANDLE_VALUE;
  74.         
  75. }


复制代码


欢迎指点。。。。。。。。。。。。。。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

19
 
大家一起讨论。

先说我知道的。

1. nk.nb0和nk.bin的差别
nk.nb0是纯二进制文件或者是裸数据文件(raw data),可以用于烧录器直接烧录到flash中,适合于生产时使用。用UltraEdit打开一个nk.nb0,在任何一个位置看到什么数据,就说明在flash里对应的位置保存的就是什么。

nk.nb0适合生产,但是不适合下载,因为没有起始、结束标志。最典型的:一个32MB的nor,对应的nk.nb0就是32MB,但实际上有效区域只有17MB,那么后面的13MB都是0x00。怎么判断结束呢?显然不能用0x00,也不能用连续多少个0x00。

怎么办?

于是微软对nk.nb0加工了一下,转换成nk.bin。具体的改变是这样的:将nk.nb0中连续0x00忽略,将有效的数据块提炼出来,组合到nk.bin中。
nk.bin的开始是文件标识,7个字节,一旦读到这连续的标志字节,就说明是微软的bin文件。
接着是“有效数据块存储开始的虚拟地址”、“有效数据块的大小”和校验和。有耐心可以用UE打开nk.nb0和nk.bin对照着看,nk.nb0是0x0开始,而nk.bin存储开始就作为0x0,后面的地址都算偏移量就行。
结束标志是:有效数据块的存储位置及大小都是0。

这样,nk.bin就可以很方便的下载了。

所以,nk.nb0和nk.bin可以认为是一样的。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

20
 
2. binfs
binfs是微软设计的一套文件系统,主要是为了解决非XIP存储设备上,操作系统镜像的加载会导致RAM大量浪费的问题。
跑WINCE的肯定都是带SDRAM的,即使NOR支持XIP,也不会在NOR上跑,速度太慢。更别提NAND或者硬盘了,非线性寻址的,都必须将系统镜像加载到SDRAM,然后跳转到SDRAM继续执行。而系统镜像多大?10多MB,20多MB,40多MB的都有,而SDRAM呢?很痛苦的。

binfs就是给镜像中的每个单独文件一个定位坐标。就是将系统镜像的实际数据分成n个小块,每个小块占一定的基本空间(按byte算),每个文件、dll、lib、程序放置的位置,在PB编译后就确定了。系统加载时,就找到需要加载的文件在flash中存放的位置,单独读出该文件加载,而不需要将整个镜像都读到sdram了。

这个作用有点类似fat的文件表了,需要哪个读哪个,不需要的就不动。不过在eboot中不采用fat,难道是因为fat对空间浪费很大吗?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表