Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
소개

1. 소개

1.1. 프로그래밍의 세계로

1.2. 사용하는 도구

이책은 x86 프로세스기반의 GNU/Linux 운영체제에서 어셈블리어를 이용한 프로그래밍에 대해서 다룬다. 이런 이유로 이책의 모든 예제와 이에 대한 설명은 GNU/Linux상에서 GCC도구를 이용해서 이루어질 것이다. 이는 여러분이 GNU/Linux와 GCC도구에 대한 이해가 부족할경우 책의 내용을 이해하는데 있어 문제가 될 수 있음을 의미한다. 만약 Linux와 GCC에 생소 하다면 이책을 읽기 전에 http://rute.sourceforge.net의 문서를 읽어 보기 바란다. 영문을 보기 싫다면 서점에서 매우 잘 번역된 많은 리눅스 관련 서적으로 리눅스에 대한 스터디를 대신할 수도 있다.

리눅스 관련 문서와 책은 분명 많은 도움을 주긴 하지만 그때 그때 닥치는 실시간성의 의문점등을 해결하고 책에서는 얻기 힘든 도움을 얻기 원한다면 리눅스 유저 그룹을 활용하면 된다. kldpjoinc, gentoo와 같은 사이트를 이용하기 바란다. 좀더 실시간의 도움을 원한다면 irc를 이용하기 바란다.

여기에 있는 프로그램들은 RedHat Linux 9.0, Kernel 2.6.x 환경에서 작성되고 테스트될 것이다. 다른 배포판을 사용하고 있다고 해서 걱정할 필요는 없을 것이다. 패키지 관리, 시스템 관리와 관련된 사항들을 제외하고는 거의 100% 호환을 장담할 수 있기 때문이다.

여러분의 PC에 직접 리눅스를 설치해서 공부를 하는게 가장 좋은 방법이긴 하지만 이게 여의치 않을 경우 리눅스 계정을 얻을 수 있는 시스템을 수소문해 보기 바란다. 여러분 주위의 리눅스 시스템을 가지고 있는 친한 친구에게 밥한끼 사주고 절대 시스템에서 이상한 행동을 하지 않겠다고 다짐해 준다면 쉽게 얻을 수 있을 것이다. 이러한 친구가 없다면 어쩔 수 없다. 리눅스를 설치하기 바란다. 위에서 언급했던 리눅스 유저 모임등에서 쉘 계정을 얻을 수도 있겠지만 여러분이 오랜시간동안 유저 모임에서 활동을 해서 충분한 신뢰를 쌓은 경우가 아니라면 계정을 얻는건 매우 힘든 일이 될것이다.

그런데 리눅스가 뭐지? 라고 궁금해 할 수도 있을 것 같으니, 간단히 언급하도 넘어가도록 하겠다. 리눅스는 유닉스와 매우 비슷한 운영체제로 GNU 프로젝트의 일부로 개발되어지고 있는 공개 운영체제다. 리눅스 운영체제는 리눅스 커널과 그 밖의 다른 수많은 GNU프로젝트에 의해서 개발된 응용프로그램으로 구성된다. 이러한 응용프로그램 중에 GCC도구가 포함되어 있는데, 이걸 이용해서 다양한 (프로그래밍)언어로 작동가능한 프로그램을 만들어 낼 수 있다.

리눅스 운영체제의 핵심은 커널(kernel)이며, 엄격한 의미로 리눅스는 이 커널을 가르킨다. 커널은 운영체제의 핵심으로써 모든 것을 제어한다. 인체로 말하자면 두뇌쯤 되는 부분일 것이다. 두뇌는 신경으로 전달되는 외부의 자극을 받아들이고 자극을 해석해서 각 기관을 움직인다. 벌래가 눈앞으로 달려들면 눈을 감는다거나, 뜨거운 물건을 쥐었을 경우 반사적으로 손을 움추리거나 하는 등의 행동이 그것이다. 커널은 사용자의 명령을 받아들여서 프로세스를 실행하고 각종 장치(인체로 말하자면 기관)을 제어한다. 또한 다중의 프로세스가 작동중일 경우 프로세스를 스케쥴링한다. 예를 들어 키보드(장치)를 사용자가 누르면 커널은 키입력을 받아들이고 키입력을 키에 매핑되는 문자로 변환해서 화면에 출력할 것이다. 만약 X Windows 시스템이라면 윈도우 시스템은 커널로 부터 키입력을 읽어 들이고 현재 떠있는 애플리케이션의 입력창에 문자를 출력한다.

Keyboard -> Kernel -> Windowing system -> Application program
			
위의 키보드 입력을 보면 커널은 윈도우 시스템과 장치 그리고 애플리케이션 프로그램간의 데이터 흐름을 제어한다. 여기에서 커널이 장치와 프로그램 사이, 프로그램과 프로그램 사이의 정보의 흐름을 제어함을 알 수 있다.

프그램이 다루는 각각의 데이터와 장치의 권한을 관리해서 서로의 데이터 영역을 침입하지 않도록 제어하는 것 역시 커널의 중요한 기능 중 하나이다.

이상으로 커널은 곧 리눅스라는 걸 이해했을 것이다. 그러나 커널만 있다고 해서 운영체제가 작동할 수 있는 건 아니다. 회사를 예로 들어 보자. 전화가 놓여 있고 컴퓨터가 있다고 해서 회사가 돌아가는 건 아니다. 실제 일을 하는 사람이 있어야 한다. 전화와 컴퓨터와 같은 기반 시설은 리눅스 커널이며 사람은 (GNU)응용 애플리케이션 볼 수 있다. 둘이 조화를 이루어야 목적을 달성할 수 있을 것이다.

우리는 커널이라는 갖추어진 기반 시설위에서 작동하는 애플리케이션을 작성할 것이며, 애플리케이션의 작성을 위해서 어셈블리(assembly)어를 사용하는 법을 배울 것이다. 어셈블리어를 다루기전에 기본이 되는 3가지 언어에 대해서 알아보도록 하겠다.

기계어(Machine Language)

컴퓨터가 직접 이해할 수 있는 언어다. 모든 명령은 컴퓨터가 이해할 수 있는 일련의 숫자로된 명령에 의해 이루어진다. 특수한 사람만 이해할 수 있다는 단점이 있다.

어셈블리어(Assembly Language)

기계어와 동일하지만 이해하기 어려운 일련의 숫자대신 사람이 이해하기 쉬운 문자로 이루어진다.

고급어(High-Level Language)

좀 더 쉽게 프로그래밍 할수 있도록 만들어진 언어로 보다 인간의 언어에 가깝다. 인간이 이해하기 쉽다는 장점이 있으나 하나의 어셈블리 명령으로 실행해도 될걸 여러번의 명령으로 실행되므로 비효율적일 수 밖에 없다.