메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

컬럼/인터뷰

『IT EXPERT, 리눅스 디바이스 드라이버』 저자 유영창님과의 인터뷰

한빛미디어

|

2004-11-25

|

by HANBIT

17,558

Q. "IT EXPERT, 리눅스 디바이스 드라이버"를 집필한 동기가 무엇입니까?

임베디드 시스템에 리눅스 커널을 적용하는 작업을 주로 하다보니 다양한 하드웨어에 맞는 커널을 개발하기 위한 디바이스 드라이버를 알아야 했습니다. 덕분에 오라일리에서 출간된 디바이스 드라이버 책을 옆에 끼고 살았습니다. 하지만 번역서이고 샘플 소스 코드가 필요한데 ftp에서 제공하고 있는 소스가 너무 복잡했습니다. 그리고 임베디드 리눅스 동호회인 KELP에서 이 책을 학습하는 사람들도 너무 어려워하고 있었습니다. 그래서 일반 PC에 설치된 리눅스에서 디바이스 드라이버를 실제로 따라 작성해볼 수 있는 소스를 소개해주는 책을 쓰고 싶었습니다. 또한 개발자로써 20년 가까이를 지내다 보니 그동안 나름대로 터득한 노하우를 책으로 옮겨 다른 개발자에게 도움을 주면 좋겠다는 개인적인 욕심도 한몫 했습니다.

Q. 이 책은 누가 봐야 할 책인가요? 구체적으로 프로그래밍이나 리눅스에 대한 수준이 어느 정도 있어야 리눅스 디바이스 드라이버를 이해할 수 있을까요?

무척 어려운 질문이네요. 디바이스 드라이버라는 것이 참 애매모호한 영역입니다. 단순히 커널이라고 보기도 그렇고, 응용 프로그램 영역과는 거리가 멀고, 완전히 소프트웨어적인 것이라고 하기도 그렇고, 하드웨어에 밀접하기는 하지만 완전히 하드웨어쪽도 아니고 조금 복합적인 영역입니다. 아마 이런 특성 때문에 쉽게 접근하기 어렵다는 것은 분명합니다. 그렇다고 아주 어려운 것은 아닙니다. 일반적인 용도로 사용할 수 있는 리눅스 디바이스 드라이버의 구조는 매우 간단합니다. 그래서 프로그램에 대해 조금 알고 있고 하드웨어 제어를 위한 매뉴얼을 보고 이해할 수 있는 수준이라면 누구나 학습이 가능하다고 생각합니다.

그리고 이 책이 필요한 사람을 꼽으라면 임베디드에 리눅스 커널을 사용하려는 사람이라면 반드시 봐야 할것 같고, 커널에서 하드웨어를 제어하기 위한 리눅스 커널의 구조를 이해하고자 하는 학생이나 관심이 있는 분들도 독자층이 될 수 있다고 생각되네요.


Q. 오라일리에서 출간되었던 Linux Device Drivers 외에 디바이스 드라이버에 관한 서적은 거의 전무한 상태입니다. 오라일리에서 출간된 Linux Device Drivers와 집필하신 서적과의 차이점과 어떤 내용이 실렸는지 궁금합니다.

이 책은 원래 오라일리에 출간되었던 리눅스 디바이스 드라이버의 보완서로 기획되었다가 나중에 리눅스 디바이스 드라이버를 설명하는 독립서로 변경된 책입니다. 그래서 크게 세 가지 점에서 오라일리 서적과 다릅니다. 우선 제가 오라일리 책에 가졌던 가장 큰 불만은 응용 프로그램과 디바이스 드라이버의 관계를 완전하게 설명하지 않는다는 겁니다. 디바이스 드라이버라는 것은 그 자체만으로 동작하지 않습니다. 응용 프로그램과 직간접적으로 연관되어 동작합니다. 물론 네트워크 디바이스 드라이버나 블록 디바이스 드라이버는 이런 특징에서 벗어나지만 가장 많이 사용되는 문자 디바이스 드라이버는 응용 프로그램과의 연관 관계가 매우 중요하고 디바이스 드라이버가 동작하는 것을 이해하는 데 가장 중요한 것입니다.

이 책의 가장 큰 특징은 이 부분에 있습니다. 두 번째 특징은 예제 소스입니다. 오라일리 책에서도 예제 소스를 제시하지만 처음 학습하거나 프로그램 실력이 조금 부족한 분들에게는 너무 어렵습니다. 꼭 필요한 소스만 부분적으로 다루기 때문입니다. 그래서 이 책에서는 이 점을 보완해 구체적인 모습을 알수 있도록 프린터 포트와 LED를 사용한 완전한 예제를 다룹니다. 마지막 특징은 커널 2.6에서 사용되는 디바이스 드라이버를 다루고 있다는 것입니다. 커널 2.6이 나온지 얼마되지 않았고, 오라일리에서도 아직 이를 다루는 서적을 계획하고 있지 않아 커널 2.6에 관련해 디바이스 드라이버를 다루는 유일한 책이 되지 않을까 생각됩니다. 더불어 특징이라고 보기에는 어렵지만 실전에서 사용되지 않은 함수나 기타 등등의 내용은 아예 언급하지 않았는데, 이 점은 장점이자 일부 독자분에게는 단점이 되지 않을까 싶습니다.

Q. 실전에서 많은 경험을 쌓았어도 도서를 집필하면서 미처 알지 못했던 것도 꽤 있었을 것도 같은데요. 어떤 것이 있었습니까?

실전에서 얻은 지식과 책을 쓰는 것은 정말 하늘과 땅 차이인것 같습니다. 제가 원래 게을러서 필요한 것 이상은 구체적으로 알려고 하지 않는 습관이 있었습니다. 하지만 책을 쓰기 위해서는 좀더 명확해야 하고 경험해 보지 않은 부분까지 구체적으로 알아야 하는 것 같습니다(덕분에 책 쓰는데 1년이나 걸렸다는..). 리눅스 디바이스 드라이버에서 가장 많이 지원하는 것이 블록 디바이스 드라이버와 네트워크 디바이스 드라이버입니다. 이 두 가지는 의외로 자신의 하드웨어에 맞는 디바이스 드라이버를 다시 작성할 경우가 거의 없습니다. 대부분의 하드웨어가 안정하게 구현된 상태이기 때문입니다. 덕분에 저 역시 현장에서 경험하지 못한 부분이었는데 책을 쓰면서 해당 디바이스 드라이버를 이해하는 데 애를 먹었습니다. 또한 커널 2.6에서 새로 등장한 워크 큐나 시스템 파일시스템은 참고할 만한 서적이 없어서(물론 다른 것도 오라일리 책 하나 밖에 없지만) 무척 고생했던 부분입니다. 특히 kobject의 개념은 너무 어려웠고 설명하기에 너무 분량이 많아져 일부분만 설명해야 해 아쉬움이 남습니다.

Q. 초창기 리눅스 디바이스 드라이버에 대한 관심이 있은 이후로 지난 몇 년간 이 분야는 얼마나 바뀌었습니까?

가장 큰 변화는 커널 2.4에서 커널 2.6으로의 전환입니다. 커널 내부 구조도 많이 바뀌었고 특히 블록 디바이스 드라이버는 완전히 대체되었다고 생각됩니다. 하지만 리눅스 커널의 특징은 내부적으로 바뀌었다고 그외 관련 부분까지 완전히 바뀌지는 않는다는 특징이 있습니다. 그래서 도리어 기존 소스를 그대로 사용할 수 있도록 신경쓴 부분이 여기 저기 드러납니다. 그런 측면으로 보면 의외로 변화한 부분이 매우 적다고 봐야 할것 같습니다.

Q. 디바이스 드라이버를 개발하면서 나름대로 노하우라고 할 수 있는 디버깅 전략이 있으시면 몇가지만 언급해 주시겠습니까?

커널에 포함된 디바이스드라이버를 개발할 때 디버깅이라는 것이 무척 어렵습니다. 디버깅 툴이 있지만 잘 사용하지 않게 됩니다. 특히 저같이 게으른 개발자는 더 그렇습니다. 그래서 가장 많이 사용하는 것이 printk라고 말할 수 밖에 없는 것 또한 현실입니다. 결국 디버깅이라는 것이 잘못된 부분을 추적하는 것이기 때문에 제어 조건에 해당하는 부분을 정상적으로 통과하는 가와 관련 변수값들이 어떻게 변화 하는가를 알아보는 것이죠. 그래서 무식하지만 가장 확실한 printk를 사용합니다. 또 한가지 더 사용하는 것은 proc 파일시스템입니다. 설정값이나 기타 제어 관련된 값 또는 상태값을 이 파일시스템을 이용해 출력하게 하는 것입니다. 그외에 새로운 하드웨어를 개발한다면 해당 하드웨어를 동작시키도록 하는 것이 무척 힘들고, 시간이 많이 소요됩니다. 이때 하드웨어가 로컬 버스 시스템에 연결되어 메모리 맵 I/O 방식이거나 PCI 디바이스라서 메모리상에 보인다면 /dev/mem 을 이용해 응용 프로그램에서 매핑하여 응용 프로그램에서 직접 레지스터를 접근해서 초기화 처리나 기타 테스트를 한 후 해당 루틴을 디바이스 드라이버로 옮깁니다. 이 방법을 실제로 사용해 보면 커널을 건드리지 않기 때문에 무척 유용합니다. 그외에 기존 디바이스 드라이버를 옮길 경우 테스트용 PC를 이용해 적용하려는 시스템에서 동작하는 것과 어떻게 다른지를 비교하면서 테스트합니다.

Q. 디바이스 드라이버를 효과적으로 개발하기 위해 프로그래밍 실력도 중요하겠지만 커널을 비롯한 리눅스의 동작 원리에 대한 이해과 무엇보다도 중요하다고 생각합니다. "리눅스 디바이스 드라이버"를 집필하면서 필요한 정보들을 어디서, 어떻게 얻으셨는지.. 아울러 리눅스의 내부적인 동작원리나 구조에 대한 이해가 부족한 프로그래머들에게 충고나 제안을 한다면? 어디서부터 어떻게 시작해야할 지 조언을 부탁드립니다.

제가 디바이스 드라이버를 개발할때 가장 많이 의존하는 것은 인터넷입니다. 특별히 지정된 사이트는 없지만 구글을 가장 많이 이용합니다. 특히 구글은 리눅스와 관련된 검색이 따로 존재하기 때문에 강력하게 추천하고 싶습니니다. 그 외에 제가 책을 무척 좋아하는 사람이라서 리눅스 관련된 서적을 가급적 모두 사 봅니다. 대부분의 우선 한번 쭉 읽은 다음에 필요할 때마다 참고합니다. 그리고 리눅스 디바이스 드라이버는 공개된 관련 문서가 적은 편이라 관련 서적도 몇 권 없는데, 이 때 도움이 되는 것은 커널 관련서입니다. 물론 많은 기대는 하지 않는 것이 좋죠. 가장 확실한 참고서는 역시 커널 소스입니다. 저 역시 항상 커널 소스의 디바이스 드라이버를 뒤져 궁금증을 해소합니다.

리눅스 내부적인 동작 원리는 무척 방대합니다. 그래서 우선 운영체제 개론을 대충이나마 읽고 이해한 후에 디바이스 드라이버를 먼저 공부하라고 권하고 싶습니다. 그런 다음에 리눅스 커널 관련서를 읽기 권합니다. 커널을 모두 이해하고 디바이스 드라이버를 이해하려고 하면 커널부터 좌절하게 될지도 모르기 때문입니다. 그래서 디바이스 드라이버부터 작성하다보면 커널을 이해하기가 수월하다는 것이 저의 개인적 생각입니다. 더구나 디바이스 드라이버는 의외로 단순한 프로그램입니다. 하드웨어를 조금만 이해하면 그리 복잡하지 않은 로직으로 프로그램을 구성할 수 있기 때문에 초보자라도 쉽게 접근할 수 있다고 생각합니다.

Q. 한빛미디어(주)를 위해 책을 집필하는 것을 제외하고, 밤을 지새울 만한 이유가 있다면 무엇이 있을까요? 혹시 독자들에게 알려 주고 싶은 현재 진행중인 프로젝트는 없나요?

우리나라 개발자들은 항상 밤을 지새우죠. 그것이 좋지 않다는 것을 알면서도 국내 개발 특성상 어쩔수 없다고 생각합니다. 저 역시 대한민국에서 개발자로 살고 있고 다양한 프로젝트를 지정된 시간에 끝내기 위해서 오늘도 밤을 불태웁니다. 지금은 커널 2.6을 기존에 생산된 제품에 적용하기 위해 애쓰고 있습니다. 그런데 작업을 해보니 커널 2.4보다는 커널 2.6이 임베디드 시스템에 더 좋은 커널 같습니다. 그외에 DVR(디지털 비디오 레코더)와 출입문 제어 장치를 위한 장비를 만들기 위한 프로젝트를 진행하고 있습니다. 하드웨어도 함께 만드는 회사이다보니 주어지는 일이 참 다양하다고 느껴지는데, 내년에는 홈게이트웨이 컨트롤러 프로젝트를 시작할 것으로 보입니다.

Q. 이렇게 시간을 내어 인터뷰에 응해주셔서 대단히 감사합니다. 마지막으로 덧붙이고 싶은 말씀이 있다면?

많은 분들이 임베디드에 관심을 가지고 리눅스를 적용하려고 합니다. 이런 분들에게 이 책이 얼마나 도움이 될지 잘 모르겠습니다. 제가 현장에서 경험한 내용에서 꼭 필요하다고 느끼는 내용은 모두 포함했지만 디바이스 드라이버를 학습하려면 조금 긴 시간이 필요합니다. 너무 조급하게 생각하지 말고 천천히 학습하라고 부탁드리고 싶습니다. 그 과정은 조금 험해도 일단 익숙해지면 그 뒤에는 새롭고 평탄한 길임을 보장합니다. 더구나 윈도우 디바이스 드라이버보다 리눅스 디바이스 드라이버는 학습하기도 쉽고 그 사용도가 높은 편입니다. 이미 임베디드 분야에서 대세는 리눅스로 돌아섰습니다. 그렇기에 임베디드 시스템 개발자가 되고자 하는 학생이나 개발자라면 리눅스 디바이스 드라이버를 꼭 학습하시라고 권합니다.
TAG :
댓글 입력
자료실