2014-06-22 7 views
1

OS 개발에서 꽤 새로워졌습니다. 지금은 FAT12 파일 시스템 코드를 작성하고 있습니다. FDC 코드를 사용하여 플로피 디스크에 모든 글을 올렸지 만 디스크에 파일을 쓸 때 어떻게 진행해야하는지에 대해 머리를 감싸는 것처럼 보이지 않습니다.OS 개발 : FAT12 쓰기 기능 구현

내 루트 디렉토리와 관련된 모든 정보를 알고 있지만 파일을 어디에 쓸 것인지 올바른 섹터를 찾는 방법은 무엇입니까? 그리고 그 후에, 그 항목을 FAT에 어떻게 추가해야합니까? 나는 비슷한 작성하고 루트 디렉토리를 통해 도보로 계획되었다

FILE fsysFatDirectory (const char* DirectoryName) { 

     FILE file; 
    unsigned char* buf; 
    PDIRECTORY directory; 

    //! get 8.3 directory name 
    char DosFileName[11]; 
    ToDosFileName (DirectoryName, DosFileName, 11); 
    DosFileName[11]=0; 

    //! 14 sectors per directory 
    int sector; 
    for (sector=0; sector<14; sector++) { 

     //! read in sector of root directory 
     buf = (unsigned char*) flpydsk_read_sector (_MountInfo.rootOffset + sector); 

     //! get directory info 
     directory = (PDIRECTORY) buf; 

     //! 16 entries per sector 
     int i; 
     for (i=0; i<16; i++) { 

      //! get current filename 
      char name[11]; 
      kmemcpy (name, directory->Filename, 11); 
      name[11]=0; 

      //! find a match? 
      if (kstrcmp (DosFileName, name) == 0) { 

       //! found it, set up file info 
       kstrcpy (file.name, DirectoryName); 
       file.id    = 0; 
       file.currentCluster = directory->FirstCluster; 
       file.fileLength  = directory->FileSize; 
       file.eof   = 0; 
       file.fileLength  = directory->FileSize; 

       //! set file type 
       if (directory->Attrib == 0x10) 
        file.flags = FS_DIRECTORY; 
       else 
        file.flags = FS_FILE; 

       //! return file 
       return file; 
      } 

      //! go to next directory 
      directory++; 
     } 
    } 

    //! unable to find file 
    file.flags = FS_INVALID; 
    return file; 
    } 

,는 엔트리 내가 자리를 찾을 때까지 :

내가 루트 디렉토리를 탐색하고 파일을 찾기 위해 사용하는 코드입니다. FAT를 추가/걷는 것에 관해서는, 각 항목이 클러스터를 나타내는 것을 알고 있습니다 (항목 1 = 클러스터 1). 그러나 나는 루트 디렉토리 대신에 FAT를 통과해야하는지 또는 둘 다 알고 있어야하는지 모른다.

내 코드의 대부분은이 자습서를 기반으로합니다. http://www.brokenthorn.com/Resources/OSDev22.html 그러나 그는 파일 만들기/쓰기 비트를 추가하지 않았기 때문에 직접 해보았습니다.

도움을 주시면 감사하겠습니다.

+0

업데이트 : 나는 실제로 FAT 테이블을 디스크에 쓴 적이 없다는 것을 깨달았습니다 ... 어떻게 수동으로 디스크 이미지에 테이블을 쓸 수 있습니까? –

답변

1

내가 생각할 수있는 구현 중 하나는 루트 디렉토리가 상위 디렉토리 인 트리 형 구조를 사용하는 것입니다.

struct fat_component{ 
    fat_component *parent; 
    /*other fat components here*/ 
}; 

일단 우리는 int 13h/AH = 03 인라인 어셈블리 호출과 같은 것을 호출 할 수 있습니다. 나는 그것에 익숙하지 않지만 링크는 http://stanislavs.org/helppc/int_13-3.html입니다.

inline_asm("mov ah, 03h"); 
inline_asm("mov ch, %s", fc->cylindernum); 
inline_asm("mov cl, %s", fc->sectornum); 
/*other int13h initializations here*/ 
inline_asm ("int 13h");