도와주세요!!
글 수 15,339
2007.07.13 17:23:54 (*.92.76.130)
6669
정말 감사합니다.
역시 답답한 마음을 잘 알아주셔서 빨리 답변해주시고,
상세하게 차례차례 설명해 주셔서 정말 큰 힘이 됩니다.
내공이 확확 느껴집니다.
정리 해주신 것들로 고민해서 잘 해결 하겠습니다.
고맙습니다.
>
> <p>답변이 너무 늦지 않았나 모르겠습니다. ^^<br />
> <br />
> 또 다른 분께서 teddykim님의 말씀을 보고 이렇게 말씀을 주셨네요. ^^</p>
> <p class="jwtitle"> 1. 디버깅이 활성화한 커널을 사용 중?</p>
> <p> jffs2_reserve_space_gc 함수는 커널 소스상에서 보면 플래쉬 erase 처리 시에 나오는데..<br />
> 그 작업을 위해서 필요로 하는 메모리 할당을 요청하는작업으로 이건 디버깅 메세지니깐 <br />
> 아마도 디버깅 부분을 활성화 한 커널을 사용하는 것으로 생각됩니다.</p>
> <p class="jwtitle"> 2. 파일이 커지는 것에 대한 예상</p>
> <p> 파일이 커지는 것은 결국 정상적인 jffs2 처리에 실패했다는 의미인데,<br />
> 그렇다는 것은 메모리 할당이 지속적으로 늦어 지고 있다고 생각됩니다.<br />
> <br />
> 즉, 파일이 커지는 이유는 파일관리에 실패로 인한 깨지는 현상으로 생각됩니다.</p>
> <p class="jwtitle"> 3. system() 함수 사용 보다는 직접 복사루틴 구현 </p>
> <p> 결론적으로 메모리 할당 받는 것에 문제가 있는 것으로 생각되며,<br />
> <br />
> **** system()은 많은 메모리를 사용하므로<br />
> **** system()을 사용하여 파일을 복사하는 것 보다는<br />
> **** 직접 파일 복사하는 루틴을 작성하여 복사하는 것을 권하고 싶습니다.</p>
> <p class="jwtitle"> 4. 부팅이 안 되는 문제</p>
> <p> 더구나 NOR 플래쉬일 경우에는 플래쉬 라이트 하다가 패닉나 버리면<br />
> 즉, 플래쉬 롬이 리드상태로 종료가 되지 않은 상태에서 <br />
> 리부팅 해 버리면 부팅이 안 되는 경우가 생기게 됩니다.</p><hr />
> <p> 이상입니다. 이 분의 도움글을 정리해 보면,</p>
> <ol>
> <li> 그렇지 않아도 메모리 여유가 없는 상황이므로 메모리 소모가 많은 system()을<br />
> 사용하시는 것 보다는 직접 파일 복사 루틴을 작성하시는 것이고<br />
> <br />
> </li>
> <li> 하드웨어적으로는 파일 시스템에 할당되는 메모리말고 시스템에서 사용할 수 있는<br />
> 메모리 용량을 충분히 확장하는 것이 어떨까 합니다.</li>
> </ol>
> <p><br />
>>MCU : s3c44b0x<br />
>>Flash : AMD29LV320DB(4Mbyte)<br />
>>RAM : K4S281632<br />
>><br />
>>#cat /proc/mtd<br />
>>dev: size erasesize name<br />
>>mtd0: 00100000 00010000 “kernel”<br />
>>mtd1: 00300000 00010000 “rootfs”<br />
>><br />
>><br />
>>#df<br />
>>Filesystem 1k-blocks Used Available Use% Mounted on<br />
>>/dev/rom1 3072 1152 1920 40% /<br />
>>/dev/ram0 1979 7 1972 0% /var<br />
>><br />
>>현재 상황<br />
>>1. 사용하는 영역은 Flash 영역입니다. 파일이 업데이트 될때마다 기존에 파일을 지우고 다시 업데이트된 파일을 써야 합니다.<br />
>>2. file_a 파일의 크기는 100 ~ 300kbyte 입니다.<br />
>>3. /var/tmp 는 ram 영역이고 /usr 영역은 flash 영역 입니다.<br />
>>4. 업데이트 될 파일은 /var/tmp 에 copy 했다가 /usr/ 로 다시 copy 됩니다.<br />
>>5. copy 는 저희가 동작시키는 Application 파일에서 system 함수를 사용하여<br />
>>system(“/bin/cp /var/tmp/file_a /usr/file_a”) 이런 식으로 동작 합니다.<br />
>>6. copy 가 끝난후에는 보드를 reboot 하도록 되어 있습니다.<br />
>><br />
>><br />
>>테스트 방식(현재 디렉토리는 /var/tmp 입니다.)<br />
>>1. cp ./file_a /usr/file_a 파일의 copy 가 완료되면 명령어 재실행(10번정도하면 보드먹통되고 메시지도 안뜨고 전원리셋후 부팅가능)<br />
>>2. cp –dpR ./file_a /usr/file_a(실패)<br />
>>3. rm /usr/file_a; cp ./file_a /usr/file_a(실패)<br />
>>4. cp ./file_a /usr/file_a; cp ./file_a /usr/file_a; cp ./file_a /usr/file_a….10번반복(문제점 3의 메시지가 가장 많이뜸)<br />
>>5. 생각이 몇가지 않나는데 이 외에도 여러가지 방법을 다 해보았습니다. <br />
>>* 모든 테스트 방식은 파일사이즈가 커지거나 커지지 않으면 보드가 먹통이 되어 죽어 버립니다.<br />
>><br />
>><br />
>><br />
>>문제점<br />
>>1. 랜덤하게 /var/tmp 에서 /usr/ 로 copy 를 할 때 /usr/ 로 옮긴 파일의 사이즈가 무한정 커집니다. 아래의 상황을 참조해 주시기 바랍니다. <br />
>>#df<br />
>>Filesystem 1k-blocks Used Available Use% Mounted on<br />
>>/dev/rom1 3072 1152 1920 100% /<br />
>>/dev/ram0 1979 7 1972 0% /var<br />
>><br />
>>2. 사이즈를 확인해보면 일반적으로 랜덤 하지만 최대 400Mbyte 까지 커져있는 것을 확인 하였습니다.<br />
>>#ls –l /usr/file_a<br />
>>-r-xr-xr-x 1 0 0 413126313 file_a<br />
>><br />
>>3. 아래와 같은 메시지가 뜨면서 보드가 죽을때도 있습니다.<br />
>>jffs2_reserve_space_gc of 196 bytes for garbage_collect_dnode failed: 203653120<br />
>></p>
>
역시 답답한 마음을 잘 알아주셔서 빨리 답변해주시고,
상세하게 차례차례 설명해 주셔서 정말 큰 힘이 됩니다.
내공이 확확 느껴집니다.
정리 해주신 것들로 고민해서 잘 해결 하겠습니다.
고맙습니다.
>
> <p>답변이 너무 늦지 않았나 모르겠습니다. ^^<br />
> <br />
> 또 다른 분께서 teddykim님의 말씀을 보고 이렇게 말씀을 주셨네요. ^^</p>
> <p class="jwtitle"> 1. 디버깅이 활성화한 커널을 사용 중?</p>
> <p> jffs2_reserve_space_gc 함수는 커널 소스상에서 보면 플래쉬 erase 처리 시에 나오는데..<br />
> 그 작업을 위해서 필요로 하는 메모리 할당을 요청하는작업으로 이건 디버깅 메세지니깐 <br />
> 아마도 디버깅 부분을 활성화 한 커널을 사용하는 것으로 생각됩니다.</p>
> <p class="jwtitle"> 2. 파일이 커지는 것에 대한 예상</p>
> <p> 파일이 커지는 것은 결국 정상적인 jffs2 처리에 실패했다는 의미인데,<br />
> 그렇다는 것은 메모리 할당이 지속적으로 늦어 지고 있다고 생각됩니다.<br />
> <br />
> 즉, 파일이 커지는 이유는 파일관리에 실패로 인한 깨지는 현상으로 생각됩니다.</p>
> <p class="jwtitle"> 3. system() 함수 사용 보다는 직접 복사루틴 구현 </p>
> <p> 결론적으로 메모리 할당 받는 것에 문제가 있는 것으로 생각되며,<br />
> <br />
> **** system()은 많은 메모리를 사용하므로<br />
> **** system()을 사용하여 파일을 복사하는 것 보다는<br />
> **** 직접 파일 복사하는 루틴을 작성하여 복사하는 것을 권하고 싶습니다.</p>
> <p class="jwtitle"> 4. 부팅이 안 되는 문제</p>
> <p> 더구나 NOR 플래쉬일 경우에는 플래쉬 라이트 하다가 패닉나 버리면<br />
> 즉, 플래쉬 롬이 리드상태로 종료가 되지 않은 상태에서 <br />
> 리부팅 해 버리면 부팅이 안 되는 경우가 생기게 됩니다.</p><hr />
> <p> 이상입니다. 이 분의 도움글을 정리해 보면,</p>
> <ol>
> <li> 그렇지 않아도 메모리 여유가 없는 상황이므로 메모리 소모가 많은 system()을<br />
> 사용하시는 것 보다는 직접 파일 복사 루틴을 작성하시는 것이고<br />
> <br />
> </li>
> <li> 하드웨어적으로는 파일 시스템에 할당되는 메모리말고 시스템에서 사용할 수 있는<br />
> 메모리 용량을 충분히 확장하는 것이 어떨까 합니다.</li>
> </ol>
> <p><br />
>>MCU : s3c44b0x<br />
>>Flash : AMD29LV320DB(4Mbyte)<br />
>>RAM : K4S281632<br />
>><br />
>>#cat /proc/mtd<br />
>>dev: size erasesize name<br />
>>mtd0: 00100000 00010000 “kernel”<br />
>>mtd1: 00300000 00010000 “rootfs”<br />
>><br />
>><br />
>>#df<br />
>>Filesystem 1k-blocks Used Available Use% Mounted on<br />
>>/dev/rom1 3072 1152 1920 40% /<br />
>>/dev/ram0 1979 7 1972 0% /var<br />
>><br />
>>현재 상황<br />
>>1. 사용하는 영역은 Flash 영역입니다. 파일이 업데이트 될때마다 기존에 파일을 지우고 다시 업데이트된 파일을 써야 합니다.<br />
>>2. file_a 파일의 크기는 100 ~ 300kbyte 입니다.<br />
>>3. /var/tmp 는 ram 영역이고 /usr 영역은 flash 영역 입니다.<br />
>>4. 업데이트 될 파일은 /var/tmp 에 copy 했다가 /usr/ 로 다시 copy 됩니다.<br />
>>5. copy 는 저희가 동작시키는 Application 파일에서 system 함수를 사용하여<br />
>>system(“/bin/cp /var/tmp/file_a /usr/file_a”) 이런 식으로 동작 합니다.<br />
>>6. copy 가 끝난후에는 보드를 reboot 하도록 되어 있습니다.<br />
>><br />
>><br />
>>테스트 방식(현재 디렉토리는 /var/tmp 입니다.)<br />
>>1. cp ./file_a /usr/file_a 파일의 copy 가 완료되면 명령어 재실행(10번정도하면 보드먹통되고 메시지도 안뜨고 전원리셋후 부팅가능)<br />
>>2. cp –dpR ./file_a /usr/file_a(실패)<br />
>>3. rm /usr/file_a; cp ./file_a /usr/file_a(실패)<br />
>>4. cp ./file_a /usr/file_a; cp ./file_a /usr/file_a; cp ./file_a /usr/file_a….10번반복(문제점 3의 메시지가 가장 많이뜸)<br />
>>5. 생각이 몇가지 않나는데 이 외에도 여러가지 방법을 다 해보았습니다. <br />
>>* 모든 테스트 방식은 파일사이즈가 커지거나 커지지 않으면 보드가 먹통이 되어 죽어 버립니다.<br />
>><br />
>><br />
>><br />
>>문제점<br />
>>1. 랜덤하게 /var/tmp 에서 /usr/ 로 copy 를 할 때 /usr/ 로 옮긴 파일의 사이즈가 무한정 커집니다. 아래의 상황을 참조해 주시기 바랍니다. <br />
>>#df<br />
>>Filesystem 1k-blocks Used Available Use% Mounted on<br />
>>/dev/rom1 3072 1152 1920 100% /<br />
>>/dev/ram0 1979 7 1972 0% /var<br />
>><br />
>>2. 사이즈를 확인해보면 일반적으로 랜덤 하지만 최대 400Mbyte 까지 커져있는 것을 확인 하였습니다.<br />
>>#ls –l /usr/file_a<br />
>>-r-xr-xr-x 1 0 0 413126313 file_a<br />
>><br />
>>3. 아래와 같은 메시지가 뜨면서 보드가 죽을때도 있습니다.<br />
>>jffs2_reserve_space_gc of 196 bytes for garbage_collect_dnode failed: 203653120<br />
>></p>
>
제가 모르는 부분이라 뭐라 말씀드리기가 어려워서 오히려 제가 죄송합니다.
모쪼록 올려드린 내용이 조그마한 도움이라도 되었으면 좋겠습니다. ^^