메뉴 건너뛰기

NEOS White Paper

주의 : 본 기능은 NEOS V4에만 적용됩니다.

 

1. 메모리 디스크 만들기

 

NEOS의 파일시스템은 디스크와 같은 물리적인 저장매체가 없는 환경에서 하드디스크와 같은 블럭디바이스 인터페이스를 사용할 수 있도록 메모리 디스크를 지원한다.

 

제공되는 메모리 디스크는 타깃시스템 메모리의 일부를 블록 디바이스처럼 사용할 수 있도록 관리해주는 하나의 블록 디바이스 드라이버라고 생각하면 된다. NEOS에서 메모리 디스크를 사용하기 위해서는 연속적인 메모리 영역을 블록 디바이스 드라이버 영역으로 등록하고, 파일시스템에 마운트하는 일련의 절차를 수행 하여야 한다.

 

다음은 NEOS에서 메모리 디스크 기능을 사용할 수 있도록 제공하는 함수 인터페이들이다.

  • md_attach()
    • md_attach()함수는 지정된 메모리 영역을 하드디스크와 같은 블럭 디바이스로 사용할 수 있도록 메모리 디스크를 등록하는 기능을 제공한다.
  • msdos_newfs()
    • 하드디스크와 같은 블록 디바이스 장치를 NEOS의 입출력 서브시스템과 연동하여 사용하기위해서는  생성한 메모리 디스크에  FAT이나 Ext2와 같은 디스크를 효과적으로 관리할 수 있는 파일시스템을 생성하여야 한다.
    • NEOS에서는 msdos_newfs()함수를 이용하여MSDOS 호환 파일시스템을 생성하며, 디스크 드라이브의 크기에 따라 FAT12, FAT16, FAT32 등을 지원한다.
    • 파일시스템이 생성되면 사용자들은 open(),read(),write(),fopen(),fread(),fwrite() 같은 표준 인터페이스들을 이용하여 생성된 메모리 디스크를 사용할 수 있게된다.
  • mount()
    • 메모리 디스크를 생성하고 디스크에 파일시스템을 생성하였다면 마지막으로 생성된 디스크를 NEOS의 파일시스템을 통하여 사용할 수 있도록 파일시스템에 등록해 주어야 한다.
    • mount() 함수는 디스크의 파일시스템 타입을 지정하고 메모리 디스크의 root path등을 지정하여 파일시스템에 등록해 준다.
  • vfs_setcwd()
    • 디스크 마운트까지 완료 되었다면 마지막으로 현재 작업 디렉터리를 지정해 주어야 한다.
    • 최초로 디스크를 생성하였기 때문에 vfs_setcwd()함수를 이용하여 root path를 현재 작업 디렉터리로 생성한다.

다음은 위에서 설명한 함수들을 이용하여 NEOS에서 메모리 디스크를 생성하는 예제이다.

#define RAMDISK_NAME                             "RD0"

#define RAMDISK_DEVICE_PATH                "/dev/RD0"

#define RAMDISK_VOLNAME                      "/rdisk"

#define DEFAULT_ROOT_DIRECTORY         "/rdisk/"

#define RAMDISK_SECTOR_PER_TRAC      1

#define RAMDISK_NUM_OF_SECTORS      32768

#define RAMDISK_SECTOR_SIZE                 512

#define RAMDISK_NUM_OF_HEADER       1

 

void ramDiskInit()

 {

     int status = 0;

 

     printf("enter %s\n", __func__);

 

     status = md_attach(RAMDISK_NAME, NULL, RAMDISK_SECTOR_SIZE, RAMDISK_SECTOR_PER_TRAC, RAMDISK_NUM_OF_SECTORS, RAMDISK_NUM_OF_HEADER, 0);

     if(status != 0)

     {

         printf("%s > md_attach error %d(%d)\n",__func__,status,errno);

     }

     else

     {

         fatconf_t   fatopt;

         memset(&fatopt, 0x00, sizeof(fatconf_t));

         status = msdosfs_newfs(RAMDISK_DEVICE_PATH, NULL, &fatopt);

         if(status != 0)

         {

                 printf("%s > msdosfs_newfs error %d(%d)\n",__func__,status,errno);

         }

         else

         {

             status = mount("msdos", RAMDISK_DEVICE_PATH, RAMDISK_VOLNAME, MNT_NOATIME, NULL);

             if(status != 0)

             {

                 printf("%s > mount error %d(%d)\n",__func__,status,errno);

             }

             else

             {

                 vfs_setcwd(DEFAULT_ROOT_DIRECTORY);

 

                 setDate();

             }

         }

     }

 }

 

/**

 * UserMain - user application

 *

 * This routine is entry point of user developed application.

 */

 

void

UserApplication(Address argument)

{

    mode_t dMode;

 

    /* 메모리 디스크 생성, 파일시스템 생성, 마운트, 루트 디렉터리 지정 */

    ramDiskInit();

 

    /* 생성된 메모리 디스크에 디렉터리 생성 예제 */

    /* 디렉터리 기본 모드 설정 */

    dMode = S_IRWXU | S_IRWXG | S_IRWXO;

 

     if (mkdir(“testDir”, dMode) == ERROR)

     {

         printf("mkdir: make directory failed. code = 0x%x\n", errno);

     }

}

 

위 예제 프로그램을 수행한 후 NEOS의 mount 쉘 명령어를 이용하여 현재 등록되어 있는 디스크 드라이브와 마운트 포인트,

마운팅된 파일시스템 타입등을 확인 할 수 있다.

    MMM    MMM MMMMMMMM  MMM MMMM   MMM MMM

   MMMMM  MMM MMMM      MMM   MMM  MMM

   MMMMM MMMM MMMMMMMM MMM  MMMM    MMMMM

  MMM MMMMMM MMMM      MMM  MMMM MMM   MMM

 MMM   MMMM MMMMMMMM   MMM MM    MMMM MM

           The Nano-Engine Operating System

        Copyright(c) MDS Technology Co.,Ltd

        KERNEL: NEOS178S-01.03.00

        Build Date: Mar 30 2016,09:32:53

 

->

->

-> mount

Device       mountpoint type     flags

------------ ---------- -------- ------

none         /dev       devfs    0x10

/dev/RD0     /rdisk     msdos    0x1042

->

->

->

 

쉘의  “ls” 명령어를 이용하여 파일시스템에 생성된 디렉터리를 확인할 수 있다.

-> ls

 2000-01-01 00:00:00  <DIR>       16384 .

 2000-01-01 00:00:00  <DIR>       16384 ..

 2000-01-01 00:00:00  <DIR>        2048 testDir

 

                   0 files   0 bytes

                   3 directories  68003840 bytes free

 

->

 

2. 디스크에 파일 추가 하기

 

메모리 디스크는 타겟보드의 RAM에 만들어지기 떄문에 전원이 꺼지면 디스크의 내용은 모두 사라진다. 따라서 사용자 응용프로그램에서 파일시스템에 항상 저장된 파일이 필요할 경우 메모리 디스크 생성과 함께 필요한 파일도 함께 생성할 수 있도록 해주면 된다.

다음은 메모리 디스크에 필요한 파일을 넣는 방법에 대하여 간단히 설명한다.

 

첫쨰, 디스크에 넣고자 하는 파일을 헥사 코드로 변환하여 헤더 파일을 만든다. 다음은 파일을 헥사 코드로 변환하여 주는 프로그램이다.

 

#include <stdio.h>         // puts()

#include <string.h>        // strlen()

#include <fcntl.h>         // O_WRONLY

#include <unistd.h>        // write(), close()

#include <stdlib.h>

 

#define  BUFF_SIZE   1024

 

int main(int argc, char *argv[])

{

   FILE    *fp_sour;

   FILE    *fp_dest;

   char     buff[1024];

   size_t   n_size;

   unsigned char     data;

   char     arrstart[80];

   char     arrend[8] = "};";

   char     ofname[80];

 

 

   if (argv[1] == NULL)

   {

       printf("usage: testfile  filename ...\n");

       exit(0);

   }

 

   sprintf(arrstart, "unsigned char %s[] = {", argv[1]);

   sprintf(ofname, "%s.h", argv[1]);

 

   /* 변환 하고자 하는 파일은 연다 */

   fp_sour  = fopen( argv[1], "r");

   /* 변환된 파일을 헤더 파일로 만들기 위한 파일을 생성 */

   fp_dest  = fopen( ofname, "w");

 

   fwrite (arrstart, 1, strlen(arrstart), fp_dest);

   while( 0 < (n_size = fread( &data, 1, 1, fp_sour)))

   {

      /* 파일에서 데이터를 한바이트씩 읽어서 헥사코드로 변환 */

      fprintf(fp_dest, "0x%x,", data);

   }

   fwrite (arrend, 1, strlen(arrend), fp_dest);

 

   fclose( fp_sour);

   fclose( fp_dest);

   return 0;

}

[conv2data.c]

 

위의 프로그램을 컴파일한 후 아래와 같이 변환하고자 하는 파일을 변환하면 된다.

> conv2data dp-bit.c

 

위 명령을 실행하면 “dp-bit.c.h” 파일이 생성됨

 

 

위로