kernel module’s text,data,bss location

우리가 흔히 커널 모듈에 대해서 공부를 많이 하는데

그럼 이 모듈 내에 존재하는 text,data,bss 와 같은 영역은 어디에 존재하게 될까?

커널의 메모리를 보면

0xffffffff80000000 ~ 0xffffffff9fffffff: 커널 코드가 위치한 .text 영역입니다. 이어서 rodata , data , bss 영역이 존재함, 즉 , 우리가 빌드한 커널 이미지가 해당 영역에 위치합니다.

0xffffffffa0000000 ~ 0xfffffffffeffffff: 커널 모듈이 위치한 영역입니다. 커널을 부팅한 후, 디바이스 드라이버 등의 모듈을 로드하면 해당 위치에 매핑됩니다.

이런식으로 되어 있는데 전자에 위치하게 될까 후자에 위치하게 될까?

정답은 모듈이 항상 그렇듯, 빌트인이냐 ko냐에 따라 다르다.

Built-in(커널에 내장으로 컴파일된 드라이버/기능)

  • 걔네 코드/전역데이터는 vmlinux 일부로 링크됨
  • 그래서 그들이 쓰는 전역 .data/.bss도 커널 이미지 매핑(=커널 text 근처 큰 구간) 안에 존재

Loadable module(.ko)

  • 로드 시 커널이 메모리 잡아서 module mapping space에 매핑
  • 따라서 모듈의 .data/.bss도 “모듈 영역”에 존재

추가로, built-in이든 .ko든 “전역 섹션” 말고도 런타임에 kmalloc/vmalloc로 잡는 동적 메모리는 또 다른 구간(직접매핑/direct map, vmalloc 영역 등)에서 나옵니다. 즉:

  • 모듈 전역변수 → module mapping space 쪽
  • 모듈이 kmalloc으로 할당한 객체 → direct map/슬랩 쪽(완전 다른 주소대)