2012년 10월 2일 화요일

ATA 이야기3

아무도 궁금하지 않으셨겠지만, 개발 과제의 controller chip이 바뀌면서 정말 많이 바빴었습니다. 항상 느끼는 거지만 hardware가 바뀔때마다 software쟁이들은 정말 매번 피똥 쌀 정도로 바빠지는 것 같습니다. Hardware쟁이님들! 설계 좀 잘해주시길... 이번에도 어쩔 수 없이 workaround code로 넘기긴 했지만 이건 아니잖아요~

 잡설은 이만하고, 이번 글에서는 power management 관련된 feature set에 대해서 이야기를 해보겠습니다.

 ATA의 PM(power management)은 크게 두 가지가 있습니다. SATA로 넘어가면 한 녀석이 더 있는데, 이는 SATA를 다룰 때 이야기하도록 하겠습니다.
 먼저 일반적인 PM feature set에 대해 얘기하자면, device의 동작 상태를 관리하기 위한 것입니다. 동작 상태? 뭐 아주 간단합니다. Device가 열심히 뭔가를 하고 있느냐, 아니면 전력 소모를 줄이기 위해 쉬고 있느냐가 각각의 동작 상태가 됩니다. 뭔가를 하고 있을 때를 active 상태라 하고 놀고 있을 때는 놀고 있는 정도에 따라서 idle, standby 그리고 sleep으로 구분합니다. Active 상태는 굳이 설명하지 않아도 이해가 가시죠? 그럼 idle, standby, sleep은 각각 무엇을 의미하는 것일까요? 쉬고 있는 상태에서 전력 소모도에 따른 단계를 구분해 놓은 것입니다. 쉬고 있는 상태에서의 전력 소모량을 나열해보자면 idle > standby > sleep 순입니다. 그런데 이건 얼마든지 뒤집어 질 수도 있습니다. 왜냐구요? 앞 글에서 썼었지만 ATA 자체가 굉장히 모호하게 기술되어 있기 때문에 제조사 마음대로 뒤집을 수 있습니다. 그러나 대체로, 아니 대부분 위에서 언급한 순서대로 사용되어집니다. ATA의 모호성을 다시 한 번 비판해보고자 살짝 곁들인 양념입니다.
 위의 쉬고 있는 세 단계는 각각의 command로 제어할 수 있습니다. 그럼 PM feature set을 위한 개념들과 command에 대해 알아보겠습니다. 

  - A Standby timer
  - CHECK POWER MODE command
  - IDLE command
  - IDLE IMMEDIATE command
  - SLEEP command
  - STANDBY command
  - STANDBY IMMEDIATE command

 그럼 차례대로 하나씩 살펴볼까요?
 먼저 나오는 standby timer라는 녀석은 host가 command를 주지 않아도 자동으로 standby mode로 들어갈 수 있도록 하기 위해 사용되는 개념입니다. 일반적인 경우에는 전력 소모를 줄이기 위한 각각의 놀고 있는 mode로 진입하기 위해서는 반드시 command가 필요합니다. 그런데 command 없이도 자동으로 standby mode로 들어갈 수 있는데, 그게 바로 이 standby timer가 만료됐을 때입니다. 그럼 언제 timer를 시작할까요? Command를 받고 나서 timer 값 동안 command가 들어오지 않으면 자동으로 standby mode로 들어가게 됩니다. 그런데 이 것이 또 애매한 것이 꼭 command가 들어왔느냐에 의해 좌지우지되지는 않는다는 사실 때문입니다. 이건 제조사에 따라 다르게 가져갈 수 있지만 통상적으로 보면 disk access에 의해 결정됩니다. 아~ HDD라는 놈은 꼭 command가 disk access를 발생시키지 않기에 경우의 수를 따져보면 복잡해지기에, 편의상 command 단위로 설명을 드린 것이니 유의하시기 바랍니다.
 Standby timer 값을 설정할 수 있는 command는 IDLE, STANDBY command 두 개가 있습니다. Timer unit에 대한 설명은 아래 표와 같습니다.
 [그림 1. Standby Timer Periods]

 CHECK POWER MODE command는 이름 그대로입니다. 이 command를 host가 보내면 device는 현재 자신의 PM mode가 어떤 것인지를 알려주게 됩니다. 그런데 제가 몇 년 동안 Windows에서 command I/O를 분석해보니 이 녀석은 거의 사용되지 않더군요. Device driver를 설계 또는 구현한 사람이 이 command의 존재를 알고 각각의 상태를 check하여 효율적으로 PM을 관리해야 하는데 그러는 것 같지가 않습니다. 왜 이렇게 되었느냐를 생각해보니, device 특히 HDD가 너무 똑똑해서 굳이 device의 상태를 check하지 않고 맘대로 command를 날려도 잘 동작하기 때문이 아닌가 싶습니다. 실제 HDD는 굳이 위 command를 받지 않고도 알아서 PM을 수행합니다. 그건 다음의 advanced power management feature set을 이야기할 때 업무상 비밀이 노출되지 않는 범위내에서 이야기하도록 하겠습니다. 최근 JMicron USB controller chip에서 이 command를 사용하는 경우를 보긴 했지만, USB protocol을 모르는 저로써는 왜 주기적으로 굳이 이 command를 보내는지 아직은 100% 이해가 되질 않더군요. 어찌됐든 제가 사용하는 경우를 목격했으니, 이 녀석의 쓰임새에 대해서 좀더 떠들어보겠습니다. Host가 CHECK POWER MODE를 보내면 drive는 자신의 PM status를 check하여 TFR의 sector count 값에 자신의 status를 실어서 응답하는 구조로 되어 있습니다. 각각의 sctor count 값의 의미는 아래와 같습니다.
  - 00h : device is in Standby mode.
  - 80h : device is in Idle mode.
  - FFh : device is in Active mode or Idle mode
 위에서 설명드렸다시피, 현재는 APM이 적용된 시점이기에 standby mode에 있지 않고서는 거의 대부분 idle mode에 있다고 보시면 됩니다. 요것도 제조사 마음대로인지라 제조사별로 idle 상태일 때 어떤 값이 올라올지는 장담할 수 없겠네요...
 나머지 command들은 각각의 세 단계로 진입시키기 위한 command들입니다. Command 명 뒤에 IMMEDIATE가 붙은 것들은 바로 각각의 상태로 진입시키기 위한 녀석들입니다. 응? 갑자기 의문점이 생기지 않으신가요? 바로 진입한다? 네 그렇습니다. 위에서 standby timer를 언급했으니 STANDBY command로 설명을 하겠습니다. 우선 STANDBY IMMEDIATE command를 날리면 device는 짤 없이 무조건 standby mode로 들어가야 합니다. 1초의 망설임도 있으면 안됩니다. 바로바로 들어가야 하지요. 그런데 그냥 STANDBY command를 보내게 되면 상황에 따라 다르게 동작할 수 있습니다. 위에서 언급한 standby timer 값 때문입니다. Timer 값을 0을 주고 STANDBY command를 보내게 되면 이건 IMMEDIATE command와 동일하게 동작합니다. 그런데 timer 값이 0이 아닌 값이면 바로 들어가지 않고 지정된 timer가 만료되었을 때 standby mode로 들어가게 됩니다. IDLE command도 마찬가지로 이 timer 값을 줄 수 있는데 이 때는 timer가 만료되어도 idle mode로 들어가는 것이 아니로 standby mode로 들어간다는 차이가 있습니다. SLEEP command는 IMMEDIATE 구분이 없습니다. 이 command를 받으면 무조건 sleep mode로 들어가야 합니다.
 그럼 여기서 잠깐 idle, standby와 sleep mode의 감이 잘 안오실테니 HDD의 동작 상태로 간략하게 설명을 해보겠습니다. Idle 상태는 HDD의 기구적으로 별다른 변화가 없습니다. Head도 disk 위에서 날고 있고 spindle motor도 돌고 있습니다. 단지 R/W 동작만 수행하지 않을 뿐입니다. 좀더 자세하게 이야기 하면 command가 오면 바로 R/W 동작을 수행하기 위한 만반의 준비를 하고 있되, 전력 소모를 위해 필요없는 clock등을 끄거나 frequency를 낮춘 상태로 대기하고 있는 상태입니다. Standby mode는 영어 본래의 뜻과는 좀 다른 상태로 있게 됩니다. 원래 standby는 준비 완료 상태를 의미하는 것인데, HDD 상에서 보면 이건 뭐 거의 죽어 있는 것이나 다름 없습니다. Head는 disk 위에 있지 않고 ramp에 나가있거나 parking zone 위에 올라가 있으며, spindle motor도 동작하지 않습니다. Clock이 살아 있는 것을 제외하고는 거의 power off 상태와 별반 다름이 없습니다. HDD에서 spindle motor가 전력 소모가 가장 많은 부분이니 PM 측면에서 보자면 거의 전력을 소모하지 않습니다. 그러면 어떤 단점이 있을까요? 통상적으로 PC에서 HDD의 ready 시간 제한을 8초 정도로 두는데, 깨어날 때 이 정도는 아니어도 꽤 많은 시간을 잡아 먹습니다. 즉 전력 소모를 줄이겠다고 수시로 standby mode로 진입시키고 또 깨어나게 하고 하면 성능에 막대한 영향을 끼치게 됩니다. 제가 경험한 embedded system에서는 전력 소모를 줄이기 위해서 갖가지 기능을 활용하면 할 수록 성능은 반비례하였습니다. 적당한 타협선이 필요한데 이 놈의 OEM들은 전력 소모도 줄여달라 성능도 높여달라고 하니 가끔은 짜증이 만발할 때도 있습니다. Sleep mode는 standby mode에서 더 많은 clock 등을 끄거나 낮춥니다. 진짜 죽은 것이나 다름 없을 정도이지요. 그럼 standby와는 어떤 차이가 있을까요? Standby mode에서는 어떤 command 든지 받을 수가 있습니다. 전력 소모는 최소로 하되 command를 받고 동작을 수행하는데 있어서 준비 상태로 있는 것입니다. 그러나 sleep mode에서는 단 한가지 command를 제외하고는 다 거부하도록 되어 있습니다. 그 한 가지 command는 바로 RESET command입니다. Sleep mode에 있다가 RESET command를 받으면 어떻게 될까요? 바로 standby mode로 진입하게 됩니다. ATA에는 state diagram이 몇개 있는데 위에서 제가 말한 내용을 이 것으로 표현하자면 아래와 같습니다.
[그림 2. Power Management State Diagram]

 뭔가 복잡한가요? 뭐 별로 복잡할 건 없습니다. 그냥 command 받으면 그 상태로 진입한다는 것과 sleep mode에서 다른 mode로의 천이는 반드시 reset이 필요하다는 것 밖에 없습니다.
 위에서 설명한 내용은 각 단계로 진입하는 부분에 대해서만 말한 것으로, 놀고 있는 mode에서 active mode로 천이할 때 한 가지 특별한 규칙이 있습니다. 그건 바로 실제 R/W access가 이루어 지지 않을 때는 굳이 놀고 있는 mode에서 active mode로 천이할 필요가 없다는 것입니다. 그럼 어떻게 access가 이루어지는지를 판단할까요? 그건 바로 앞 글에서 설명드린 data command와 non-data command인지를 가지고 판별합니다. Non-data command일 경우 access를 할 필요가 없으므로 굳이 active mode로 갈 필요가 없습니다. 또한 data command라 할지라도 cache command의 경우 hit 되었을 때는 굳이 access를 할 필요가 없으니 이 때도 active mode로 가지 않아도 됩니다. 가끔 제대로된 state diagram을 보면 설계자의 연륜과 그 완벽함에 감탄이 절로 나올  때가 있는데 ATA의 PM도 마찬가지인 것 같습니다. Access 여부에 따라 천이 여부를 결정하니깐요.


 오늘은 여기까지만 하겠습니다.... 라고 끝맺을려고 하다 보니 APM에 관련된 내용이 빠져있군요. 아놔~ APM은 업무상 비밀을 포함하고 있는 내용이 많으니 자세하게 설명하기 어렵겠네요...란 말로 회피하고 싶습니다. 아하하... 사실 별다른 것이 없습니다. 말 그대로 PM에 advanced한 기능을 집어 넣은 것 빼고는 말이죠. 이 것이 왜 들어갔는지를 생각해보니, PM에서 말하는 PM status는 active/idle/standby/sleep mode 네 가지가 있는데, 전력 소모를 줄이기 위해 뭔가를 더 세분화할 필요가 있었던 것입니다. 왜냐고요? Active와 standby와의 차이가 너무 심했던 겁니다. 무엇을 쪼갤까 고민하던 선배 engineer들께서는 한참을 고민하던 중 idle이 제일 만만하구나라고 생각하셨던 것입니다. 그래서 '야 제조사, 너네들 idle을 더 세분화켜서 전력 소모를 줄일 수 있는 방법을 연구해봐'가 되었고, 결국 idle에서 또 몇 단계로 나누어지게 됩니다. 그런데, 이건 spec.에서 따로 명시하지 않았기에 제조사별로 각기 다른 이름을 가지고 있는 듯 합니다. 현재 spec에 나뉘어진 이 세분화 단계는 01h ~ FEh까지 254 단계나 됩니다. 이 level은 SET FEATURE command로 제어를 할 수가 있습니다. 또한 SET FEATURE command로 APM을 enable/disable을 할 수 있으니, host system에 맞게 편한대로 사용할 수 있도록 만들어져 있습니다. 

 진짜 마지막이었습니다.
 다음 번엔 몇가지 feature set에 대해 더 살표보도록 하겠습니다.


뱀 뒷다리,
  한 동안 업무에 치여서 이런 글을 쓰고 있었다는 것도 까먹고 있었는데, 오늘 댓글을 보고 의욕을 살려 다시 쓰게 되었습니다.

from http://sutdaeng.egloos.com/3282269

댓글 없음:

댓글 쓰기