Emiliano Ariel Lesende들어 가는 글리눅스 : 인터넷
|
커널의 비밀요약: 리눅스 커널에 대해 짧게 살펴봅니다. 들어 가는 글'리눅스 커널의 비밀'에 관한 기사 시리즈의 처음 글에 온 걸 환영한다. 아마 당신은 리눅스 커널 소스를 이미 본 적이 있을 것이다. 봤다면 처음 압축해서 100-kb였던 파일이 지금은 300 개가 넘는 파일이 있고, 소스 코드는 200만 줄이 넘고, 압축을 해서 9메가 이상이란 것을 알 것이다. 이 시리즈는 초보자를 위한 글이 아니고, 경험이 많은 프로그래머를 위한 글이다. 이 글을 읽는 것은 자유이다. 또한, 질문을 E-mail로 보내면 최대한 노력을 하여 답변할 것이다. 매일 새로운 버그가 발견되고, 그에 따른 패치가 계속 나온다. 현제에는 소스 코드 전체를 이해한다는 것은 거의 불가능하다. 매우 많은 프로그래머에 의해서 작성되는데 최대한 같은 코딩 스타일로 코딩을 하려고 한다. 하지만 코딩 스타일은 서로 다르다. Linux: The Internet Operating System리눅스는 인터넷을 통해서 자유롭게 배포되는, PC와 다른 아키텍쳐를 위한 운영 체제이다. POSIX 1003.1과 호환이 되며 Unix System V와 BSD 4.3의 많은 특징들을 가지고 있다. 이 시리즈에서 살펴 볼 커널 소스는 대부분 필란드 대학생이던 Linus Torvalds에 의해 작성되었다. 커널은 처음 1991년 11월에 발표되었다. 특징들리눅스는 현재 Unix 환경의 운영 체제의 특징을 거의 모두 구현했다.
커널 컴파일 하기커널 자체를 공부하기 전에 일단 커널 소스를 보자. 소스 트리 구조: 리눅스 커널 소스는 보통 /usr/src/linux/ 디렉터리에 존재한다. 뒤에서 나오는 모든 디렉터리는 위의 디렉터리 밑에 있는 디렉터리이다. 커널 버전 1.0 이후부터는 비인텔 계열 아키텍처로 포팅이 이루어 졌으므로 소스 트리 구조에 약간의 변화가 생겼다. 아키텍쳐에 의존적인 코드들은 arch 에 있다. Inter 계열의 프로세서를 위한 코드는 arch/i386/에 있고, arch/mips/는 MIPS를 기초한 시스템을 위한 디렉터리이고, arch/sparc/는 Sparc에 기초한 시스템을 위한 디렉터리이고 arch/ppc/는 PowerPS나 Powermacintosh 를 위한 디렉터리이다. Intel 아키텍처가 가장 리눅스와 가장 널리 쓰이므로 우리는 Intel 아키텍처만을 보도록 한다. 리눅스 커널은 단순히 C 프로그램일 뿐이다. 두 가지 차이점이 있을 뿐이다. 보통 C로 짜여진 프로그램은 main(int argc, char **argv)로 부터 시작을 하지만 리눅스 커널은 start_kernel(void)로 부터 시작을 한다. 시스템이 시작하고 커널이 적재될 때 프로그램 환경은 존재하지 않는다. 이것은 C 루틴이 처음 실행될 때 무언가가 선행되어야 한다는 것을 의미한다. arch/i386/asm/에 있는 어셈블리 코드가 이를 한다. 어셈블리 루틴은 커널을 메모리의 절대주소 0x100000(1 Mbyte)로 옮기고, 인터럽트 서비스 루틴과 Global file descripter Table과 Interrupt descriptor Table 을 설치한다. 이 순간부터 프로세서는 보호모드로 전환된다. init/ 디렉터리는 커널을 초기화하는데 필요한 것들을 가지고 있다. 여기에는 start_kernel()도 있는데 이는 커널을 적절히 초기화 하고, 부트 파라미터로 넘어 온 것들을 포함한다. 처음으로 만들어 지는 프로세스는 system call을 사용하지 않고 생성된다(시스템 자체도 아직 적재되어 있지 않다.). 이것이 바로 유명한 idle process이고, 어떠한 프로세스도 실행되지 않을 때 이 프로세스가 실행되게 된다. kernel/와 arch/i386/kernel/ 디렉터리는 이름에서도 알 수 있듯이 커널에서 가장 중요한 부분을 담고 있다. 중요한 system call들이 여기에 있다. time handler와 스케줄러, DMA manager, interrupt handler, signal controller 등이 구현되어 있다. 시스템 메모리에 관련된 소스 코드는 mm/와 arch/i386/mm/에 있다. 여기에는 프로세스에 메모리를 할당하고 해제하는 등의 일을 하는 코드가 구현되어 있다. 또한 메모리 페이징에 관한 것도 여기에 구현되어 있다. Virtual File System(vfs)는 fs/에 있다. 지원되는 각각의 파일 시스템 형식은 각각 서브 디렉터리에 있다. 가장 중요한 파일 시스템은 Ext2와 Proc 파일 시스템으로 다음에 더욱 자세하게 알아 볼 것이다. 모든 운영 체제는 하드웨어를 위해서 드라이버가 필요하다. 리눅스에서는 drivers/에 드라이버에 관한 코드가 있다. ipc/에서는 리눅스에서 구현한 System V IPC에 관한 코드를 볼 수 있다. 다양한 네트웍 프로토콜과 socket , internet domain 등은 net/에서 볼 수 있다. 표준 C 루틴의 일부는 커널 자체가 C 프로그래밍을 사용하기 위해서 lib/에 구현되어 있다. 커널 컴파일 도중 만들어진 모듈들은 modules/에 있지만, 커널 컴파일을 처음 하기 전까지는 그 안에는 아무것도 없을 것이다. 프로그래머에게 가장 많이 사용되는 디렉터리인 include/에는 커널이 사용하는 모든 헤더 파일 들이 있다. 인텔 플랫폼에 관련된 헤더 파일은 include/asm-386/에 있다. 컴파일 하기: 새로운 커널은 보통 다음과 같은 세 가지 단계를 거쳐서 만들어 진다:
다음 기사에서 우리는 이러한 스크립트가 어떻게 작동하는지와 새로운 옵션을 만들기 위해서 어떻게 수정해야 하는지 등을 자세하게 배울 것이다. 필자는 독자가 이 글을 즐겼으면 하는 바이다. 당신의 조언이나 충고 혹은 비평 등이 담긴 메일은 언제나 환영이다. elesende@nextwork.net으로 보내면 된다.
더 알고 싶으신 분은:
번역 : 허정수 |
본 웹사이트는 Miguel Angel Sepulveda씨에 의해 관리됩니다. ©Emiliano Ariel Lesende 1998 LinuxFocus 1998 |