'2008/11/02'에 해당되는 글 1건
임베디드 제품의 업그레이드 이야기 :: 2008/11/02 20:32 by 구도훈(17기)
fota가 업데이트에 관련된 내용이다 보니 업데이트 방법에 대해서 생각해 보게 되는군요.
상용 임베디드 제품의 소프트웨어 업데이트 방법에 대해서 몇가지 적어봅니다.
[업그레이드 대상]
우선 대상을 몇가지 적어볼까요?
32비트 프로세서 기준으로 보면 아래와 같겠죠.
1. 부트로더
2. 커널
3. 어플리케이션영역(+라이브라리,+파일시스템)
[업그레이드는 누가?]
32bit 프로세서를 가진 시스템의 업데이트는 대부분 업그레이드 모듈이 따로 존재하죠.
네트웍을 이용한 업그레이드나 USB 메모리 스틱을 이용한 업그레이드가 흔한 기법입니다.
네트웤을 이용한 업그레이드는 부팅할때 서버에 업그레이드 이슈가 있는지 확인해서 업데이트를 하겠죠.
USB 메모리 스틱을 이용하는 경우는 시스템에서 해당 USB 에 약속된 파일이 있는지 검사해서 업데이트를 하는 방법이 많이 쓰이죠.
[업그레이드 시 고려사항]
그러면 업그레드시 무엇을 고려해야 할까요? 몇가지 적어보죠.
1. 신뢰성
2. 시간
3. 효율성
[각각의 대상에 대한 이야기]
1. 부트로더
사실 부트로더는 성격상 업데이트할 일이 거의 없습니다. 부트로더가 하는 대부분의 일을 커널에서도 할수있다는 점에서 말이죠. 만약 수정할 게 있다면 화면 출력을 갖는 시스템의 이미지 파일 정도이겠죠. 시스템을 키고 부팅 시간이 너무 길게 되면 이미지 라도 사용자에게 보여 줘야 하는 일이 있겠죠?^^ 하지만 이미지 파일도 부트로더에 포함시키보다는 특정 영역에 위치 시키기 때문에 거의 수정할 일이 없습니다.
2. 커널
커널업그레이드의 경우 대부분 드라이버를 커널 이미지에 포함시켰는데, 드라이버 수정이 있을 때 발생하겠죠.
-간단한 방법으로는 플래시에 똑같은 크기의 커널 영역을 두 개 잡아 넣고 서로 스위칭 하는 방법이 있죠. 현재 A 영역의 커널을 쓰고 있으면 B 영역에 새 커널 이미지를 덮어 씌우고 부트로더에서 커널로 점프 하는 위치를 스위칭 하는 방법이죠. 하지만 항상 안 쓰는 영역이 있게 되므로 공간 낭비가 큰 단점이 있죠.
위의 방법은 리눅스 커널이미지인 경우 요즘 플래시 값이 싸져서 할 수 있다고 쳐도 windows CE 이미지인 경우 용량이 상당히 커서 참 곤란합니다. 다른 방법을 알아보죠.
-업그레이드만 수행하게 하는 커널 이미지를 만듭니다. 사용자 어플리케이션에서 업그레이드 완료 전에 시스템이 비정상 상태가 될 경우 업그레이드만 수행하게 하는 영역으로 부팅하게 해놓고 시작하는 거죠. 앞서의 방법과 같이 영역을 두 개 잡는건 동일 하지만 업그레이드만 담당하게 함으로서 용량을 최소화 할 수 있는 것이 앞서의 방법에 비해 장점이죠.
-마지막으로 커널 생성시 변경이 예상되는 부분에 패딩 영역을 둬서, 바뀐 부분만 바꾸는 방법이 있다고 합니다. 저도 해보지 않아서요.^^ 앞서의 방법들은 커널 이미지 전체를 바꾸는 것에 비해 이것은 바뀐 부분만 변경 하니 효율적일수 있겠죠. 패딩 크기도 예측하는 수고가 필요하겠네요. 그리고 부분 수정을 해야 하니 버젼 관리가 상당히 중요하겠군요.
3. 어플리케이션 영역
어플리케이션 영역의 경우는 업그레이드 실패가 발생하더라도 부트로더나, 커널에 비해 되돌리기가 쉬워서 수월할 수 있는데요. 특성상 다른 프로그램과 유기적으로 돌아가는 경우가 있어서 버젼 관리가 중요하죠. 업그레이드가 단계적으로 될 수 있는 환경이면 바뀐 부분만 그때 그때 적용하면 되지만, 사용자가 버젼 1.0에서 3.0으로 바로 업그레이드 하는 수도 있으니 이런 것을 고려해서 업데이트를 해야겠죠. 참! 플래시 파일 시스템을 사용하면서 빈번하게 rw 하는경우 wear leveling이 중요하니 어플리케이션 롬 이미지를 새로 write는 것은 피하시길..!!!
