{{위키데이터 속성 추적}}
'''적재 가능 커널 모듈''' ({{lang|en|Loadable kernel module}}, '''LKM''')은 [[운영 체제]]에서 실행 중인 [[커널 (컴퓨팅)|커널]]을 확장하는 코드를 포함하는 목적 파일이다. LKM은 일반적으로 새로운 하드웨어([[장치 드라이버]])나 [[파일 시스템]]을 위한 지원 또는 [[시스템 호출]]을 추가하는데 사용한다. LKM에 의해 제공되는 기능이 더 이상 요구되지 않으면 메모리와 자원을 할당 해제하기 위해 언로드시킬 수 있다.

대부분의 현 [[유닉스 계열]] 운영 체제와 [[마이크로소프트 윈도우]]는 적재 가능 커널 모듈들을 지원하지만 [[FreeBSD]]의 경우 '''커널 적재 가능 모듈'''(kernel loadable module, kld), [[OS X]]의 경우 '''커널 확장'''(kernel extension, kext)<ref>{{웹 인용
 |url=https://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/KEXTConcept/KEXTConceptIntro/introduction.html
 |제목=Kernel Extension Programming Topics: Introduction
 |publisher=[[애플]]
 |date=September 1, 2010
 |accessdate=May 5, 2013
}}</ref>, 윈도우 NT의 경우 '''커널 모드 드라이버'''(kernel-mode driver)<ref>{{웹 인용
 |url=http://msdn.microsoft.com/en-us/library/windows/hardware/ff557272(v=vs.85).aspx
 |제목=What Determines When a Driver Is Loaded
 |work=[[마이크로소프트 개발자 네트워크]]
 |publisher=[[마이크로소프트]]
 |date=November 21, 2012|accessdate=May 5, 2013
}}</ref>처럼 각기 다른 이름을 사용할 수 있다. '''커널 적재 가능 모듈'''(Kernel Loadable Modules, KLM)이라고도 하며 간단히 '''커널 모듈'''(Kernel Modules, KMOD)로도 부른다.

비록 이들이 서로 다른 이름을 사용하고 있기는 하지만 대부분의 유닉스 계열 시스템들과 윈도우(커널-모드 드라이버)는 적재 가능 커널 모듈을 지원한다.

== 장점 ==
적재 가능 커널 모듈 없이는, 운영 체제는 모든 가능한 예상되는 기능들을 기본 커널에 직접 포함해야 할 것이다. 이것들은 사용되지 않는 동안에도 메모리에 상주함으로써 메모리를 낭비하고 사용자의 리부팅 시간을 늘린다. 적재 가능 커널 모듈을 지원하는 대부분의 운영 체제들은 요구되는 기능들을 지원하기 위해 모듈들을 포함한다.

== 단점 ==
모듈러 커널에 대한 비판으로써 일명 [[단편화]] 페널티가 있다. 베이스 커널은 항상 자신의 설치 루틴들에 의해 실제 인접한 메모리에 언팩되어 있다. 그래서 베이스 커널은 절대 단편화되지 않는다. 만약 모듈들이 삽입되면 새로운 커널 코드 삽입은 커널을 단편화시킬 수 있고 이것은 작은 성능 페널티를 유발할 수 있다.

== 운영 체제들에서의 구현 ==
=== 리눅스 ===
리눅스에서 적재 가능 커널 모듈은 <code>modprobe</code> 명령어에 의해 적재되고 적재 해제된다. 이것들은 <code>/lib/modules</code> 에 위치하며 커널 버전 2.6부터는 확장자 <code>.ko</code> ("kernel object")를 갖는다.<ref>{{웹 인용
 |title=The Linux Kernel Module Programming Guide, section 2.2 "Compiling Kernel Modules"
 |url=http://tldp.org/LDP/lkmpg/2.6/html/x181.html
 |accessdate=2011-10-14
}}</ref> <code>lsmod</code> 명령어는 적재된 커널 모듈들을 보여준다. 긴급 상황에서(시스템이 깨진 모듈들 때문에 부팅에 실패하는 경우 등) 특정한 모듈들은 커널 부트 파라미터 리스트를 수정함으로써 활성화되거나 비활성화될 수 있다. 예를 들면 [[GRUB]]을 사용하는 경우 시작 메뉴에서 'e'를 누르면 커널 파라미터 라인을 수정한다.

== 바이너리 호환성 ==
리눅스는 커널 모듈들을 위한 안정적인 [[API]]나 [[응용 프로그램 이진 인터페이스|ABI]]를 제공하지 않는다. 이것은 다른 커널 버전에서 다른 내부 구조가 존재한다는 것이고 호환성 문제를 유발한다. 이 문제를 해결하기 위해 심볼 버저닝 데이터가 적재 가능한 [[ELF 파일 형식|ELF]] 모듈들의 <code>.modinfo</code> 섹션 내에 위치한다. 이 버저닝 정보는 모듈을 로딩하기 전에 비교될 수 있다.

[[솔라리스 (운영 체제)|솔라리스]], [[FreeBSD]], [[OS X]] 그리고 [[마이크로소프트 윈도우|윈도우]] 같은 다른 운영체제는 커널 API와 ABI를 상대적으로 안정적으로 유지해서 이 문제를 피한다.

== 보안 ==
적재 가능 커널 모듈이 실행중인 커널을 수정하는 편리한 방식인 반면에 이것은 공격자에 의해 남용될 수 있다. 많은 [[루트킷]]들이 자신의 방식으로 LKM을 사용한다. LKM을 적재할 때 확장된 권한을 요구함으로써 대부분의 운영 체제 모듈들은 어떠한 방식으로도 권한 확대를 돕지 않는다는 점을 주의하자.<ref>[http://www.ouah.org/reiterlkm.htm Exploiting Loadable Kernel Modules]</ref>

=== 리눅스 ===
리눅스는 sysctl 옵션 <code>/proc/sys/kernel/modules_disabled</code>을 통해 모듈 적재를 비활성화 한다.<ref>{{웹 인용
 |title      = Sysctl/kernel.txt
 |url        = http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=Documentation/sysctl/kernel.txt;hb=HEAD
 |accessdate = January 4, 2013
}}{{깨진 링크|url=http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux.git%3Ba%3Dblob%3Bf%3DDocumentation%2Fsysctl%2Fkernel.txt%3Bhb%3DHEAD }}</ref><ref>{{웹 인용
 | url = http://www.outflux.net/blog/archives/2012/11/28/clean-module-disabling/
 | title = Clean module disabling
 | date = 2012-11-28 | accessdate = 2013-12-12
 | author = Kees Cook | publisher = outflux.net
}}</ref> [[initramfs]] 시스템은 부팅에 요구되는 특정한 모듈들을 로드하고 이후에는 모듈 로딩을 비활성화시킨다. 이것은 보안을 모놀리딕 커널과 매우 유사하게 만들어 준다. 만약 공격자가 initramfs를 변경할 수 있다면, 그들은 커널 바이너리를 변경할 수 있게 된다.

== 각주 ==
{{각주}}

== 외부 링크 ==
* {{언어링크|en}} [https://web.archive.org/web/20080726100219/http://www.ibm.com/developerworks/linux/library/l-lkm/index.html?ca=dgr-lnxw07LinuxLKM&S_TACT=105AGX59&S_CMP=GR Anatomy of Linux loadable kernel modules], IBM DeveloperWorks, July 16, 2008, archived from the original on July 26, 2008
* {{언어링크|en}} [http://www.osx86.net/ Online kext database for OSX / Hackintosh] {{웨이백|url=http://www.osx86.net/ |date=20151219165503 }}
* {{언어링크|en}} [http://en.tldp.org/LDP/lkmpg/index.html Ori Pomerantz, Linux Kernel Module Programming Guide]
* {{언어링크|en}} [https://web.archive.org/web/20080620210028/http://www.linux.org/docs/ldp/howto/Module-HOWTO/copyright.html Copyright Considerations With LKMs], 2008, archived from the original on June 20, 2008
* {{언어링크|en}} [http://developer.apple.com/mac/library/documentation/Darwin/Conceptual/KEXTConcept/KEXTConceptIntro/introduction.html "Kernel Extension Programming Topics" document for OS X] {{웨이백|url=http://developer.apple.com/mac/library/documentation/Darwin/Conceptual/KEXTConcept/KEXTConceptIntro/introduction.html |date=20100409123509 }}

{{운영 체제}}
{{리눅스 커널}}

[[분류:FreeBSD]]
[[분류:리눅스 커널]]
[[분류:운영 체제 커널]]