서적에 관한 질문 및 오류 등을 문의 할 수 있으며, 저자로부터 직접 답변을 받을 수 있습니다.

항상 나오는 얘기이고, 인터넷에 찾아봐도 많이 나오는 얘기입니다.


물론, 이번에 쓴 안드로이드 책에도 해당 부분에 대한 있습니다.

(유형목님께서 아주 깔끔하게 정리해 주셨습니다....^^)


여기서는 제가 개인적으로 유닉스에 대해서 어떻게 접근하는지, 이해하는지에 대한 설명을 하겠습니다.


=============================================================================================


0. 유닉스의 내부구조


http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=5000155323


"프로그래머와 사용자를 위한 Unix 완성"
Graham Glass (지은이)
조경산 (옮긴이)
이한출판사


이 책은 현재 절판된 책입니다. 물론, 내용을 보면 예전 내용이거나 아니면 너무 지루한 부분도 많습니다만, 11장 "유닉스의 내부" 부분만큼은 정말 바이블로 불러도 손색이 없을 만큼 설명이 잘 되어 있습니다.


90 페이지 정도에 걸쳐서 유닉스의 내부구조에 대해서 설명하는데, 지은이가 얼마나 심혈을 기울이고, 얼마나 해박한 지식을 가졌는지 알 수 있습니다.


예전 대학교 도서관에서 빌려서 보던 책이었습니다.


지금도 가끔 보고 다시금 감탄하고 있는 책입니다. 특히 Filesystem관련에 대한 기본설명은 어느 책보다도 뛰어납니다.


여기서부터는 첨부되는 파일을 보면서 설명하도록 하겠습니다....

말로 하려면 너무 힘들어서요....ㅎ


일단 첨부파일을 받으시고요....


==================================================================

Page 2. UNIX System


UNIX system에서 제일 중요한 내용은 발전 방향입니다. 왜 탄생했느냐죠????


유닉스의 탄생배경은


- 이전 OS들은 assembly 언어와 많은 system call을 이용해서 만들었기 때문에 응용 프로그램간의 호환성이 없었습니다

- 그러다 보니 코드의 재활용이란 개념이 전혀 없었기 때문에 표준이 필요하였습니다.

- 이러한 OS에서의 표준을 만들고자 시도한 것인 UNIX였고, 이 때 탄생했던 언어가 C입니다(이전의 B도 있었다는 얘기가 얼핏 기억나네요)


C 언어를 사용할 때 대부분 보게 되는 것인 Library Reference 문서입니다. 리눅스나 유닉스에서는 man 명령어로 찾아보게 되는...


library reference를 보다보면 한가지 특이한 점들이 보일겁니다.


POSIX 1003.a 호환 등등.....


이러한 글은 함수 인터페이스에 대한 표준을 얘기하는 것입니다. 물론, Windows 계열에서도 POSIX 호환 함수는 많이 사용합니다.


===================================================================

Page 8 을 보면 유닉스는 기본적으로 커널/사용자 공간이 분리되어 있는 구조입니다.


사용자 공간에 있는 프로세스(이건 약간 뒤에 설명)는 커널 공간으로 진입하기 위해서는 반드시 "System call"을 이용하도록 정의되어 있습니다.


이 System call이란 것이 실제로는 표준이란 개념입니다. 즉, 커널을 이용하기 위한 표준규약 같은거라고 보시면 됩니다.

우리가 볼 때는 그냥 "함수"와 별반 차이가 나지 않습니다.


유닉스의 탄생에서부터 현재까지 존재하는 유닉스의 규칙은...


- 사용자 공간과 커널 공간의 분리: 이는 시스템의 안정성을 위한 것입니다. 아무나 하드웨어를 막 손대면 안되니깐요

- 사용자 공간에서 커널공간으로 진입하기 위해서는 System call을 이용할 것: 시스템 안정성과 표준화


===================================================================

Page 8 관련, System call에 대해서


System call은 대략 다음과 같은 다섯가지가 있습니다.


- open()

- read()

- write()

- ioctl()

- close()


물론, 꽤 많기는 하지만, 이 다섯개를 이용하면 유닉스의 거의 모든 부분을 제어할 수 있습니다.


이 함수를 이용해서 모든 커널의 기능을 이용하도록 정의되어 있습니다.


리눅스 디바이스 드라이버 중 "문자 드라이버 - character driver"를 작성해 보신분은 금방 눈에 들어오실겁니다.

문자 드라이버는 위의 다섯개 함수를 어떻게 커널의 특정 디바이스 드라이버와 매칭하는가에 대한 얘기입니다.


그런데, 여기서 재밌는 system call이 두가지가 있습니다.


open()과 ioctl()입니다.


open()은 내용에서도 볼 수 있듯이, 어떤 것을 "연다" 입니다. 우리가 대부분 이함수에 대해 알고 있는 것은 "파일을 연다"

정도일텐데, 재밌는 것은 파일도 파일 나름이라는 것입니다.


일례를 들어...


int fd;


fd = open("/sdcard/ggg.mp3", O_RDONLY);


이런식으로 이용한다면 /sdcard/ggg.mp3 파일을 read only로 오픈 하는 것입니다.

다른 예로.....다음과 같은 코드를 보시면....


int fd;


fd = open("/dev/ttyS0", O_RDONLY); // x86의 경우 COM1


혹은


fd = open("/dev/tts/0", O_RDONLY); // 임베디드 리눅스 2.6 커널의 첫번째 serial device


혹은


fd = open("/dev/s3c2410_serial0", O_RDONLY); // Samsung LSI 칩계열의 첫번째 serial device


이렇게 각기 리눅스 혹은 유닉스 시스템에 따라 serial 장치를 오픈할 수 있습니다.



즉, open()이란 함수는 파일 혹은 장치를 오픈하는 시스템 콜이고

장치의 경우는 /dev/란 디렉토리 밑에 파일로 존재해야 하는 것............이란 사실을 알 수 있습니다.


=======================


오늘은 졸려서 여기까지 쓰고, 내일 다시 필요한 부분을 정리하도록 하겠습니다.


간단하게 얘기하려고 했더니, 설명하기 시작하니 길어지네요....쩝





"사람은 자기가 보고 싶은 현실만 볼 뿐이다." - Gaius Julius Caesar
첨부
엮인글 :
http://www.aesop.or.kr/index.php?mid=Board_Community_Book&document_srl=38369&act=trackback&key=09a
List of Articles
번호 제목 글쓴이 날짜 조회 수
3 [Linux와 Android] 002 - UNIX/Linux system 개요(Continue...... 고도리 2011-07-02 8573
» [Linux와 Android] 002 - UNIX/Linux system 개요 file 고도리 2011-06-22 8626
1 [Linux와 Android] 001 - 임베디드 시스템에 대하여 file 고도리 2011-06-21 9496

사용자 로그인