SimpleIsBest.NET

유경상의 닷넷 블로그

Linux와의 시간 여행...

by 블로그쥔장 | 작성일자: 10/14/2005 5:02:00 PM
이 글은 오래된 전에 작성된 글입니다. 따라서 최신 버전의 기술에 알맞지 않거나 오류를 유발할 수 있습니다. 저자는 이 글에 대한 질문을 받지 않을 것입니다. 하지만 이 글이 리뉴얼 되면 이 글에 대한 질문을 하거나 토론을 할 수도 있습니다.
우연(?)시럽게 찾은 CD 덕에 타임머신을 타고 10년 전으로 시간 여행을 다녀왔습니다. 10년 전 필자가 파묻혀 살던 Linux... 옛날 생각에 몇 자 끄적여 봅니다...

My Major :: Operating System

마이크로소프트 기술과 닷넷으로 밥 빌어먹고 사는 필자의 대학교 및 대학원 전공은 "Operating System"이다. 왜 운영체제를 전공한 인간이 이짓거리 하고 있냐고 하면... 뭐... 아싸리 말해서 먹고 살기 위해서다. -_-;;

필자가 운영체제와 인연을 맺게 된 것이... 1993년 학부 3학년 때의 Operating System 과목에서 이다. 그 유명한 "공룡 책"을 기반으로 한 그 과목에서 운영체제에 대해서 약간 맛을 봤지만, 필자에게 가장 큰 영향을 준 것은 같은 학기에 수강한 다른 과목(케헥 !!! 과목명이 기억나지 않는다 !! T_T)에서 였다. 이 과목의 내용은 특이하게도 Dr.Dobb's Journal 이란 잡지에 실렸던 UNIX를 80386에 포팅하는 연재 기사(Porting Unix to the 386)를 "따라하기" 였다. 이 과목을 수강하면서 BSD UNIX와 UNIX 커널 소스코드(386BSD의 초기 소스코드)를 맛보게 되었다. MS-DOS에서 램상주(오옷! 정말 오래된 단어다... T_T) 프로그램이나 만지작 거리던 필자에게 진정한 멀티 태스킹 운영체제는 정말 재미있는 것이였고 얼마되지 않아 필자는 UNIX 운영체제에 푸~욱 빠지게 되었다. 그 때부터 약 4년간 UNIX 운영체제를 붙들고 살게 된 것이다.


● Dr.Dobb's Journal 1991년 1월호의 "Porting UNIX to the 386: A " 연재의 첫 번째 기사에 실린 그림.
● UNIX 계보와 386BSD를 관계를 나타내고 있다.
● BSD UNIX의 포팅은 1989년 부터 시작했다고 한다.

Linux

필자가 접했던 386BSD은 VAX 머신 상에서 작동하는 BSD UNIX 4.3을 80386 (그때 당시만 해도 386/486이 대세였다)에 포팅해 놓은 아주 초기 버전이였으므로 80386에 최적화되었다기 보다는 BSD UNIX를 단순히(?) 포팅해 놓은 것이였다. 사실 VAX 를 잘 모르는 필자에게 386BSD는 좀 아니, 상당히 어려운 운영체제였고 커널 소스코드를 아무리 노려보아도 왜 그렇게 코딩이 되어 있는지 이해하기 힘들었었다. 사실 가진 경험이라곤 조또 없이 단순 무식한 대학생에게 386BSD 커널이라면 가당키나 한가?

그래서 좀 더 쉬운 운영체제를 찾아 공부해 보기로 마음을 바꾸었다. 그 때 당시 손쉽게(?) 소스 코드가 접근이 가능한 UNIX 계열의 운영체제로 MINIX라는 것이 있었다. 이 녀석은 "운영체제" 이론 및 실기에서 유명한 Andrew S. Tanenbaum 교수가 작성한 운영체제로써, 그의 유명한 저서(지금도 운영체제 과목의 수업 교재로 쓰이곤 한다. 아니면 말고... -_-)인 Operating Systems: Design and Implementation, 2nd Edition 에서 소개한 운영체제 이다. MINIX는 필자의 흥미를 그다지 많이 끌지 못했는데, MINIX 그 자체가 마이크로커널 형태를 취하고 있어서 일반적인 UNIX 들(솔라리스, 유닉스웨어 등 그당시 유명했던 녀석들)과는 상당히 달랐으며 결정적으로 8086 리얼모드(16비트 운영체제)를 사용했기 때문이다. (물론 32비트 MINIX도 있었다. 사실 Linux 0.0.0.1은 32비트 MINIX에서 상당부분을 따왔다고 한다.)


● 추억의 그 책: Operation Systems: Design and Implementations. 그때는 Prentice Hall 출판사의 빨간색 표지 였다.

그렇게 386BSD와 MINIX 사이를 기웃거리며 헤메이던 필자에게 대학원에 있던 선배가 알려준 것이 바로 Linux 이다. 소스가 모두 공개되어 있을 뿐더러 완전한 설치 패키지까지 무료로 다운로드 받을 수 있다는 것이다. 게다가 이 녀석은 X-Window 까지 지원한다는 것이 아닌가? 16비트 구라 코드를 통해 멀티 태스킹을 에뮬레이션 하던 Windows 3.1과는 차원이 다른 X-Window 까지 지원한다면 이 녀석은 정말 시도해 볼 가치가 있다고 판단했다. 게다가 Linux는 386MINIX(80386 버전의 MINIX)를 토발즈가 수정해서 80386에 최적화(?)되어 있다고 들었으니 필자가 잘 모르는 아키텍처 기반의 386BSD나 교육용으로나 적합할 MINIX와는 비교할 수 없었다.

Installing Linux 1.1.8

그래서... 대학원에 다니는 선배를 졸라 이틀 밤을 연구실에서 날을 새며 FTP로 리눅스 배포본을 다운로드 받았다. 지금이야 여러 배포판이 있지만(지금 어떤 배포판들이 있는지 필자는 잘 모른다. 다만 젤루 유명한 레드햇만 알구 있다. -_-) 그때 당시는 Slackware와 SLS 두 종류가 거의 전부였고, 게중 Slackware가 설치가 편리하고 구성도 좋다는 이야기를 들어서 이것을 다운로드 받았다. 1.44MB 플로피 디스켓 46장 분량이였다. 요즘같이 빠른 네트워크 인프라가 없었기 때문에(그때 당시 교육망이 느렸다는 것을 아는 사람은 다 알 것이다), 1.44MB 를 다운로드 받는데도 시간이 깨나 걸렸고 받은 이미지를 다시 플로피에 기록해야 했었기 때문에 시간이 많이 소요되었다. 가끔 플로피가 뻑이 났기 때문에 배포판 디스켓을 모두 만드는 데는 모두 50장이 넘는 디스켓을 사용했어야 했다.

어렵사리 Slackware 배포판을 다운로드 받고, 필자의 PC 에 설치를 시도했다. 보무도 당당한(!!!) 80486 DX66 (66MHz), 16MB RAM, 200MB HDD, Tseng ET4000 Video card를 장착한 PC(필자의 PC는 그 때 당시 일반적인 PC들 보다 사양이 좋았던 것으로 기억한다. 하지지만 이 PC는 지금 필자의 PDA보다 못한 사양이다. -_-;;)에 부팅 디스켓을 넣고 부팅을 시도했다. 오...오... 신기하게도 처음 접하는 운영체제가 눈앞에서 태동하는 것 이였다. 하드 디스크를 파티션하고 설치 디스켓을 40 여 회를 갈아끼운 후 리눅스는 단 번에 설치가 끝났다.


Slackware 1.2의 설치 프로그램.
요즘 배포판 처럼 그래픽 환경의 설치 프로그램은 꿈도 꾸기 힘들었다.

떨리는 마음으로 리부팅... 그리고 눈 앞에는 리눅스 1.1.8 버전이 떡 하니 부팅되어 있지 않은가? 대학원 연구실에서나 볼 수 있던 UNIX 운영체제를 개인 PC에 깔고 사용할 수 있다는 것에 감격이 물밀듯이 밀려왔다.


● Virtual PC에 설치한 Slackware 배포판 1.2의 Linux 1.1.8.
● 부팅 직후의 모습으로 Virtual PC의 NIC를 지원하지 않기 때문에 IP 설정에 오류가 표시되고 있다.
● 눈물 없이는 볼 수 없는 "Virtual PC에 Linux 1.1.8 설치기"는 나중에 이야기 하겠다. (졸라 빡셌다...)

이제 X-Window를 설정할 차례였다. X를 띠우기 위해서는 복잡한(모니터의 주파수까지 명시해야하는...) 설정 파일을 요구했기 때문에 대략 난감하기 그지 없었다. 지금처럼 웹 사이트들이 많아서 검색을 해 볼 수 있는 것도 아니였고(그때 당시에는 웹 브라우저란 용어 자체를 들어볼 수도 없는 때 이다) 하이텔 등에서도 리눅스에 대한 자료도 많지 않아서 FTP로 X 설정에 관련된 영문 문서들을 다운로드 받고 README 들을 탐독한 끝에 개략적인 설정 방법을 알아낼 수 있다. 그 때 당시 필자 PC 비디오카드가 Tseng ET4000이였고 삼성 샘트론 15" CRT 모니터 였다. 다행스럽게도 이 두 가지 모두 예제가 존재 했었기 때문에 어렵지 않게 설정할 수 있었다. 남들은 X 띠우는데 며칠을 날샜다고들 하는데 운좋게도 필자는 단 한방에 X를 구동할 수 있었던 것이다(째수 !)

Using Linux 1.1.8

필자가 리눅스 1.1.8을 사용한 것은 주로 UNIX 시스템 프로그래밍 연습과 리눅스 커널 분석이였다. UNIX 프로그래밍은 그렇다 치고, 커널 분석은 1.1.8 커널 코드를 죄다 프린트하여 부팅부터 시스템 초기화, 프로세스 관리, 메모리 관리, 파일 시스템, TCP/IP 네트워킹을 집중적으로 살펴보았다. 전체 코드를 프린트하는데 잉크젯 잉크 3통이 사용되었고 전체 1600 페이지 정도였던 것으로 기억된다(100여 페이지 단위로 제본해서 14권 이였다).

리눅스 커널 코드 탐험은 정말 재미있는 것 이였다. 부팅에서 어떻게 커널이 메모리에 로드 되고, 가상 메모리를 어떻게 초기화하며, 디바이스 드라이버들을 어떻게 사용하는가를 살펴보는 것은 정말 재미있는 작업이었고, 재미 삼아 커널 코드를 수정하여 효과가 나타나는 것을 확인하기도 했다. 부스트래핑(부팅 및 초기화), 프로세스 관리, 메모리 관리, 가상 파일 시스템 부분만을 분석하는데 6개월 정도가 소요되었으며, 대학원에 진학한 후에 TCP/IP 를 분석하는데 또 3개월 정도가 더 소요되었다.

리눅스 커널 1.1.8 은 멀티 스레딩을 커널에서 지원하지 않았으며, 디바이스 드라이버 역시 모듈로서 동적으로 로드되지 않고 커널내에 포함되어 있었다. 즉, 디바이스 드라이버의 내용을 바꾸자면 전체 커널을 다시 컴파일 해야 했었다. 이외에도 1.1.8은 현재 기준으로 보았을 때 말도 안되는 제약점들이 있었지만 그 당시의 운영체제들은 모두 그러했으며 하드웨어 역시 거기서 거기로 다양하지 않았으므로 큰 문제가 되지도 않았다. 더욱이 그때 당시의 리눅스는 소위 소수의 사용자들만이 사용하는 그들 만의 운영체제였음을 감안할 필요가 있다.

오랜 시간을 투자해서 커널 코드를 분석해서 명시적으로 남는 것은 없었지만, 지금까지도 리눅스 커널 분석의 경험은 알게 모르게 필자에게 많은 도움을 주고 있으며, 어디가서 UNIX 계열의 운영체제 이야기가 나오더라도 꿀 먹은 벙어리가 되지 않을 수 있게도 해 주었음은 분명하다.

Epilog

2005년 10월인 지금 필자는 Virtual PC에 Linux 2.6.9를 설치하여 사용하고 있다(자주 사용하진 않는다). 10여년이 지난 지금 리눅스는 1.1.8에서 2.6.9까지 발전하였다. 버전 수치로만 보면 별다른 변화가 없어보이지만 LinuxHQ 사이트의 커널 관련 페이지를 좀 돌아다녀 보면, 얼마나 많은 커널 버전 업그레이드가 있었으며 얼마나 오랫동안 리눅스가 발전해 왔는가를 알 수 있을 것이다.

필자는 대학 3-4학년과 대학원 2년여 동안 리눅스에 파묻혀 살아왔으며, 아주 좋은 추억으로 간직하고 있다. 그래서 Virtual PC에 생쑈를 해 가면서 Linux 1.1.8을 설치하였고 옛 향수에 젖어본 것이다. 리눅스 1.1.8을 설치한 구체적인 방법은 나중에 시간을 내어 노가리를 풀어볼까 한다.



Comments (read-only)
#re: Linux와의 시간 여행... / cndjr / 10/14/2005 5:23:00 PM
ㅋ~ 정말 오랜만에 보는 반가운 설치화면입니다. T_T;
프로그램세계에 부록으로 나왔던 슬랙웨어 깔고 x-window띄우려고 일주일동안 날밤 깟더랬죠..
결국 성공하고나서 기억나는 일이란 동봉되있던 빌게이츠 때려잡기 게임이었다는 (-_-a)쿨럭~
#re: Linux와의 시간 여행... / 블로그쥔장 / 10/14/2005 5:28:00 PM
네... 정말 그 때는 자료 부족이 심해서 뭐 하나 하려고 해도 죽음이였죠.
X 윈도우 띄우고 한텀 설치하고 세연 띄우는 것 까지 하려면 날샘이 연속...
그리고 나서 끝내 모든 것을 설치하고 하이텔, 나우누리, 천리안에 접속하면,
주위에서 고수 소리를 들을 수 있었다는...
벌써 10년도 더 된 얘기가 되어 버렸네요... 쿨럭~
#re: Linux와의 시간 여행... / twiny / 10/16/2005 11:41:00 PM
ㅎㅎ 저도 ATI VGA Wonder + 싱크마스터 15GLi에 X 윈도 띄운다고 고생하던 기억이 납니다.
- 전 정말 며칠 고생했습니다.

근데 커널 업그레이드 몇번과 X윈도에서 돌아가는 마작(?) 게임 몇번하고 쓸 일이 없어서 OS/2만 열심히 썼던 기억이 나네요. 일요일 늦은 시간에 옛 생각이 많이 들게 하는 포스팅이네요. 아 나두 나이가 나이가...
#음... 저만 시행착오가 없었군요. ^^ / 정성태 / 10/17/2005 9:04:00 AM
척 보고... 음... 결국 Windows 에 밀리겠군.... 이란 생각이 들어서 인스톨 해본적도 없는뎅...

근데... 커널 분석은 정말 부럽습니다. ^^
저는 겨우, MicroC/OS-II 책에 나오는 정도의 것을 이해하는 수준입니다. 아무래도 저의 DDK 에 대한 알수 없는 동경은 그런 것들에 대한 부족인 것 같습니다.

그러고 보면... 아무리 컴퓨터 분야가 새로운 것을 배워야 한다고는 하나... 옛것을 배운 기반위에 현재의 것을 배워나가는 분들은 도저히 따라잡을 수 없음을 느낍니다. ^^ ( 현재도.... 왠만한 .NET 프로그래밍에서 COM 기술이 은연중에 연관을 맺고 있는 것이 많은 것 보면. ^^ )
#re: Linux와의 시간 여행... / 블로그쥔장 / 10/17/2005 11:59:00 PM
DDK에 대한 동경은 저도 마찬가지 입니다.
꼬옥 한번 도전해 보고 싶은 것이 DDK와 DirectX 죠.
성태씨 우리 함 도전해 볼까요?
#re: Linux와의 시간 여행... / 조승태 / 3/18/2008 4:19:00 PM
OS를 통채로 이해한다...
참 대단한 도전이네요.
하지만 곰곰히 생각해 보니,
Programmer로 성공하려면 중요한 부분이라는 생각이 듭니다.
어차피 프로그램은 OS에 포팅될 수 밖에 없으니까요.