__attribute__((section (section_name));
공부를 하다가 gcc 속성중에 section 이 있는걸 알았습니다.
함수 or 변수 __attribute__((section (section_name));
이렇게 하면 함수포인터나, 변수가 "section_name"이라는 section에 할당이 되는걸로 이해를 했습니다.
이 속성을 사용했을때 얻을 수 있는 장점은 어떤것인가요?
-------------------------------------------------------------------------------------------------------------------
섹션은 build 타임에 relocation 이 가능합니다. (ld 가 사용할 스크립트를 만들어주면 쉽습니다)
예를 들어 core layer 에 달린 각 sub system layer 의 initialize 함수들만 .init_sub 이라는 섹션에 몰아넣고, core 에서는 .init_sub 섹션에 있는 함수들의 entry 만 호출한다면, 각 sub system 의 intialize 함수들의 이름을 core layer 에서 알고 있을 필요가 없습니다.
리눅스 커널이 이런 방식으로 각 sub system 들을 초기화 합니다.
이럴 경우 오브젝트의 링크 순서가 상당히 중요하다는 것에 주의해야 합니다.
한발 더 나아가서,
위에서 예로 든 초기화 함수들은 처음에 단 한번만 사용되고 그 후에는 쓸 일이 없다면,
그 .init_sub 섹션이 있던 공간을 다른 용도로 재활용 하는 것이 가능하겠죠.
리눅스 커널이 이런 방식으로 RAM 을 아낍니다.
각 sub system 의 초기화 함수 뿐만 아니라 초기화 때만 필요한 데이타들까지 따로 섹션으로 가지고 있다가 초기화 과정이 끝난 후 일괄적으로 다 날려버립니다.
한발만 더 나가보지요.
ld 의 스트립트를 사용하면 각 섹션들의 base address 까지도 조정이 됩니다.
임베디드 시스템에서는 모든 조건이 열악합니다.
.text 와 .rodata 섹션은 ROM 에, .data 섹션은 SRAM 에, 위에서 예로 든 .init_sub 는 SRAM의 특정구역으로 조정해서 링크한 후에 코드 실행시 .init_sub 이 있던 공간을 깨끗하게 날리는 것이 가능합니다.
물론, 초기(bootstrap) 코드를 잘 만들어야 한다는 부담이 있다는 것에 주의해야 합니다.
리눅스 상에서 static 라이브러리를 각각의 shared object에서 인클루드하여 사용합니다. 그 라이브러리 안에는 static 변수가 하나 선언되어 있고 각각의 shared object에서는 그 변수를 공유하려합니다.
하지만 실제로 각각의 shared object에서는 각각의 static 변수를 가지게 되기 때문에 변수 공유는 불가능 합니다.
하지만 GCC에서 그런 기능을 할 수 있는 attribute를 제공합니다.
__attribute__((section("shared"), shared))) 와 같이 사용하면 그 변수를 공유할 수 있지만 위의 구문은 윈도우에서만 지원이 가능하다고 하네요...
리눅스에서 그런 방법을 사용할 수는 없을까요???
고수님들의 많은 답변 부탁드립니다.
'C & C++ 관련' 카테고리의 다른 글
gettimeofday(), clock() (0) | 2009.03.15 |
---|---|
숫자와 문자 사이 형 변환 (2) | 2008.12.28 |
popen, fread (0) | 2008.11.30 |