| [ CnUnix ] in KIDS 글 쓴 이(By): Tony (관객2) 날 짜 (Date): 2002년 3월 16일 토요일 오전 10시 42분 04초 제 목(Title): Re: [Q] sizeof 문제... 그냥 잡담입니다~~~~ #define ___swab64(x) \ ({ \ �__u64 __x = (x); \ �((__u64)( \ 걖(__u64)(((__u64)(__x) & (__u64)0x00000000000000ffULL) << 56) | \ 걖(__u64)(((__u64)(__x) & (__u64)0x000000000000ff00ULL) << 40) | \ 걖(__u64)(((__u64)(__x) & (__u64)0x0000000000ff0000ULL) << 24) | \ 걖(__u64)(((__u64)(__x) & (__u64)0x00000000ff000000ULL) << 8) | \ � (__u64)(((__u64)(__x) & (__u64)0x000000ff00000000ULL) >> 8) | \ 걖(__u64)(((__u64)(__x) & (__u64)0x0000ff0000000000ULL) >> 24) | \ 걖(__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | \ 걖(__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56) )); \ }) 요게 리눅스에 들어있는 64bit 바이트 오더 바꾸는거구요... __u64는 long long이겠죠? 쉬프트와 비트 오퍼레이션으로 돌리면 아마 성능은 가장 좋을듯 싶네요... Structure를 여러 플렛폼에서 호환성을 가지도록 전달하는 방법은 RPC를 이용하는 방법밖에 없을꺼구요...(앞에서 잠시 언급됐죠? XDR 이라는 특별한 엔코딩 방법을 사용합니다. 느리죠.... 확실히 느리죠... 대신 호환성!) 성능과 플렛폼이 정해져있다면 그냥 따로 프로토콜 정의하시고 순서대로 보내시고 순서대로 받으세요. 스트럭쳐 만들어 보내지 마시구요... byteorder만 조금 신경쓰시고.. == 여기까지가 잡담입니다 == 64bit type을 네턱으로 보내고 받으면 에러난다고 하셨는데요. 에러메시지를 보여주시면 좋겠네요. RISC타입의 CPU들의 경우 Unaligned Access이딴식의 에러 자주 접하는데요. 상당히 골치아프죠?(특히 암적인 리스크라 불리는 ARM) 받는 데이타가 말 그대로 Align되어있지 않아서 생기는 문제구요.. [ 1 | 2 | 3 | 4 ] 32bit기계에서 이런식으로 되어있어야 할 데이타가 [ ~~~~~~~~~ | 1 ] [ 2 | 3 | 4 | ~~] 이런식으로 되어있으면(포인터 찍어보면 32bit 머신이라면 4의 배수의 주소로 나와야겠죠?) Memory Bus가 32bit단위로 Access하기때문에 생기는 문제입니다. CISC들은 Memory를 두번 Access해서 읽어와서 느리지만 처리는 가능하도록 하는데 RISC들은 구현상의 오버헤드때문인지 CPU에서 Exception 튀어나오도록 되어있습니다. 이걸로 버그가 생기면 ARM에선 Bus Error인가 하는것밖에 안튀어나오기 때문에 고생하던 기억이 나는군요. == "너희는 이 곳, 이 세상을 어떻게 생각해?" "천국도 지옥도 갈 수 없는 '평범한 영혼'들이 잠시 들려 쓸쓸히 방황하는 곳이라고 생각합니다." |