OLE 파일은 Object Linking & Embedding 약자로 Microsoft Compound File Binary (CFB) file format 라고 불린다.

OLE 파일의 기본구성은 Header와 Sector 으로 이루어져 있다. Header 에는 OLE 파일의 전반적인 설정(Sector 사이즈, SAT 위치 등)의 값이 저장되어 있고, 각각의 Sector 에는 데이터가 저장되어 있다.

< OLE 파일의 구조 >

구조의 이해를 돕기 위해서 위의 그림과 같이 여러 Sector 로 구성되어 있는 저장공간에 데이터를 저장시킨다고 가정하자. 하나의 Sector 의 사이즈를 4096 bytes 라고 하자. (Sector 크기는 Header 에서 설정되어 진다. 일반적으로 9 로 설정되어 있다.) 저장해야 할 데이터의 크기가 해당 바이트의 크기보다 작을 경우에는 빈 공간이 있을지라도 하나의 Sector 에 데이터가 모두 들어감으로 데이터를 참고할 때, 해당 Sector 번호를 참조하면 된다.하지만 데이터의 크기가 4096 bytes 보다 큰 경우에는 Sector 여러 개에 걸쳐서 저장을 해야 한다. 이렇게 나뉘어진 데이터의 참조를 위해서 OLE 구조에서는 SAT(Sector Allocation Table) 를 사용해서 파일의 전체 Sector 의 상태를 표시하고 있다. 데이터가 이어질 경우, Sector 다음으로 이어지는 Sector Number 를 SAT 에 표기하도록 하고, 데이터의 마지막을 알려주기 위해서는 -2 를 표기하도록 한다. 이러한 방식으로 SAT 를 통해 연결된 Sector 의 연계성을 확인할 수 있다. 또한 SAT 를 통해 특정 Sector 의 상태를 확인할 수 있다. 예를 들어, Sector 가 사용되지 않고 있음을 나타내기 위해서는 -1 이 사용되고, SAT 가 존재하는 Sector 를 표기하기 위해서 -3 이 사용된다.

< 그림 Sector Allocation Table >

여기서 SAT 에 대해 좀 더 생각해보자. SAT Sector 한 개를 사용해서 저장할 수 있는 데이터는 약 4Mb 정도 밖에 되지 않는다. [1024(number of Addr in SAT) * 4096(Sector Size) = 4,194,304] 당연히 여러 개의 SAT 가 필요하게 되고, 여러 개의 SAT Sector 를 관리하기 위해서 MSAT(Master Sector Allocation Table) 를 사용한다.(SAT 를 관리하는 SAT 의 느낌?)

데이터가 Sector 사이즈보다 큰 경우에 OLE 가 저장하는 방법을 확인했으니, 사이즈가 작을 경우를 생각해보자. 기본적으로 설정된 Sector 의 크기는 4096 Bytes 이다. 만약 저장하고자 하는 데이터의 사이즈가 1 Bytes 라면? 1 Bytes 의 데이터를 위해서 한 개의 Sector 를 모두 써야할까? 극단적인 예시이긴 하지만 분명히 공간 사용이 비효율적이게 된다. 보다 효율적인 데이터의 저장을 위해서 OLE 는 Short-Sector 를 사용한다. Short-Sector 란, Sector 크기보다 작은 데이터를 저장하기 위해서 보다 작은 단위로 Sector 나눈 것으로 특정 크기(이 정보 또한 Header 에 설정이 되어있다.) 단위의 여러 Short-Sector 로 구성되어 있다. 이 Short-Sector 를 관리하기 위해 Sector 관리에 SAT 를 사용하는 것과 마찬가지로 SSAT(Short-Sector Allocation Table) 를 만들어 여러 Short-Sector 에 나뉘어진 데이터를 관리하고, Short-Sector 의 상태를 확인할 수 있다.

< Short-Sector Allocation Table >

지금까지 OLE 파일이 데이터를 저장하기 위해서 어떤 방법을 사용하고, 어떤 방식으로 관리하는지 확인했다. 그럼 이러한 구조에 들어가는 데이터는 어떻게 사용되어 질까?

OLE 파일에 들어가는 데이터는 아래의 그림과 같은 구조로 되어있다.

< Storage & Steam >

Storage 와 Stream 으로 이루어진 이 그림은 OLE 파일 구조를 단순화 시킨 것으로, 여러 Storage 와 Stream 를 구분하기 위해서 고유한 이름이 설정되어 있는 것을 볼 수 있다.(이름은 같은 Storage 내에서 중복되지 않으면 된다.) 위와 같은 구조를 나타내기 위해서 Directory 구조를 사용하여 각각의 Storage 와 Stream 의 정보를 저장하게 된다.

Storage 와 Stream 은 파일 관리에서 사용하는 폴더와 파일 개념과 비슷하다고 생각하면 이해가 쉬울 듯 하다.

< 그림 한글 문서 구조 >

위에서 언급한 것처럼 Storage 와 Stream 은 Directory Entry Structure 구조를 가지고 있고, 여기에서 직접적인 데이터와의 연결이 이루어진다. 앞서 확인하였던 SAT 나 SSAT 에는 Sector 또는 Short-Sector에 저장되어 있는 Stream 의 시작과 끝 만을 알 수 있었고, Directory Entry 에서 어떤 Stream 이 몇 번 Sector 부터 시작하는지 알려줌으로써 데이터의 mapping 이 이루어진다. 시작 Sector ID 정보 외에도 directory Entry 에서 Type 이나, Stream 크기 정보를 통해 해당 Directory 가 Root Storage 인지, User Storage 인지, Steam 인지 확인이 가능하고, Steam 크기를 확인함으로써 시작 Sector ID 를 SAT 에서 참조해야 하는지, SSAT 에서 참조해야 하는지 확인이 가능하다.

< Directory Entry Structure >

< Directory Entries with properties >

참고 페이지 :


'File Format' 카테고리의 다른 글

[SWF/FlashPlayer] Simple SWF File Format  (0) 2011.03.22
Posted by computists
,