ncloader  0.1
 모두 데이타 구조 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 매크로 그룹들 페이지들
Implementation of tools
+ Implementation of tools에 대한 협력 다이어그램:

모듈

 ELF Parser
 ELF 포맷을 파싱해서 링크 하고 메모리에 적재해서 실행시킨다. NCKernel 은 ELF 포맷이기 때문에, 이 로더가 커널을 로딩한다.
 
 Image writer
 
 Samples
 Various sample codes.
 
 Partition Analyzer
 
 FAT12 Reserved Sector updator
 
 Hexa-dump
 

데이타 구조

struct  fat_dentry
 
struct  boot_parameter_block
 
struct  DSKSZTOSECPERCLUS
 
struct  fat32_fsinfo
 
struct  fat_long_dirent
 

매크로

#define SIZEOF_DENTRY   32
 
#define ROOT_DIR_SECTORS(bpb)   ((((bpb)->nr_root_entry * SIZEOF_DENTRY) + ((bpb)->sector_size - 1)) / (bpb)->sector_size)
 
#define FAT_SIZE(bpb)   ((bpb)->size_of_fat16 ? (bpb)->size_of_fat16 : (bpb)->type.fat32.size_of_fat32)
 
#define FIRST_DATA_SECTOR(bpb)   ((bpb)->reserved_sector + ((bpb)->nr_fat * FAT_SIZE(bpb)) + ROOT_DIR_SECTORS(bpb))
 
#define FIRST_SECTOR_OF_CLUSTER(bpb, N)   (((N)-2) * ((bpb)->sector_per_cluster) + FIRST_DATA_SECTOR(bpb))
 
#define TOTAL_SECTOR(bpb)   ((bpb)->total_sector16 ? (bpb)->total_sector16 : (bpb)->total_sector32)
 
#define NR_DATA_SECTOR(bpb)   (TOTAL_SECTOR(bpb) - ((bpb)->reserved_sector + (bpb)->nr_fat * FAT_SIZE(bpb)) + ROOT_DIR_SECTORS(bpb))
 
#define COUNT_OF_CLUSTER(bpb)   (NR_DATA_SECTOR(bpb) / (bpb)->sector_per_cluster)
 
#define IS_FAT12(bpb)   (COUNT_OF_CLUSTER(bpb) < 4085)
 
#define IS_FAT16(bpb)   (!IS_FAT12(bpb) && (COUNT_OF_CLUSTER(bpb) < 65525))
 
#define IS_FAT32(bpb)   (COUNT_OF_CLUSTER(bpb) >= 65525)
 
#define COUNT_OF_VALID_MAX_CLUSTER(bpb)   (COUNT_OF_CLUSTER(bpb) + 1)
 
#define FAT_OFFSET(bpb, N)
 
#define THIS_FAT_SECTOR_NUMBER(bpb, N)   (FAT_OFFSET(bpb, (N)) / (bpb)->sector_size)
 
#define THIS_FAT_SECTORS(bpb, N)   ((bpb)->reserved_sector + (N) * FAT_SIZE(bpb))
 
#define THIS_FAT_OFFSET(bpb, N)   (THIS_FAT_SECTORS(bpb, (N)) * (bpb)->sector_size)
 
#define THIS_FAT_ENTRY_OFFSET(bpb, N)   (FAT_OFFSET(bpb, (N)) % (bpb)->sector_size)
 
#define TO_WORD(buffer)   ((unsigned short*)(&buffer))
 
#define TO_DWORD(buffer)   ((unsigned int*)(&buffer))
 
#define FAT_EOF(bpb)   (IS_FAT12(bpb) ? 0x0FF8 : IS_FAT16(bpb) ? 0xFFF8 : IS_FAT32(bpb) ? 0x0FFFFFF8 : 0)
 
#define GET_CLUSTER_ENTRY_VALUE(bpb, buffer, N)
 
#define SET_CLUSTER_ENTRY_VALUE(bpb, buffer, N, val)
 
#define IS_EOF(bpb, val)   (IS_FAT12(bpb) ? (val) >= 0x0FF8 : IS_FAT16(bpb) ? (val) >= 0xFFF8 : IS_FAT32(bpb) ? (val) >= 0x0FFFFFF8 : 0)
 
#define BAD_CLUSTER12   0x0FF7
 
#define BAD_CLUSTER16   0xFFF7
 
#define BAD_CLUSTER32   0x0FFFFFF7
 
#define UPDATE_FAT_SIZE(bpb, dsksz)
 
#define FIRST_ROOTDIR_SECTOR(bpb)   ((bpb)->reserved_sector + (bpb)->nr_fat * FAT_SIZE(bpb))
 
#define GET_FIRST_BLOCK(dentry)   ((dentry)->first_cluster_hi << 16 | (dentry)->first_cluster_lo)
 
#define IS_FREE_DENTRY(dirent)   ((unsigned char)((dirent)->name[0] == (unsigned char)0xE5) || ((dirent)->name[0] == 0x00))
 
#define IS_KANJI_NAME(dirent)   ((dirent)->name[0] == 0x05)
 
#define IS_VALID_CHAR_FOR_NAME(ch)   (!(((ch) != 0x05 && (ch) < 0x20) && (ch) != 0x22 && ((ch) >= 0x2A && (ch) <= 0x2F) && ((ch) >= 0x3A && (ch) <= 0x3F) && (ch) != 0x5B && (ch) != 0x5C && (ch) != 0x5D && (ch) != 0x7C))
 
#define DAY_OF_MONTH(ent)   ((ent)->write_date & 0x000Fu)
 
#define MONTH_OF_YEAR(ent)   (((ent)->write_date >> 4) & 0x000Fu)
 
#define COUNT_OF_YEAR(ent)   (1980 + (((ent)->write_date >> 8) & 0x00FFu))
 
#define SECOND_COUNT(ent)   ((ent)->write_time & 0x000Fu)
 
#define MINUTES(ent)   (((ent)->write_time >> 4) & 0x003F)
 
#define HOURS(ent)   (((ent)->write_time >> 10) & 0x001F)
 
#define LAST_LONG_ENTRY   0x40
 
#define PATH_MAX   256
 
#define IS_LAST_SLOT(ent)   ((ent->ord & LAST_LONG_ENTRY) == 0)
 

타입정의

typedef struct fat_dentry fat_dentry_t
 
typedef struct boot_parameter_block boot_parameter_block_t
 
typedef struct fat_long_dirent fat_slot_t
 

열거형 타입

enum  dir_attributes {
  ATTR_READ_ONLY = 0x01, ATTR_HIDDEN = 0x02, ATTR_SYSTEM = 0x04, ATTR_VOLUME_ID = 0x08,
  ATTR_DIRECTORY = 0x10, ATTR_ARCHIVE = 0x20, ATTR_NONE = 0x00, ATTR_EXT = ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID,
  ATTR_UNUSED = ATTR_ARCHIVE | ATTR_VOLUME_ID | ATTR_SYSTEM | ATTR_HIDDEN, ATTR_LONG_NAME = ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID, ATTR_LONG_NAME_MASK = ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID | ATTR_DIRECTORY | ATTR_ARCHIVE, ATTR_NO_FILE = ATTR_SYSTEM | ATTR_VOLUME_ID | ATTR_DIRECTORY,
  ACTIVE_FLAG = 0x80, EXTENDED = 0x05, DELETED_FLAG = 0xE5
}
 

함수

struct fat_dentry __attribute__ ((packed))
 
int main (int argc, char *argv[])
 

변수

struct DSKSZTOSECPERCLUS __attribute__
 

상세한 설명

매크로 문서화

#define BAD_CLUSTER12   0x0FF7
#define BAD_CLUSTER16   0xFFF7
#define BAD_CLUSTER32   0x0FFFFFF7
#define COUNT_OF_CLUSTER (   bpb)    (NR_DATA_SECTOR(bpb) / (bpb)->sector_per_cluster)
#define COUNT_OF_VALID_MAX_CLUSTER (   bpb)    (COUNT_OF_CLUSTER(bpb) + 1)
#define COUNT_OF_YEAR (   ent)    (1980 + (((ent)->write_date >> 8) & 0x00FFu))
#define DAY_OF_MONTH (   ent)    ((ent)->write_date & 0x000Fu)
#define FAT_EOF (   bpb)    (IS_FAT12(bpb) ? 0x0FF8 : IS_FAT16(bpb) ? 0xFFF8 : IS_FAT32(bpb) ? 0x0FFFFFF8 : 0)
#define FAT_OFFSET (   bpb,
 
)
값:
(IS_FAT16(bpb) ? (N) * 2 \
: (IS_FAT32(bpb) ? (N) * 4 \
: (IS_FAT12(bpb) ? (N)+(N)/2 : -1)))
#define FAT_SIZE (   bpb)    ((bpb)->size_of_fat16 ? (bpb)->size_of_fat16 : (bpb)->type.fat32.size_of_fat32)
#define FIRST_DATA_SECTOR (   bpb)    ((bpb)->reserved_sector + ((bpb)->nr_fat * FAT_SIZE(bpb)) + ROOT_DIR_SECTORS(bpb))
#define FIRST_ROOTDIR_SECTOR (   bpb)    ((bpb)->reserved_sector + (bpb)->nr_fat * FAT_SIZE(bpb))
#define FIRST_SECTOR_OF_CLUSTER (   bpb,
 
)    (((N)-2) * ((bpb)->sector_per_cluster) + FIRST_DATA_SECTOR(bpb))
#define GET_CLUSTER_ENTRY_VALUE (   bpb,
  buffer,
 
)
값:
(IS_FAT16(bpb) ? *TO_WORD((buffer) + THIS_FAT_ENTRY_OFFSET(bpb, (N))) \
: (IS_FAT32(bpb) ? ((*TO_DWORD((buffer) + THIS_FAT_ENTRY_OFFSET(bpb, (N)))) & 0x0FFFFFFF) \
: (IS_FAT12(bpb) ? \
(((N) & 0x0001) ? \
(*TO_WORD(((char*)(buffer) + THIS_FAT_SECTOR_NUMBER(bpb, N) * (bpb)->sector_size)[THIS_FAT_ENTRY_OFFSET(bpb, N)])) >> 4 \
: (*TO_WORD(((char*)(buffer) + THIS_FAT_SECTOR_NUMBER(bpb, N) * (bpb)->sector_size)[THIS_FAT_ENTRY_OFFSET(bpb, N)])) & 0x0FFF) \
: FAT_EOF(bpb))))
#define GET_FIRST_BLOCK (   dentry)    ((dentry)->first_cluster_hi << 16 | (dentry)->first_cluster_lo)
#define HOURS (   ent)    (((ent)->write_time >> 10) & 0x001F)
#define IS_EOF (   bpb,
  val 
)    (IS_FAT12(bpb) ? (val) >= 0x0FF8 : IS_FAT16(bpb) ? (val) >= 0xFFF8 : IS_FAT32(bpb) ? (val) >= 0x0FFFFFF8 : 0)
#define IS_FAT12 (   bpb)    (COUNT_OF_CLUSTER(bpb) < 4085)
#define IS_FAT16 (   bpb)    (!IS_FAT12(bpb) && (COUNT_OF_CLUSTER(bpb) < 65525))
#define IS_FAT32 (   bpb)    (COUNT_OF_CLUSTER(bpb) >= 65525)
#define IS_FREE_DENTRY (   dirent)    ((unsigned char)((dirent)->name[0] == (unsigned char)0xE5) || ((dirent)->name[0] == 0x00))
#define IS_KANJI_NAME (   dirent)    ((dirent)->name[0] == 0x05)
#define IS_LAST_SLOT (   ent)    ((ent->ord & LAST_LONG_ENTRY) == 0)
#define IS_VALID_CHAR_FOR_NAME (   ch)    (!(((ch) != 0x05 && (ch) < 0x20) && (ch) != 0x22 && ((ch) >= 0x2A && (ch) <= 0x2F) && ((ch) >= 0x3A && (ch) <= 0x3F) && (ch) != 0x5B && (ch) != 0x5C && (ch) != 0x5D && (ch) != 0x7C))
#define LAST_LONG_ENTRY   0x40
#define MINUTES (   ent)    (((ent)->write_time >> 4) & 0x003F)
#define MONTH_OF_YEAR (   ent)    (((ent)->write_date >> 4) & 0x000Fu)
#define NR_DATA_SECTOR (   bpb)    (TOTAL_SECTOR(bpb) - ((bpb)->reserved_sector + (bpb)->nr_fat * FAT_SIZE(bpb)) + ROOT_DIR_SECTORS(bpb))
#define PATH_MAX   256
#define ROOT_DIR_SECTORS (   bpb)    ((((bpb)->nr_root_entry * SIZEOF_DENTRY) + ((bpb)->sector_size - 1)) / (bpb)->sector_size)
#define SECOND_COUNT (   ent)    ((ent)->write_time & 0x000Fu)
#define SET_CLUSTER_ENTRY_VALUE (   bpb,
  buffer,
  N,
  val 
)
값:
do { \
if (IS_FAT16(bpb)) { \
*TO_DWORD((buffer) + THIS_FAT_ENTRY_OFFSET(bpb, N)) = (val); \
} else if (IS_FAT32(bpb)) { \
(val) = (val) & 0x0FFFFFFF; \
*TO_DWORD((buffer) + THIS_FAT_ENTRY_OFFSET(bpb, N)) &= 0xF0000000;\
*TO_DWORD((buffer) + THIS_FAT_ENTRY_OFFSET(bpb, N)) |= (val); \
} else { \
if ((N) & 0x0001) { \
(val) = (val) << 4; \
*TO_WORD((buffer) + THIS_FAT_ENTRY_OFFSET(bpb, N)) &= 0x000F;\
} else { \
(val) = (val) & 0x0FFF; \
*TO_WORD((buffer) + THIS_FAT_ENTRY_OFFSET(bpb, N)) &= 0xF000;\
} \
*TO_WORD((buffer) + THIS_FAT_ENTRY_OFFSET(bpb, N)) |= (val); \
} \
} while (0)
#define SIZEOF_DENTRY   32
#define THIS_FAT_ENTRY_OFFSET (   bpb,
 
)    (FAT_OFFSET(bpb, (N)) % (bpb)->sector_size)
#define THIS_FAT_OFFSET (   bpb,
 
)    (THIS_FAT_SECTORS(bpb, (N)) * (bpb)->sector_size)
#define THIS_FAT_SECTOR_NUMBER (   bpb,
 
)    (FAT_OFFSET(bpb, (N)) / (bpb)->sector_size)
#define THIS_FAT_SECTORS (   bpb,
 
)    ((bpb)->reserved_sector + (N) * FAT_SIZE(bpb))
#define TO_DWORD (   buffer)    ((unsigned int*)(&buffer))
#define TO_WORD (   buffer)    ((unsigned short*)(&buffer))
#define TOTAL_SECTOR (   bpb)    ((bpb)->total_sector16 ? (bpb)->total_sector16 : (bpb)->total_sector32)
#define UPDATE_FAT_SIZE (   bpb,
  dsksz 
)
값:
do { \
unsigned int tmp[2]; \
unsigned int fatsz; \
tmp[0] = (dsksz) - ((bpb)->reserved_sector + ROOT_DIR_SECTORS(bpb)); \
tmp[1] = (256 * (bpb)->sector_per_cluster) + (bpb)->nr_fat; \
if (IS_FAT32(bpb)) { \
tmp[1] = tmp[1] / 2; \
} \
fatsz = (tmp[0] + (tmp[1] - 1)) / tmp[1]; \
if (IS_FAT32(bpb)) { \
(bpb)->size_of_fat16 = 0; \
(bpb)->type.fat32.size_of_fat32 = fatsz; \
} else { \
(bpb)->size_of_fat16 = fatsz & 0x0000FFFF; \
} \
} while(0)

타입정의 문서화

typedef struct fat_dentry fat_dentry_t
typedef struct fat_long_dirent fat_slot_t

열거형 타입 문서화

열거형 멤버
ATTR_READ_ONLY 
ATTR_HIDDEN 
ATTR_SYSTEM 
ATTR_VOLUME_ID 
ATTR_DIRECTORY 
ATTR_ARCHIVE 
ATTR_NONE 
ATTR_EXT 
ATTR_UNUSED 
ATTR_LONG_NAME 
ATTR_LONG_NAME_MASK 
ATTR_NO_FILE 
ACTIVE_FLAG 
EXTENDED 
DELETED_FLAG 

함수 문서화

struct fat_dentry __attribute__ ( (packed)  )
int main ( int  argc,
char *  argv[] 
)

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

변수 문서화

enum dir_attributes __attribute__