본문으로 바로가기

[리눅스] 커널 소스 분석

category 운영체제/리눅스 2021. 5. 17. 22:24
728x90
반응형

리눅스 커널 소스에 대해 자료를 좀 찾아보았습니다.

이전부터 조금 궁금했던건 리눅스 커널의 소스는 어떻게 되어 있고, 어떤식으로 동작하느냐에 대한 것이었습니다.

그래서 리눅스 커널 소스에 대해 정리를 좀 해보겠습니다.

1. 커널 소스 위치

리눅스 배포판을 설치하게 되면 리눅스 커널 소스는 특정 경로에 포함되어 있습니다.

리눅스 커널 자체가 커널 소스에 있는 것을 컴파일 하여 생성된 것이기 때문입니다.

커널의 버전을 수정하지 않는 이상, 현재 커널의 소스 파일은 이 것을 컴파일 한 것입니다.

또한, 설치를 할 때 사용했던 CD나 ISO파일 내부에는 커널 소스 파일이 존재합니다.

현재 저는 장비 2대를 대상으로 커널 소스를 보려고합니다.

커널 소스는 보통 /usr/src/linux 쪽에 있다고 하는데 저는 버젼이 높아서 그런지 다른 경로에 있었습니다.

OS마다 다르기 때문에 잘 찾아보면 있을 것으로 보입니다.

저의 장비 정보는 아래와 같습니다.

-장비 A : 

CentOS Linux release 7.6.1810 (Core)  64 bit
kernel-3.10.0-957.el7.x86_64

소스 위치 : /usr/src/kernels/3.10.0-957.el7.x86_64/

소스 디렉토리 정보 : ls -al 결과
-rw-r--r--.   1 root root     505 11월  9  2018 Kconfig
-rw-r--r--.   1 root root   51288 11월  9  2018 Makefile
-rw-r--r--.   1 root root    2305 11월  9  2018 Makefile.qlock
-rw-r--r--.   1 root root 1123422 11월  9  2018 Module.symvers
-rw-r--r--.   1 root root 3543471 11월  9  2018 System.map
drwxr-xr-x.  32 root root    4096  8월 12  2020 arch
drwxr-xr-x.   3 root root      78  8월 12  2020 block
drwxr-xr-x.   4 root root      76  8월 12  2020 crypto
drwxr-xr-x. 119 root root    4096  8월 12  2020 drivers
drwxr-xr-x.   2 root root      22  8월 12  2020 firmware
drwxr-xr-x.  75 root root    4096  8월 12  2020 fs
drwxr-xr-x.  28 root root    4096  8월 12  2020 include
drwxr-xr-x.   2 root root      37  8월 12  2020 init
drwxr-xr-x.   2 root root      22  8월 12  2020 ipc
drwxr-xr-x.  13 root root     247  8월 12  2020 kernel
drwxr-xr-x.  10 root root     219  8월 12  2020 lib
drwxr-xr-x.   2 root root      58  8월 12  2020 mm
drwxr-xr-x.  61 root root    4096  8월 12  2020 net
drwxr-xr-x.  15 root root     231  8월 12  2020 samples
drwxr-xr-x.  13 root root    4096  8월 12  2020 scripts
drwxr-xr-x.   9 root root     136  8월 12  2020 security
drwxr-xr-x.  24 root root    4096  8월 12  2020 sound
drwxr-xr-x.  20 root root     254  8월 12  2020 tools
drwxr-xr-x.   2 root root      37  8월 12  2020 usr
drwxr-xr-x.   4 root root      44  8월 12  2020 virt
-rw-r--r--.   1 root root      41 11월  9  2018 vmlinux.id


-장비 B : 

Red Hat Enterprise Linux Server release 6.5 (Santiago)
kernel-2.6.32-431.el6.x86_64

소스 위치 : /usr/src/kernels/2.6.32-431.el6.x86_64/
소스 디렉토리 정보 : ls -al 결과
-rw-r--r--.  1 root root   56995 2013-11-11 12:27 Makefile
-rw-r--r--.  1 root root    1152 2013-11-11 12:28 Makefile.common
-rw-r--r--.  1 root root  696751 2013-11-11 12:28 Module.symvers
-rw-r--r--.  1 root root 2518236 2013-11-11 12:28 System.map
drwxr-xr-x. 25 root root    4096 2016-08-26 09:33 arch
drwxr-xr-x.  2 root root    4096 2016-08-26 09:33 block
drwxr-xr-x.  5 root root    4096 2016-08-26 09:33 crypto
drwxr-xr-x. 92 root root    4096 2016-08-26 09:33 drivers
drwxr-xr-x.  3 root root    4096 2016-08-26 09:33 firmware
drwxr-xr-x. 71 root root    4096 2016-08-26 09:33 fs
drwxr-xr-x. 21 root root    4096 2016-08-26 09:33 include
drwxr-xr-x.  2 root root    4096 2016-08-26 09:33 init
drwxr-xr-x.  2 root root    4096 2016-08-26 09:33 ipc
drwxr-xr-x.  8 root root    4096 2016-08-26 09:33 kernel
drwxr-xr-x.  7 root root    4096 2016-08-26 09:33 lib
drwxr-xr-x.  2 root root    4096 2016-08-26 09:33 mm
drwxr-xr-x. 49 root root    4096 2016-08-26 09:33 net
drwxr-xr-x.  6 root root    4096 2016-08-26 09:33 samples
drwxr-xr-x. 12 root root    4096 2016-08-26 09:33 scripts
drwxr-xr-x.  7 root root    4096 2016-08-26 09:33 security
drwxr-xr-x. 21 root root    4096 2016-08-26 09:33 sound
drwxr-xr-x.  7 root root    4096 2016-08-26 09:33 tools
drwxr-xr-x.  2 root root    4096 2016-08-26 09:33 usr
drwxr-xr-x.  3 root root    4096 2016-08-26 09:33 virt


디렉토리 구성은 비슷하나, 안의 파일들이나 내용들은 커널이 다르기 때문에 다를 수 밖에 없습니다.

2. 커널 소스 디렉토리

많은 디렉토리 중, 몇 개의 디렉토리에 대해서 간단히 정리해 보았습니다.

대부분 디렉토리 명에서 힌트를 얻을 수 있습니다.

arch : 아키텍쳐의 줄임말로서, 아키텍쳐와 관련된 코드들이 들어있습니다. 디렉토리로 이동해보면, 서브 디렉토리로는 아키텍쳐 별 디렉토리가 존재합니다. 낯익은 아키텍쳐들이 많이 있습니다.

1) arm : 32비트 계열 ARM 아키텍처 코드

2) arm64 : 64비트 계열 ARM 아키텍쳐 코드

3) x86 : 인텔 x86 아키텍쳐 코드


init : 커널을 초기화에 관련된 코드들이 존재합니다. 

mm : Memory Management의 약자로서 메모리 관련된 소스들이 존재합니다. arch 하위에도 mm 관련 소스들이 존재하며, 특정 아키텍쳐마다 메모리 관리 기법이 다르기 때문에 이렇게 구성되어 있습니다.

drivers : 시스템의 디바이스 드라이버에 관련된 것들이 존재합니다. cdrom이나 power 등의 예가 있습니다.

ipc : 프로세스간에 통신을 하는 ipc 관련 소스들이 존재합니다. 일반적으로 사용하는 메시지큐, 공유메모리 등이 있습니다.

fs : 리눅스의 모든 파일 시스템 소스 코드가 존재합니다. 많이 보는 ext2, fat 등이 있습니다.

kernel : 커널 소스들이 들어 있습니다. 메인 소스코드가 존재합니다.

1) irq : 인터럽트 관련 코드

2) sched : 스키쥴링 관련 코드

3) power 파워 관련 코드

4) locking : 커널 동기화 관련 코드

5) printk : 커널 콘솔 관련 코드

net : 네트워크 관련 코드들이 있습니다. ethernet, ipv4, ipv6 등

lib : 라이브러리가 있습니다.

scripts : 커널 설정에 사용되는 스크립트들이 있습니다.

include : 커널 코드 빌드에 필요한 헤더 파일들이 있습니다.



관련 소스들이 위 디렉토리에 모두 존재하는 것은 아니며, Makefile을 위져보면 실제 소스들이 어디에 존재하는지 확인할 수 있습니다.

또한, 커널에 따라서 디렉토리 내부 구조는 다를 수 있습니다.

3. 소스 순서

커널 소스는 아시다시피 거대합니다. 이것을 완벽하게 이해하려면 몇달 혹은 몇년이 걸립니다.

그래도 이전에 분석해본 분들이 존재하기 때문에 구글링을 통해 조금더 쉽고 빠르게 분석이 가능합니다.

소스 코드의 기본은 main 함수 입니다.

커널 소스의 경우, 여러개의 main 함수가 존재하기 때문에, 무작정 main을 따라가기는 힘듭니다.

아래의 순서로 분석하는게 효율 적입니다.

1) 초기화
init 내의 Makefile을 보면 초기화하는 부분의 소스를 볼 수 있습니다.

2) 메모리
메모리 관련 소스는 arch/*/mm 에 존재합니다. 여기에는 메모리 fault, buffer, swap 등의 소스들이 존재합니다.

각각의 아키텍쳐마다 소스가 다르기 때문에 참고하시기바랍니다.

3) 커널
일반적으로는 kernel에 소스가 존재하고, arch/*/kernel 에도 아키텍쳐마다의 소스코드가 존재합니다.

여기서는 커널의 제일 중요한 기능인 스케쥴러, 프로세스 포크 등이 있습니다.

4) PCI
PCI는 드라이버 관련된 소스 이기 때문에 driver 쪽을 보시면 됩니다.

5) IPC
프로세스 통신 관련 소스들은 ipc 쪽에 있습니다. 메시지큐, 세마포어 등이 있습니다.

6) 인터럽트
인터럽트는 arch 디렉토리 하위에 아키텍쳐마다 존재합니다.

7) 드라이버
리눅스는 물리적 디바이스들을 드라이버로 관리 하기 때문에 drivers 디렉토리의 소스를 보시면됩니다.

여기는 cdrom, pci, net, sound 등이 있습니다.

8) 파일시스템
fs 하위에 모든 파일시스템 관련 소스들이 있습니다.

9) 네트워크
net 디렉토리 하위에 존재하며, 소켓, ipv4, ipv6 등의 소스 코드 들이 있습니다.

이상입니다.

728x90
반응형