2012년 10월 2일 화요일

ATA 이야기2

저번 시간에는 ATA device들과의 통신에 있어서 가장 기본이 되는 TFR(Task File Register)과 그 구성 원리에 대해 이야기했습니다. 이번에는 ATA 장치가 동작하는데 있어서 필요한 command들에 대해 각각의 특징별로 구분하는 Feature Set이라는 것에 대해서 알아보겠습니다. Feature set은 PACKET device냐 아니냐에 따라 조금 다르긴 하지만, 전 PACKET device는 다루지 않으니 본 글에서는 제외하도록 하겠습니다.
 첫 번째로 살펴볼 것은 general feature set입니다. 말 그대로 가장 일반적인 feature들입니다. ATA device는 저장 장치라고 전 글에서 언급한 적이 있듯이, 저장 장치에 일반적으로 필요한 기능이 뭐겠습니까? 바로 read/write 아니겠습니까? 그래서 general feature set을 이루는 command는 대부분 R/W에 관련된 것들입니다. 아래는 non-PACKET device의 경우 반드시 구현되어져야만 하는 command들입니다.
  - EXECUTE DEVICE DIAGNOSTIC
  - FLUSH CACHE
  - IDENTIFY DEVICE
  - READ DMA
  - READ MULTIPLE
  - READ SECTOR
  - READ VERIFY SECTOR
  - SET FEATURES
  - SET MULTIPLE MODE
  - WRITE DMA
  - WRITE MULTIPLE
  - WRITE SECTOR

 딱 보면 알 수 있듯이 R/W에 관련된 command가 대부분을 이룹니다. 하나 씩 대충대충만 살펴보도록 하겠습니다.
 EXECUTE DEVICE DIAGNOSTIC command는 device에게 알아서 자가 진단을 해보고 결과를 알려달라는 것입니다. 여기서 ATA spec.의 가장 큰 단점이라면 단점이라 할 수 있는 무책임성을 하나 발견할 수 있습니다. 그게 뭐냐면, 자가 진단을 수행하라는 내용만 있지 구체적으로 어떤 진단을 하라는 것인지에 대한 세부 내용은 없습니다. 즉 제조사 마음대로 command를 받고 자가 진단을 수행했다는 결과만 알려주면 되는 것입니다. 비밀을 알려드리자면 현재는 거의 무용지물에 가까운 녀석입니다. 그 이유는 대부분 power-on을 할 때 내부 진단을 수행하기 때문에 이 command를 받을 쯤이면 해당 동작은 거의 수행된 것이나 마찬가지이기에 현재는 이 command를 받고 별다른 동작을 수행하지 않는 것이 관례가 돼버렸습니다.
 FLUSH CACHE command는 굉장히 낯익지 않나요? 네 맞습니다. 장치의 내부 cache를 비워야 할 때 씁니다. 그러데 단순히 비우는 것만은 아닙니다. 이 flush라는 동작이 어떻게 동작하고 또 실제 어떤 의미를 지니는지에 대해서는 다음에 다루도록 하겠습니다.
 IDENTIFY DEVICE는 뭘까요? 영문 그대로 하면 '니 정체를 밝혀라!" 정도 되는데 굉장히 중요한 command 입니다. 여러분의 OS에서 장치관리자를 보면 각 장치에 대한 여러가지 정보를 볼 수 있죠? 그걸 어떻게 가져올까요? 바로 이 command를 써서 data를 가져오는 것입니다. 단일 command에서 다루는 내용으로 치자면 가장 방대하다할 만큼 양이 많으니 나중에 이 녀석을 다룰 때 다시 상세하게 쓰도록 하겠습니다. 제 생각이지만 이 command에서 다루는 data만 제대로 이해해도 ATA를 거의 이해한 거나 다름 없다고 봅니다.
 나머지 R/W 애들은 data 전송 방식의 차이만 있을 뿐 실제는 모두 장치와의 data I/O를 위한 것입니다. 이 중에 MULTIPLE 계열은 좀 독특한 방식을 씁니다. 다른 R/W command들은 sector count값에 따라 I/O의 단위를 결정하는데, 이 녀석들은 sector count * multiple sector size로 결정하게 됩니다. 무슨 의미냐면 SET MULTIPLE command로 multiple sector size를 16 sector로 주고 나서 READ MULTIPLE command로 sector count를 2를 주면 실제 read data는 2 sector가 아니라 2*16 = 32sector가 된다는 것입니다. 참 재미있는 녀석들이죠?
 마지막으로 SET FEATURE command는 전편의 글에서도 살짝 다룬 적이 있었는데, 장치들의 어떤 내부 동작에 관련된 내용들을 사용자 입맛에 맞게 변경하고자 할 때 사용합니다. 이 녀석도 양이 만만치 않으니 나중에 좀더 자세히 다루도록 하겠습니다.

 읽기만 가능한 장치들은 위에서 FLUSH CACHE와 write 계열 command만 빼고 구현하면 되는 것입니다. 위의 command set은 반드시 구현되어야만 하는 것들입니다. ATA spec.에서 중요하게 보셔야 할 단어가 두 개가 있습니다. 바로 'mandatory'와 'optional'인데 전자는 반드시 구현되어야만 하는 것들에 대한 것들이고 후자는 장치 제조업체 마음에 달려있습니다. 그러나 아쉽게도 OEM들은 spec.에 나와 있는 모든 것들이 구현되기를 바라니 사실상 'optional'은 의미가 없습니다. 전부 'mandatory'입니다.
 Non-PACKET 장치들과 PACKET 장치들의 general feature set을 위한 command 중에 아주 독특한 녀석이 한 개 있습니다. DEVICE RESET이라는 command입니다. PACKET 장치들은 위의 command를 장치의 초기화를 위하여 사용합니다만, non-PACKET 장치들은 초기화 단계가 세 개로 나누어져 있어 위 command를 지원하지 않습니다. 앞에서 살짝 언급했었는데, 후자의 장치들은 reset이 세 가지 종류가 있습니다. Power-on reset, hardware reset 그리고 software reset 등이 바로 그 것입니다. 각각을 설명하자면 이렇습니다.
 Power-on reset은 말 그대로 전원이 인가되고 나서 장치가 내부 동작을 수행한 다음 command 수행을 위한 만반의 준비가 되면 host에게 '나 준비 됐어~'라고 알려주는 TFR set을 보내줍니다. 이 모든 단계를 통틀어서 power-on reset이라고 합니다. TFR set을 언급했는데 power-on reset에 대한 응답은 특수한 값을 실어서 보내도록 규정되어 있습니다. 간단합니다. Status : 0x50, Error : 0x01, Sector : 0x01, Sector count : 0x01 등의 정보를 담아서 보내주면 됩니다. 제가 전편의 글에서 command를 보내면 항상 그에 대한 응답을 보내야만 한다고 했었죠? Host가 command를 보내지 않았는데 장치가 먼저 응답을 보내는 경우는 위의 경우 단 한 가지 뿐입니다. 가끔 장치들이 원인 모를 상태에 빠졌을 때 debugging을 위하여 TFR 값을 읽어봤더니 위와 같으면 그건 무조건 power-on reset이 걸린 상태고 이는 전압/전력 부족으로 인하여 장치가 알아서 꺼졌다 켜진 것을 의미하는 것으로 이해하시면 됩니다. 최근 저전력 장치들에 대한 수요가 높아져서 인지 이런 경우가 많이 발생하는 것 같으니 참고하시면 되겠습니다.
 Soft reset은 앞에서 살펴본 것들 중에 Device Control register에 SRST bit을 키고 보내면 동작하고, 이에 대한 응답은 power-on reset에 대한 TFR set 값과 동일합니다.
 Hardware reset은 interface 방식에 따라 조금 다르지만, PATA에서는 RESET- signal을 SATA에서는 COMRESET signal을 사용한다는 것 외에는 동일한 의미이고, TFR set도 위와 동일합니다.
 그럼 장치 내부적으로 soft와 hard의 차이는 무엇일까요? 각각의 동작을 위한 구성은 조금 복잡합니다만, 전자는 hardware block까지는 초기화시키지 않고, 후자는 hardware block까지 초기화를 진행시킨다는 차이가 가장 큽니다. 특히나 후자의 경우에는 interface block에 대하여 power-on reset과 거의 비슷한 수준까지 초기화를 진행합니다. 그런데 사실 이건 spec.에서도 명시적으로 기술해놓지 않았기 때문에 제조사의 마음에 달린 문제입니다. ATA spec.이 뭉뚱그려서 추상적인 개념만 잡아 놓고 세부 구체적인 내용에 대해서는 전부 제조사의 몫으로 떠넘겨버리는 내용이 많아서, 자의적인 해석이 얼마든지 가능합니다. 그래서 무식하고 잘 모르는 OEM과 spec. 관련 회의를 할 때면 한 대 때려주고 싶은 마음이 간절할 때가 많습니다. 자기들 멋대로 해석해서 구현해달라고 우기는 경우가 정말 많더군요.

 이상 General feature set에 대해 이야기해보았습니다. 원래 계획은 한 개 더 쓰는 거였는데, power management 쪽은 다음 글에 쓰도록 하겠습니다.

수정)
READ MULTIPLE command의 경우 전송되는 총 sector의 개수가 SET MULTIPLE에 의해 늘어나는 것이 아니라
sector count만큼의 data가 SET MULTIPLE로 지정된 DRQ data block size로 나뉘어 전송되는 것입니다.

예를 들어 DRQ data block size가 4로 지정되어 있을때
READ SECTOR command로 count field에 7을 지정하면 7개 sector가 7개 DRQ data block으로 전송되고,
READ MULTIPLE command로 count field에 7을 지정하면 7개 sector가 3개 DRQ data block로 전송됩니다 (각 4sectors, 4sectors, 1sector 크기).

쓰이는 command도 아니지만... 많은 도움 얻은 글에 아쉬운 점이 있어서 댓글 남겨둡니다.
언젠가 ATA 이야기 - 7도 올라오길 기대할게요 ^^

from blog
http://sutdaeng.egloos.com/3035261

댓글 없음:

댓글 쓰기