리눅스 커널 소스 (4.8)에서 default 커널 모듈들을 로딩시키는 부분의 파일 라인이 어디인가요?

ihjkoh의 이미지

video, ip_tables, bluetooth와 같은 기본적 모듈들이 소스코드의 어느 부분에서 로딩되는지 찾지를 못하겠습니다. 이 모듈들은 /bin/kmod를 이용해서 로딩되지 않습니다. 왜냐면 kmod 소스코드 파일을 수정해서 kmod가 로딩하는 모든 모듈들의 이름을 별도의 파일에 출력하도록 했는데, 이 로그파일에는 부팅 후 단 10개 남짓의 모듈들만 프린트될 뿐, 부팅 후 lsmod 명령어로 출력되는 모듈들 중 절반 이상은 이 파일에 출력되지 않습니다.

커널 소스의 어느부분에서 초기 모듈들을 로딩시키나요? 리눅스 커널에 유능하신 분께서는 부디 가르침을 주시길 부탁드립니다. 다

구체적으로, make menuconfig 안의 Device Driver 섹션 안에서 모듈로 설치하도록 설정한 드라이버들은 커널 소스 안의 어느 파일, 어느 라인에서 로딩을 하는지 알아야만 합니다. 분명한 것은 커널은 이 모듈들을 kmod나 modprobe을 이용해서 로딩하지 않으며, 다른 어떤 방법을 통하여 로딩한다는 것입니다.

익명 사용자의 이미지

udev를 알아보세요.

ihjkoh의 이미지

부팅시 커널 내부에서 호출하는 udev의 모든 인자들을 prink()를 이용하여 조사해보았지만 초기 모듈들을 로딩하는 인자는 존재하지 않습니다.

리눅스 커널 내에서 일어나는 모든 모듈 로딩(modprobe, insmod, 커널의 자체 로딩)은 전부 sys_init_module과 sys_finit_module라는 두 개의 system call 함수 안으로 모여서 이 안에서 처리됩니다. 이 system call이 정의되어 있는 파일은 kernel/module.c이며, 따라서 이 파일을 이해하고 수정하면 됩니다.

익명 사용자의 이미지

오해가 있었군요. 장치를 구동시키는 커널 모듈들을 "누가" 불러오는가, "어디서" 불러오는가의 차이입니다. udev는 "누가"에 해당하고 저 함수들은 "어디서"에 해당하죠.

ihjkoh의 이미지

제가 디버깅해서 찾아본 바로는, 부팅하면 모듈 96개가 로딩되는데,
그중 10개정도는 modprobe으로 로딩되고, 나머지는 어떤식으로 로딩되는지를 알수가 없었습니다.
만약 말씀처럼 udev가 로딩하는 것이라면 적어도 udev의 인자로 모듈들이 들어가거나,
아니면 설정파일에 90개의 모듈들의 이름이 들어가 있어야 하는데,
udev의 인자중 커널모듈 이름을 담고 있는 실행 로그는 한군데도 찾을 수 없었으며,
이 초기 모듈들의 이름을 지니고 있는 설정파일들 또한 어디서도 찾을수가 없었습니다.
제가 못찾은 건지도 모르겠습니다.

제 생각으로는, 특정 디바이스를 사용하려고 하는 순간마다
커널에서 자체적으로 가장 적합한 드라이버를 로딩하는 건지도 모르겠습니다.

bushi의 이미지

커널도 modprobe 를 사용해서 모듈을 로드 합니다.
정확하게 말하면 /proc/sys/kernel/modprobe 에 씌어있는 프로그램이 호출됩니다. ( kernel.modprobe sysctl)
http://lxr.free-electrons.com/source/include/linux/kmod.h?v=4.9#L37 에서 출발하시면 되겠습니다.

ihjkoh의 이미지

링크주신 해당 소스코드는 글 올리기 전부터 여러번 살펴보았었는데

call_usermodehelper_exec(struct subprocess_info *info, int wait);

실제로 이 함수 안에서 prinkt를 넣어서 커널 리컴파일해서 출력해보면
이 함수에서 호출하는 modprobe (== kmod의 symbolic link)으로 호출되는 모듈은 10개가 채 안됩니다.
하지만 최종적으로 로딩되는 모듈의 갯수는 100개가 넘습니다.

게다가 kmod소스코드를 뜯어보면, 이 유저스페이스 프로그램도 결국 init_module 시스템콜을 이용해서 모듈을 로딩합니다.
결국 modprobe, insmode, kmod는 모두 init_module 시스템콜을 호출하는 helper프로그램일 뿐이며,
실제 모듈로딩 작업은 커널 안에서 이루어집니다.

그런데 커널 안의 어느 부분에서 init_module 시스템콜을 호출하는지 찾아지지가 않네요..
호출 출처가 확인되지 않은 나머지 90개의 모듈들도 모두 그곳에서 호출되는 것일 겁니다.

어쩌면 initrd안에 저장된 데이터와 연관되어 있을지도 모르겠습니다.

bushi의 이미지

modprobe 는 (/lib/modules/`uname -r`/modules.dep 에 적혀있는) 의존관계인 다른 모듈들도 로드합니다.

커널 안에서 init_module (뿐만 아니라 모든 다른 시스템 콜)을 직접 호출하는 부분은 아마도 없을 겁니다.

initrd 가 의심가면 해체해서 뜯어보는게 우선이죠.

ihjkoh의 이미지

직접 해보셔도 아시겠지만, kmod는 소스파일 kmod/libkmod-file.c 안에서

https://github.com/lpereira/kmod/blob/master/libkmod/libkmod-file.c

294번째줄의

struct kmod_file *kmod_file_open(const struct kmod_ctx *ctx,
const char *filename)

이 함수를 통해서 모든 .ko 모듈 파일들을 읽어들이는 것으로 알고 있습니다. 그 대상은 말씀하신 의존관계의 다른 모듈들을 로딩하는 것 또한 모두 포함합니다. 하지만 리눅스 4.8 부팅시, 말씀드렸다시피 이곳에서 printf를 통해 출력되는 모듈의 개수가 7개 미만입니다. 게다가, 로딩된 7개의 모듈들의 의존관계를 살펴보면 나머지 97개의 모듈 대부분에게 의존하지 않습니다. 한편, init_module 시스템콜 안에서 로딩되는 모듈들의 이름을 printk로 출력하면 하나도 빠짐없이 전부 출력됩니다. 즉, 리눅스의 모든 모듈들은 init_module 시스템콜을 통해서 로딩되지만, 부팅시 그것들 대부분은 kmod를 통해서 로딩되는 것은 아니라는 추론이 성립됩니다.

bushi의 이미지

모듈이 로드되는 경우는 두가지 뿐입니다.
커널 안의 어떤 부분에서 request_module() 을 호출해서 usermode_helper 를 통해 modprobe 가 실행되는 경우.
유저 영역의 어떤 부분에서 modprobe 나 insmod 혹은 이와 같은 동작을 하는 자작 프로그램(예를 들면 busybox) 같은 것들이 실행되는 경우.

libkmod 에 몰입하고 계시는 걸로 보이는데,
그것만 사용하라는 법도 없고 실제로 모든 것들이 그것만 사용하지도 않습니다.

아는 것만 보면서 아는 곳까지만 보고 되돌아나오지말고,
모르는 것을 중점적으로 보면서 끝까지 가세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.