ata command에서 컴퓨터를 종료할때 발생하는 sequence가 있나요?
글쓴이: neounivers / 작성시간: 월, 2010/09/27 - 7:55오후
컴퓨터가 전원이 꺼질때 발생하는 ata command가 따로 있는지 궁금해서
질문을 올립니다. command set을 찾아보고는 있지만 전원이 꺼질때 write cache를 flush 시킨다든지 하는
필요한 일련의 과정을 처리해주는 명령어가 따로 보이지 않습니다.
생각해보면 device가 컴퓨터가 종료된다는 사실을 알 필요도 없을거 같기도하구요....
(일련의 필요한 명령을 전달만 해주면 되지 않을지 하는...)
protocol analyzer가 있다면 좋겠지만 없기 때문에 이를 사용할 수는 없고요
혹시 컴퓨터가 종료되면서 발생하는 일련의 명령 sequence가 있다던지 또는 특정 명령어가
따로 존재하는지에 대해 아시는분 있으시면 알려주시면 감사하겠습니다
Forums:
펌웨어 개발을 준비하시나요?
당연히 있을꺼 같은데요.
시스템에서 interrupt가 발생하면, 받아서 해드 정렬하고, 하드 재우고..
^^;; 돌은 던지지 말아주세요.. 지금 구글링 하고 있답니다.
아..
http://sutdaeng.egloos.com/3282269
??
정리를 잘 해놓으셨군요... 참고해야겠어요...
http://sutdaeng.egloos.com/3282269 <= 북마크 했네욤.
모두들 행복하세요~
드라이버
드라이버 개발자맘입니다. BSD를 예로 들면, device method 의 hook 중에 shutdown 이란 것이 있는데 이 hooker 는 OS 가 shutdown 시에 자동으로 불립니다. 즉 드라이버 개발자가 이 부분을 구현했냐 안했냐 정도겠죠.
리눅스도 비슷한 역활을 하는 것이 있을 겁니다.
펌웨어를 만들고자
펌웨어를 만들고자 하는 것은 아니고
power loss가 발생했는지를 확인하고 recovery하는 알고리즘을 만들고자 합니다
power loss가 발생했는지 우선 판단을 해야 하는데 그걸 위해 어떻게 알수 있는지
궁금해서.... 찾아보고 있는데 힘드네요
os단에서의 일보다는 하위 디스크로 들어가는 어떤 커맨드가
전원이 정상적으로 꺼지게 하는가를 알기 위한 기준이 필요합니다
정확히 어떤건진
정확히 어떤건진 모르겠는데 그런게 있는 거 같습니다. 그런데 그게 ACPI 하고 관련 있는 거 같기도 하고...
일반적인 경우에 보니 시스템 종료 다 한 뒤에...(파일 시스템 unmount 까지 하고)
Shutting down sda...
Shutting down sdb...
이러면서 하드 전원 턱 턱 내려가고 나서 컴퓨터가 꺼지던데요. 예전에 컴퓨터가 좀 느릴 때는 저 메세지를 다 볼 수 있었는데 요즈음엔 왜 그런지 저 메세지가 나오지도 않는데 하드가 순차적으로 팍팍 내려가면서 전원이 꺼지더군요. 결론적으로 예전 DOS 시절에 parking 프로그램과 같은 역할을 하는 어떤 명령이 있는 것은 같습니다. 그게 수행된 후 컴퓨터가 꺼지니까요.
중요한건 이게 모든 HDD에서 작동하는 것인가 하는 건데 지금 까지 제가 본 HDD 중에서 아주 오래된 기종을 제외하면 전부 작동했습니다.
-- 사랑천사 --
LECL | Blog
yeosong@gmail.com
yeosong@gmail.com(네이트온) ysnglee2000(Skype)
사람천사
ATA 표준 명령어로 parking이 가능합니다.
아주 옛날에 만든건데... 참고하시면 도움이 되실꺼에요...
아래 함수를 호출하기전에 flush등은 모두 끝내고 해야하겠지요... ^_^
사용법:
shutdownIdeDisk("/dev/sda");
소스:
static int shutdownIdeDisk(const char *devpath)
{
#ifndef WIN_SLEEPNOW1
#define WIN_SLEEPNOW1 0xE6
#endif
#ifndef WIN_SLEEPNOW2
#define WIN_SLEEPNOW2 0x99
#endif
uint8 args1[4] = {WIN_SLEEPNOW1, 0, 0, 0};
uint8 args2[4] = {WIN_SLEEPNOW2, 0, 0, 0};
int32 fd;
if ((fd = open(devpath, O_RDWR)) < 0) {
return -1;
}
if (ioctl(fd, HDIO_DRIVE_CMD, &args1) &&
ioctl(fd, HDIO_DRIVE_CMD, &args2)) {
return -1;
}
return 0;
}
모두들 행복하세요~