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