FSTWikiDiff for 1.8 InitialMarkOfLinux
Login:
Password:
Join
E D R S I H P RSS
FrontPage|FindPage|TitleIndex|RecentChanges

Difference between r1.8 and the current

@@ -6,7 +6,7 @@


리눅스 커널 소스를 보다 보면 __init 등과 같은 것을 볼 수 있을 것이다.
{{{#!vim Cc
static void __init mydev_init(void) {
blabla...
}
@@ -30,6 +30,5 @@
이와 같은 inital mark를 만든 이유는 메모리 사용의 효율을 높이고자 만들어진 것이다. {{{__init}}}과 같이 드라이버의 초기화 루틴은 최초 한번 실행이 되면 더이상 사용되지 않는다. 이런 루틴이 메모리에 계속 상주하는 것은 메모리 사용 측면에서 보면 쓸모 없는 낭비이다. 그래서 {{{__init}}}이 선언된 루틴은 루틴이 실행 된 후에는 메모리 자원을 반환하여 메모리 사용의 효율성을 높인다.

{{{__devinit}}}의 경우 HOTPLUG 기능을 사용하는 경우를 위해 만들어진 것으로 HOTPLUG 기능의 경우 디바이스의 장착/제거 등에 따라 반복적으로 초기화 루틴이 사용된다. 이런 경우엔 메모리 사용을 반환하는 것은 비효율적일 수 있다. 반면에 HOTPLUG 기능을 사용하지 않는다면 {{{__init}}}과 동일한 경우에 해당되는 것이다.




Function attributor On Linux Kernel #

-- 김도집 2005-08-23 17:31:11


본 내용은 리눅스 커널 소스의 Documentations/pci.txt 내용 중 일부를 기반으로 작성된 것이다.


리눅스 커널 소스를 보다 보면 __init 등과 같은 것을 볼 수 있을 것이다.
static void __init mydev_init(void) {
 blabla...
}
보는 것처럼 static이나 void 등은 우리가 알고 있는 일반적인 C 소스에서 접한 것이다. 그런데 __init이라는 것은 생소하다.


이와 같은 매크로들은 <linux/init.h>에서 정의하고 있다. 다음의 것들은 초기화 또는 해제 기능을 갖는 것임을 알려주는 일종의 표시이다. 이들은 링크시에 특별한 섹션 테이블에 넣도록 강제한다.

inital mark설명
__init초기화 코드. 드라이버를 초기화할 때 사용될 것임을 명시한다.
__exit해제 코드, 드라이버가 모듈로 선언되지 않은 경우엔 무시된다.
__devinit장치 초기화 코드. CONFIG_HOTPLUG로 컴파일 되지 않은 경우엔 __init과 동일하며, 그렇지 않다면 그냥 무시된다.
__devexit__exit과 동일하다.

HOTPLUG 기능을 사용하는 경우엔 __init을 사용하지 않는다. 대신에 __devinit을 사용해야만 한다.

특히 PCI 디바이스에 대한 드라이버에서는 HOTPLUG 기능을 사용하게 된다. 이럴 경우엔 __devinit을 사용한다.

이와 같은 inital mark를 만든 이유는 메모리 사용의 효율을 높이고자 만들어진 것이다. __init과 같이 드라이버의 초기화 루틴은 최초 한번 실행이 되면 더이상 사용되지 않는다. 이런 루틴이 메모리에 계속 상주하는 것은 메모리 사용 측면에서 보면 쓸모 없는 낭비이다. 그래서 __init이 선언된 루틴은 루틴이 실행 된 후에는 메모리 자원을 반환하여 메모리 사용의 효율성을 높인다.

__devinit의 경우 HOTPLUG 기능을 사용하는 경우를 위해 만들어진 것으로 HOTPLUG 기능의 경우 디바이스의 장착/제거 등에 따라 반복적으로 초기화 루틴이 사용된다. 이런 경우엔 메모리 사용을 반환하는 것은 비효율적일 수 있다. 반면에 HOTPLUG 기능을 사용하지 않는다면 __init과 동일한 경우에 해당되는 것이다.

last modified 2005-11-02 18:01:19
ShowPage|FindPage|DeletePage|LikePages Valid XHTML 1.0! Valid CSS! powered by MoniWiki
0.0248 sec