정보공간_1

[6기 강북 전영진] 리눅스 커널 심층 분석 #0 본문

IT 놀이터/Elite Member Tech & Talk

[6기 강북 전영진] 리눅스 커널 심층 분석 #0

알 수 없는 사용자 2014. 8. 7. 16:48

 #Intro

안녕하세요. 강북멤버십 23-2기 전영진입니다.

제가 포스팅할 주제는 리눅스 커널에 관한 내용으로 하나하나 공부하면서 포스팅 할 예정입니다. 

오늘은 리눅스 커널의 개념 대해 간략히 소개하겠습니다.

#리눅스 커널

운영체제는 모든 하드웨어와 모든 소프트웨어를 관리하는 컴퓨터시스템의 한 부분인 “실행 관리자”라고 정의할 수 있습니다.

여기에는 커널과 장치 드라이버, 부트로더, 명령행 셸 또는 동등한 역할을 하는 사용자 인터페이스, 기본적인 파일 및 시스템 유틸리티 등이 포함됩니다. 그 중에서 커널은 시스템의 다른 모든 부분에 기본적인 서비스를 제공하고, 하드웨어를 관리하며, 시스템 자원을 분배하는 소프트웨어 입니다.

커널의 주된 구성요소로는 아래 4가지의 서비스를 들 수 있습니다.

1.  인터럽트 서비스 요청을 처리하는 인터럽트 핸들러(Interrupt handler)

2.  프로세서 실행 시간을 여러 프로세스에 분배하는 스케줄러(scheduler)

3.  프로세스의 주소 공간을 관리하는 메모리 관리 시스템

4.  네트워크 및 프로세스간 통신 처리하는 시스템

 

#Kernel-space & User-space

커널은 일반적인 어플리케이션과 다른 시스템 상태를 가지고 있습니다.

( 보호 메모리 공간을 사용, 제약없이 하드웨어 접근 가능 )

이러한 상태와 메모리공간을 커널 공간(kernel-space)이라고 부릅니다.

반대로 사용자 어플리케이션은 사용자 공간(user-space)에서 실행되어 장비의 가용 자원 중 일부만 사용 할 수 있으며, 특정 시스템 함수를 실행 할 수 있습니다. 그 외 하드웨어에 직접접근하거나, 커널이 할당한 영역 밖에 메모리에 접근하는 경우는 잘못된 동작입니다. 

 

#인터럽트

커널은 시스테의 하드웨어도 관리합니다. 하드웨어에서 시스템과 통신할 필요가 있을 떄 하드웨어는 인터럽트를 발생합니다.

인터럽트마다 고유의 숫자를 가지고 있는데 그 숫자를 이용하여 커널은 인터럽트를 처리하고 응답할 인터럽트 핸들러를 실행합니다.

인터럽트 핸들러는 프로세스 컨텍스트에서 실행되지 않고 인터럽트 컨텍스트에서 실행되어, 인터럽트 핸들러가 인터럽트를 빠르게 처리하고 종료하는 데만 사용됩니다.

 

#리눅스 커널의 명명 규칙

리눅스 커널은 간단한 명명규칙을 통해 안정 커널과 개발 커널을 구분합니다.

 

필요에 따라 추가되는 네번째 숫자는 안정버젼에서 사용하며, 부버전을 뜻하는 두번 째 숫자가 짝수냐 홀수냐에 따라서 안정커널인지 개발커널인지를 확인 가능합니다.

(짝수 : 안정 커널 , 홀수 : 개발 커널)

 

#커널 소스 구하기

리눅스 최신 커널 소스는 http://www.kernel.org 에서 받을 수 있습니다.

Git을 이용하여 커널 소스 다운로드.

$git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 을 통해 소스를 받은 후

$git pull 명령을 입력하여 최신 버전 커널로 업데이트 할 수 있습니다.

 

 

#커널 소스 설치 및 작업 위치

커널 소스는 보통 /usr/src/linux에 설치 됩니다. c라이브러리가 여기에 설치된 커널 소스와 링크된 경우과 많기 때문에, 개발 작업에 이 소스를 이용하면 안되고, 별도로 개인 홈 디렉토리에서 작업하고 새 커널을 설치할 때문 루트 권한을 사용하는 것이 바람직합니다.

새로운 커널을 설치 하더라도 /usr/src/linux의 디렉토리 내용을 건드리면 안됩니다.

 

#커널 소스 트리

커널 소스 트리 최상위에 있는 디렉토리 목록

 

 

 

#커널 설정

커널 설정은 설정옵션을 통해 조절 할 수 있으며, 설정옵션은 CONFIG_기능 같은 형태로 구성되어 있습니다.

ex) CONFIG_FEATURE, CONFIG_SMP

$make config  : 각 옵션을 하나씩 돌아가면서 대화식으로 사용자에게 묻는 방식

$make menuconfig : ncurses 라이브러리를 사용한 그래픽 환경 도구

$make gconfig : gtk+ 기반의 그래픽환경 도구

 

$make defconfig : 아키텍처에 맞는 기본 설정을 만들어준다.

$maek oldconfig : 파일을 직접수정시 이 명령어를 사용하여 갱신할 수 있다.

 

#빌드 메시지 최소화

$make > ../detritus

$make > /dev/null

빌드시 다음명령을 통해 빌드 메시지를 파일로 보관하거나 불필요한 출력을 막을 수 있습니다.

 

#빌드 작업을 동시에 여러개 실행

make 프로그램에는 빌드 과정을 여러 개의 병렬 작업으로 분리해 주는 기능이 있습니다.

보통에는 Makefile의 의존성 정보가 잘못되어 있는 경우가 너무나 많아 기본적으로는 make는 하나의 작업만 생성하지만 커널 Makefile의 의존성 정보는 정확하므로 여러 개의 작업을 생성해도 문제가 발생하지 않는다.

$make -jn

 명령을 통해 다중 make작업을 수행하는데 여기서 n은 생성할 작업의 개수를 뜻합니다. 일반적으로 프로세서 하나당 2개의 작업을 생성하는 것이 적당합니다.

만약 16코어 장비라면 $make -j32 을 입력하여 명령을 수행하면 됩니다.

 

#새 커널 설치

새 커널의 설치는  다음 명령을 실행하면 됩니다.

$make modules_install

이렇게하면 컴파일된 모듈들이 /lib/modules 디렉토리에 설치가 됩니다.

빌드과정에서 커널 소트 트리 최상위에 System.map 파일이 생성되는데 이 파일에는 각 커널 심볼의 시작 주소의 위치를 알수 있는 테이블이 들어있습니다.

디버깅 시에 이 정보를 이용해 메모리 주소값을 그에 해당하는 함수나 변수 이름으로 변환해서 보여줄 수 있습니다.

 

#리눅스 커널의 특징

1.  커널은 C라이브러리나 표준 C 헤더 파일을 사용할 수 없다.

2.  커널은 GNU C를 사용한다.

3.  커널에는 사용자 공간에서와 같은 메모리 보호 기능이 없다.

4.  커널은 부동소수점 연산을 쉽게 실행할 수 없다.

5.  커널은 프로세스다 고정된 작은 크기의 스택을 사용한다.

6.  커널은 비동기식 인터럽트를 지원하며, 선점형이며, 대칭형 다중 프로세싱을 지원하므로 커널 내에서는 동기화 및 동시성 문제가 매우 중요하다.

7.  이식성이 중요하다.

다음 포스팅에서는 리눅스 커널의 프로세스 및 시스템콜에 대해 살펴 보겠습니다.

(Linux kernel development. 3/E 참조)