'CPU'에 해당되는 글 1건

  1. 2007.02.21 SIGBUS 시그널에 관해서...
예전에 UNIX, LINUX를 잘 모를때 대체 프로그램에서 왜 SIGBUS가 발생하는지 의문이었다. 무식하게도 예전엔 H/W 문제인줄 알았다.

몇일전 다른 PC에서 잘 돌던 프로그램이 Solaris SPARC 환경에서 계속 디진다. gdb로 왜 죽는지 찾아봤더니 SIGBUS 시그널에 의해서 디진단다. 원인은 프로그램에 있으면서도 몇일을 시스템 환경만 탓하고 있다가 정신을 차리고 자료를 찾아봤더니, 유효한 메모리 영역에서 잘못된 메모리 참조란다.

SIGSEGV는 잘못된 메모리를 참조하는 거고... 자료를 계속 찾다보니 SIGBUS 오류 나면 사람 피 말린다고 하더라 ㅡㅡ;; 나도 몇일간 그랬었고... 답답해서 ㅠ.ㅠ

암튼 원인은 다음과 같았다. 처음에는 구조체의 packing 문제인줄로만 알았는데 꼭 그런건 아니었고, 메모리에서 데이터를 패치하는데 문제가 있었던 것이다.

CPU에서 데이터를 패치할 때, 32bit냐 64bit냐에 따라서 다르고, OS에 따라서 다르다고 하는데 보통 32bit 환경에서는 4byte 단위로 데이터를 패치하는게 정석이라고 한다. 즉, 0~3, 4~7, 8~11 요런식으로 패치한다는 말씀.
여기서 중요한건 단순히 그냥 4byte가 아니고, 시작 주소가 4의 배수여야 한다는것... 즉, 동일하게 4byte를 가져오더라도 1~4 영역의 메모리에서 데이터를 fetch하면 SIGBUS 시그널이 발생할 수 있다.

그 이유는 즉, CPU는 위에 말한 것처럼 메모리에서 4byte 단위로 끊어서 데이터를 CPU에 적재하는데 1~4의 경우는 0~3, 4~7 영역에서 두번을 fetch하여 데이터를 적재해야하기 때문에 오류가 발생하는 것이란다.

암튼 2~3일간 머리 아팠던 것은 한시름 놨고... 이제 그런 구조들을 변경해야한다. 내가 지금 수정하고 있는 방법중 일부는 버퍼 내에서 레코드의 시작 주소를 4의 배수로 바꾸는 것과 버퍼에서 바로 데이터를 사용하지 않고, 임시 변수에 데이터를 복사한 후 사용하는 방법을 사용하고 있다.
Posted by 봉보리봉봉
이전버튼 1 이전버튼

블로그 이미지
봉보리봉봉

공지사항

Yesterday271
Today13
Total139,640

티스토리 툴바