Программа разделов во встроенном C - PullRequest
0 голосов
/ 07 марта 2020
//------------------------------------------------------------------------------
//Partition boot sector at LBA = 1
//------------------------------------------------------------------------------
//Physical Sector - 1, Logical Sector - 0.  
//This is the first sector in the partition, and is known as the "volume boot record" or "partition boot sector"
//Note: This table is filesystem specific.  Re-formatting the drive will overwrite this table.  
const uint8_t PARTITION_ATTRIBUTES(BOOT_SECTOR_ADDRESS) BootSector[FILEIO_CONFIG_MEDIA_SECTOR_SIZE]  BOOT_SEC_ADDR_TAG =
{
0xEB, 0x3C, 0x90,           //Jump instruction
'M', 'S', 'D', 'O', 'S', '5', '.', '0', //OEM Name "MSDOS5.0"
(FILEIO_CONFIG_MEDIA_SECTOR_SIZE&0xFF), (FILEIO_CONFIG_MEDIA_SECTOR_SIZE>>8),       //Bytes per sector (FILEIO_CONFIG_MEDIA_SECTOR_SIZE)
0x01,               //Sectors per cluster
DRV_FILEIO_INTERNAL_FLASH_NUM_RESERVED_SECTORS, 0x00,           //Reserved sector count (usually 1 for FAT12 or FAT16)
0x01,               //number of FATs 
DRV_FILEIO_CONFIG_INTERNAL_FLASH_MAX_NUM_FILES_IN_ROOT, 0x00,           //Max number of root directory entries - 16 files allowed
0x00, 0x00,         //total sectors (0x0000 means: use the 4 byte field at offset 0x20 instead)
0xF8,               //Media Descriptor
DRV_FILEIO_INTERNAL_FLASH_NUM_FAT_SECTORS, 0x00,         //Sectors per FAT
0x3F, 0x00,                 //Sectors per track
0xFF, 0x00,                 //Number of heads
0x01, 0x00, 0x00, 0x00,     //Hidden sectors
(uint8_t)DRV_FILEIO_INTERNAL_FLASH_PARTITION_SIZE, (uint8_t)(DRV_FILEIO_INTERNAL_FLASH_PARTITION_SIZE >> 8), (uint8_t)(DRV_FILEIO_INTERNAL_FLASH_PARTITION_SIZE >> 16), (uint8_t)(DRV_FILEIO_INTERNAL_FLASH_PARTITION_SIZE >> 24),  //Total sectors (when WORD value at offset 20 is 0x0000)

0x00,           //Physical drive number
0x00,           //Reserved("current head")
0x29,           //Signature
0x32, 0x67, 0x94, 0xC4,     //ID(serial number)
'N', 'O', ' ', 'N', 'A', 'M', 'E', ' ', ' ', ' ', ' ',  //Volume Label (11 bytes) - "NO NAME    "
'F', 'A', 'T', '1', '2', ' ', ' ', ' ', //FAT system "FAT12   "
//Operating system boot code
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x55, 0xAA          //End of sector (0x55AA)
};

Я пытаюсь использовать часть памяти программ моего контроллера dspic33 в качестве устройства хранения данных. Я использую справочную программу, чтобы понять, что происходит внутри программы. Когда я go через него нахожу этот раздел. На самом деле я не знаю, это синтаксис, и он кажется мне новым. Я хочу понять об этом разделе. Если кто-нибудь сталкивался с такими программами в c, пожалуйста, объясните.

Ответы [ 2 ]

1 голос
/ 07 марта 2020

In const uint8_t PARTITION_ATTRIBUTES(BOOT_SECTOR_ADDRESS) BootSector[FILEIO_CONFIG_MEDIA_SECTOR_SIZE] BOOT_SEC_ADDR_TAG = { … };:

  • const говорит, что элементы определяемого массива не будут изменены после создания архива.

  • uint8_t говорит, что элементы определяемого массива являются 8-разрядными целыми числами без знака.

  • PARTITION_ATTRIBUTES(BOOT_SECTOR_ADDRESS), вероятно, макрос препроцессора, определенный в некотором заголовке, который может содержать некоторый компилятор -specifi c ключевые слова для описания атрибутов объявляемого объекта. (Эта гипотеза основана на содержании текста и на опыте, а не на строгих требованиях языка C.)

  • BootSector - имя определяемого массива .

  • [FILEIO_CONFIG_MEDIA_SECTOR_SIZE] говорит, что массив содержит FILEIO_CONFIG_MEDIA_SECTOR_SIZE элементов, где FILEIO_CONFIG_MEDIA_SECTOR_SIZE, вероятно, макрос препроцессора, определенный в некотором заголовке.

  • BOOT_SEC_ADDR_TAG, вероятно, является некоторым макросом препроцессора, содержащим заданные компилятором ключевые слова c, как указано выше.

  • = { … } предоставляет данные, используемые для инициализации массива.

1 голос
/ 07 марта 2020

Кажется, что он содержит первый блок физического диска.

Когда ваша система загружается, она загружает первый блок физического диска в заранее определенное место в памяти (предварительно определенное B IOS) и затем передает управление этому блоку. Там он встречает инструкцию перехода и прыгает туда. Инструкция перехода была жестко запрограммирована, и, возможно, потребуется знать, куда B IOS загрузил блок. Я не декодировал инструкцию перехода, но ожидал, что она перейдет в раздел, называемый «загрузочный код операционной системы», но этот раздел содержит только нули.

После этой инструкции перехода находятся данные файловой системы FAT12.

Без дополнительной информации сложно сказать больше об этом. Так что это может быть загрузочный блок, который физически записан в блок 0 диска, но, похоже, для этого требуется загрузочный код. В какой-то степени это зависит от подробного определения загрузочного блока и файловой системы FAT12, а также от кода B IOS реальной машины, считывающей это в память.

Так что, хотя и не является окончательным и полным объяснением, Надеюсь, это поможет.

...