__attribute__는 GCC 컴파일러에 있는 메커니즘으로 컴파일러에게 추가적인 에러 체킹 같은 것을 하도록 지시하는 것이다.

형식 : __attribute__(x)
괄호 안의 x에는 가능한 몇 가지들이 있는데 특히, packed는 채우라는 의미이다:
typedef struct
{
    char a;
    int b;
} myST;

위 구조체의 sizeof(myST)는 8이다.
상식적으로 char =1byte, int = 4byte이므로 5가 나와야 하는데.. 
이런 문제 때문에 구조체를 가지고 작업할 경우 예상치 못한 버그로 고생을 가끔한다.
이런 현상이 생기는 이유는 현재 사용하고 있는 컴퓨터가 32비트이기 때문이다. 즉, CPU가 메모리 어드레스를 지정할 때 4바이트(32비트/8) 단위가 내부적으로 가장 최적화되어 빠른 데이터 접근을 가능하게 한다. 4바이트 배수 단위가 아닌 경우 당연히 접근은 가능하지만 속도 차이가 있어 디폴트로 저런 접근을 하도록 해 둔 것이다.

그럼, 메모리에 저 구조체가 잡힐 경우 어떻게 존재하느냐는 4바이트 단위로 채워지기 때문에 char a;는 1바이트이지만 4바이트를 할당해서 거기다 char a;를 담아둔다. 다음 int b;는 4바이트므로 그냥 4바이트를 할당한다. 이렇게 해서 8바이트의 크기가 필요한 것이다.

첫 char a;에서 1바이트를 제외한 나머지 3바이트는 어떤 걸로 채워질까? 의미없는 값이 채워진다. 그냥 공간만 예약되는 것이다. 그래서 이런 현상을 방지할 수 있도록 컴파일러는 __attribute__ (packed) 메커니즘을 두어서 우리가 예상한 (1바이트+4바이트) 크기가 되도록 빌드한다:
typedef struct
{
    char a;
    int b;
__attribute__((packed)) myST;

결국, 위 처럼 사용하게되면 컴파일러는 구조체 멤버의 실제 크기 만큼 할당한다. 그래서 정확한 5바이트가 나오게 된다. 물론, 속도는 약간 더 늦어진다.

여기에서 __attribute__라는 의미는 컴파일러에게 특성을 주겠다는 것을 의미하며 괄호 안은 여러 가지가 가능한데 여기서는 그 중 한가지인 구조체 정렬을 사용하겠다는 의미인 packed를 사용했다.

packed의 의미는 꽉 채우다라는 것인데 이 기능을 사용하지 않았을 경우 char a;는 실제 1바이트 외에 나머지 3바이트가 자리만 차지한 채 남아있다. 이런 비어있는 것들을 제거해서 구조체 멤버들이 빈 자리없이 꽉 채우라는 단어 의미이다. 이런 것을 구조체 정렬(alignment)이라고 한다.

위는 unix/linux의 GCC에서 사용하는 것이고 윈도우 상의 비주얼 씨의 경우는
#pragma pack(1)

처럼 사용한다. 괄호 안의 의미는 1바이트 단위까지 체크해서 빈 자리가 없도록 차곡차곡 채우라는 것이다. 4가 올 수도 있겠지만 그렇게 되면 가장 작은 단위가 4가되어 char 형 같은 경우 역시 4로 채워지게 되어 낭패이다. 따라서 확실한 경우 아니면 위 처럼 사용하면 된다.

출처: 지식IN(edson)

'Developer's Infos > Linux Programming' 카테고리의 다른 글

pci-driver  (0) 2011.10.10
add_wait_queue()/remove_wait_queue()/schedule() 설명 및 사용법  (0) 2011.10.10
[Linux] asmlinkage  (0) 2011.09.30
[Shared Memory] shmget() 공유 메모리 생성  (0) 2011.09.06
PCI Driver Flow  (0) 2011.09.05
Posted by 삼성동고양이
커널 소스를 보다보면 asmlinkage로 선언된 함수들을 볼 수 있다.
asmlinkage는 어셈블리 코드에서 직접 호출(링크)할 수 있다는 의미이며
커널 소스의 <include/linux/linkage.h>에 다음과 같이 정의되어 있다.

#include <linux/config.h>
#include <asm/linkage.h>

#ifdef __cplusplus
#define CPP_ASMLINKAGE extern "C"
#else
#define CPP_ASMLINKAGE
#endif

#ifndef asmlinkage
#define asmlinkage CPP_ASMLINKAGE
#endif

...

그렇다면 어셈블리 코드에서 직접 호출할 수 있다는 것은 무엇을 의미할까?
일반적으로 C 함수는 어셈블리 코드에서 별 어려움없이 호출할 수 있지만
함수의 인자를 넘기거나 리턴값을 받는 부분 등의 호출 규약이 필요하다.

레지스터에 여유가 있는 ARM이나 MIPS 등의 아키텍처에서는
함수의 인자를 넘길 때 특정 레지스터를 사용하도록 호출 규약이 정의되어 있지만,
그렇지 못한 x86 아키텍처에서는 때에 따라 레지스터, 스택 혹은 별도의 메모리 영역에
함수의 인자를 저장하여 넘길 수 있도록 지원한다.

당연히 인자를 레지스터에 저장하여 넘기는 방식이 빠르기 때문에 (fastcall)
최적화 옵션을 켜고 컴파일하는 경우 인자를 레지스터를 통해 전달하도록
함수의 호출부와 구현부를 변경해 버릴 수 있다. (일반적인 최적화 방법)
이 경우 GCC를 통해 자동 생성되는 코드는 적절히 변환되므로 문제가 없을테지만
직접 작성한 어셈블리 코드에서 함수를 호출하는 경우 문제가 발생하게 된다.

이 경우를 방지하기 위해 어셈블리 코드와 링크되는 함수는
인자를 (레지스터를 이용하지 않고) 스택을 이용해서 전달하도록
선언하는 데, 이 때 asmlinkage가 사용된다.

위의 코드에서 <asm/linkage.h> 파일을 #include 하고 있는 것에 주의하자.
대부분의 아키텍처에서 이 파일은 asmlinkage를 정의하지 않지만
i386에서는 다음과 같이 정의한다.

#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
#define FASTCALL(x) x __attribute__((regparm(3)))
#define fastcall __attribute__((regparm(3)))

regparm 속성은 레지스터를 이용하여 전달한 인자의 수를 지정한다.
asmlinkage로 선언된 경우 모두 스택을 이용하고 (레지스터로 0개의 인자 전달)
fastcall로 선언된 경우 최대 3개의 인자를 레지스터로 전달한다.
(이 경우 EAX, EDX, ECX 레지스터를 이용하며, 인자는 정수형이어야 한다.)


출처 :  
http://studyfoss.egloos.com
Posted by 삼성동고양이


호주의 백패커 라이프라는 이름으로 호주에 있었을 때의 사진을 포스팅 하려고 합니다. 우선 아래 손가락 하나 꾸~욱 눌러주고 읽어주세요.^^/

>>>>>>><<<<<<


호주에는 백패커(Bachpacker)라는 이름의 여행자 숙소가 가장 보편적입니다. 여행자들에게는 그리 부담 가지 않는 금액(당시 한 2만 얼마~5만원 정도?, 몇인실인지, 기숙사 형태인지에 따라서 가격이 많이 다름)으로 하룻밤을 지낼 수 있을 뿐더라, Part Time Job, 혹은 여행의 정보를 얻기 위해 좋은 장소이죠. ^^ 호주에서 지내는 첫 날밤, 찍은 사진들이 있어서, 그 사진들로 포스팅 해볼 까 합니다.
사진이 좋지 않은건 용서해 주세요. 당시에 너무 어두웠고 사진 찍을 줄도 몰라서 그냥 막찍었었거든요. ㅠㅠ 제가 아는 최대한 보정을 하였는데 이정도 밖에 안되네요. ㅠㅠ 더 볼수 없을 만한건 그냥 사진을 올리지 않았어요.^^;




보통 백패커의 모습은 위와 같습니다. 저방과 같은 경우에는 4인실인데, 관리자의 실수로 8인실을 예약해 달라고 한 것을 8인실 돈을 받고 나니, 8인실 방이 비어 있지 않다는것을 확인하고는 미안하다고 4인실 혼실(남,녀 같은 방을 쓰는...)을 쓸 수 있게 해주더라구요.^^ㅋㅋㅋ 혼실은 그렇게 많이 많지 않은데 운이 많이 좋았나 봅니다.ㅋㅋㅋ 거기에 가격도 많이 쌌어요. 

저 백패커가 이름이 어디었는지는 기억이 잘 안나요. ㅠㅠ 시드니에서 가장 오래 되었었는데 죠지 스트릿에 있었나...?+_+ 하도 오래 되다 보니까 인상적인건 플러그에 한국말, 일본말 영어, 중국어로, 너무 많이 꽂지 마세요, 건물이 오래되서 전기가 끊길 수 있어요. 라고 쓰여져 있었어요.ㅋㅋㅋ 방안에 어떤 여자애가 클럽을 가려고 하는데, 같이 클럽을 가자고 해서 같이 클럽을 갔었죠.^^
 




















참 보잘것 없는 그런 공간에서 참 잼있께 놓았떤거 같애요 맥주도 많이 마셨는데 그리 싸지 않았는데, 다음날 후회를 했었죠. 첨보는 사람인데, 저렇게 친구 친구 그러면서 술 값도 내주고, 서로 춤도 추고 춤 못춘다니까 괜찮다고 같이 흔들자구 부비부비~ㅋㅋㅋㅋㅋ 저 백패커에서는 남녀 혼숙에 참고로... 18이긴 한데... 저한테 같이 클럽가자고 한 여자애는 남자애를 데리구 와서 저희 있는데 방안에서 하룻밤 사랑을 하더라구요. 물론 불은 껏구 우리는 잔다고 하고 자는 척을 했죠. 뭐 그나라 그렇게 노는데 제가 뭐... 그럴순 없어서 저도 자는척 했죠. ^^; 잼있는 일도 많았던 호주... 다시 놀러가고 싶은데, 회사 생활도 바쁘고... 쓸 수 있는 휴가도 그렇게 많지도 않고...ㅠㅠ 





'Overseas' 카테고리의 다른 글

[필리핀 세부 음식] 세부에서 먹었던 이색 음식  (0) 2011.09.20
Posted by 삼성동고양이


필리핀에서 먹었던 이색적인 음식 두개를 소개하려 합니다. ^^; 아는 분은 아시겠지만, 정말 이색적인 음식 두개 인데요. 사실 이색적이라고 얘기하면 좋게 표현하고 약간 느꼈던 느낌대로 표현 하자면, 약간 엽기적인...? 그러나 우리나라 보신탕 처럼 몸을 보신하는(오해는 마세요^^: 보신탕 안먹어봤습니다;) 몸에 좋은 음식입니다. 제가 다녀온건 2007년 7~9월이었기 때문에, 기억이 가물 가물 할 수도 있습니다. 기억을 되살려 포스팅해보겠습니다.^^


손가락 한번 클릭해 주세요~^^
 



1. 발룻
 학원 앞에서 밤 시간이되면 "참살~떡 메밀~묵" 이러는 아저씨 처럼 똑같이 생긴 플라스팅 보온 통을 매단 자전거를 끌면서 어떤 필리피노 아저씨는 이렇게 외칩니다. "발룻~~~~ 발룻~~~~~" . 발룻이란 계란을 부화시켜서 삶아 먹는 음식인데요. 14일 부터 21일 까지인가? 이렇게 일자별로 부화를 시켜서 먹는 것으로 기억하는데요. 아래에 사진을 보면 줄이 4개 그어진 것을 알 수 있습니다. 그 뜻은..14일 부화시켜 삶은 발룻이다~라는 거죠~

줄이 4개 그어져 있죠?^^





 안에 까면 이런 모습니다. 그리고 저 아는 분들이 이 포스트를 보실까봐 말씀드리는데, 저 손과 다리는 제 친구입니다. .... 한마디로 제털 아닙니다.. -_-; 암튼 저 14일 발룻은 저정도로 먹으면 약간 고기맛이 나는거 같기도 한데, 전 경험삼아 한번 먹어봐야 한다!!!하면서.. 그냥 두번 씹고 꿀떡 삼켜서 기억이 잘 안납니다. ;;; 근데 19일인가? 21일 정도 된거 먹으면 뼈도 나온다고 하더군요.. 뼈 털 부리 다 있는 발룻도 있다고 들었습니다. ^^;;;





2. 수컷 넘버 5 
 이 수컷 넘버 5는... 가명(저희들이 그냥 칭하던 음식이름, 원래 이름은 기억이 안나요.;;; )인데요^^; 스프의 형태를 하고 있습니다. 아래에 보이는것과 같이 대나무 입으로 싼 밥 두개와 저 수컷 넘버 5 스프를 주는데요, 맛은 짭짜름하면서 조그만 고기들이 들어가 있는게, 제 입맛에는 상당히 괜찮았습니다. 가격도 얼마 안하고 저렴하고, 또 저거 한그릇 먹고 점심시간에 잠깐 자구 일어나면 필리핀 무더위 속에서 지쳐있다가도 힘이 불끈 솟았답니다.^^;

 이 음식의 재료는... 제대로 기억을 못할 수도 있지만, 제 기억상으론 소, 말, 돼지, 개, 염소 세 마리의 고환(... 무슨 뜻인지 아시죠? ^^; 남자만 있는, 수컷만 있는...;;;)으로 만든 건강식 입니다. ^^;;; 우리나라도 먹나요?;; 다 버리나?;; 근데 맛도 괜찮은 편이었고, 먹고 나면 몸이 좀 개운해 지는게 뭐 생각하시는 것과 같이 ^^; 남자에게는 정력에 좋고, 여자에게는 피부에 좋다는...말은 들었네요^^;;;;;;;;  친구들이 장난으로 여자애 한명을 데리구 가서 먹은 다음에 음식물 내용을 얘기를 해줬더니 바로 토를 했다는... 얘기를 들었습니다. ㅋㅋㅋㅋㅋㅋㅋ 그래서 저도 제가 좋아하는 필리피나 선생님 한분을 모시고 시도를 했는데(다른 지역 사람은 모르는거 같더라구요. ^^;;ㅎㅎㅎ) 실패를 했죠... 끝까지 이게 뭐냐고 물어보길래 사실대로 불었습니다. ㅠㅠ 한 2~3번 정도 먹었던거 같은데 정말 인상적이었던 음식이었어요. ^^;ㅎㅎㅎ



요건 쎄븐업 그랑데(필리핀에서는 1리터 병을 그랑데라구 불러요~), 그리고 필리핀에서 쓰던 제 핸드폰~~~ 중국에서도 인도에서도 유용하게 썼죠~~~ㅋㅋㅋ Unlock해서...ㅋㅋㅋ

모두 그냥 가시지 마시구 손가락 한번 눌러주고 가세요~~~
 

'Overseas' 카테고리의 다른 글

[호주 Sydney] Backpacker Life~!  (0) 2011.09.25
Posted by 삼성동고양이


  •  
  • c Syntax 


    10 1 10 127

    00001010 00000001 00001010 01111111


     
    then the 32 bit binary number as one single integer has the decimal value.

    1010000000010000101001111111(bin) = 167840383(dec)

    you can programmatically convert between these number systems in either direction. consider (and understand) this snippet:
     

    unsigned int  ipAddress = 167840383;

    unsigned char octet[4]  = {0,0,0,0}; 

    for (i=0; i<4; i++){

       octet[i] = ( ipAddress >> (i*8) ) & 0xFF;

    }

    unsigned int  ipAddress = 167840383;

    unsigned char octet[4]  = {0,0,0,0};


    for (i=0; i<4; i++)

    {

        octet[i] = ( ipAddress >> (i*8) ) & 0xFF;

    }



    now you have the four octets as unsigned chars in the "octet[]" array (char is just an 8-bit integer), and you can print them in the decimal dot format: 

    c Syntax (Toggle Plain Text)
     

    printf("%d.%d.%d.%d\n",octet[3],octet[2],octet[1],octet[0]);printf("%d.%d.%d.%d\n",octet[3],octet[2],octet[1],octet[0]);






    Posted by 삼성동고양이
    이전버튼 1 2 3 4 5 6 이전버튼