2007년 11월 22일 목요일

proc, module programing



<< proc file system >>

proc file system은 파일과 프로세스를 통합하여 관리한다.
/proc 디렉토리에 가보면 프로세스나 하드웨어 정보를 담고있는 파일들을 볼 수가 있다.
이 파일들은 실제로 하드디스크 공간을 차지하지는 않으며, 사용자가 접근을 할 때 커널이 그 내용을 동적으로 만들어준다.

즉, user가 proc file system의 내용을 사용하려고 호출을 하면 커널이 그에 맞는 등록함수를 찾아서 사용할 수 있는 것있다.
그러므로 실제 data가 있는 것이 아니고 이 file system을 거쳐서 등록함수를 찾아내는 것이다. 이 등록함수들을 통하여 커널에 접근을 할 수 있으며, 이 함수들을 module이라고 한다.
결국, proc file system은 매개체의 역할을 하는 한마디로 trigger라고 할 수 있다.


그럼, 지금부터 module을 만들어서 proc을 사용해보도록 하자.



<< Module Programing >>

* 주의할 점 *
module programing은 kernel단의 programing이므로 자칫 잘못하다가는 시스템이 죽을 수 있으며, programing을 할 때 평소 사용하던 standard library는 사용할 수 없다.


1. 모듈 init 함수와 exit 함수.

module program에 꼭 필요한 것이 있는데 바로 init함수와 exit함수이다.
init함수는 module이 생성될 때 호출되는 것이며, exit함수는 module이 사라질 때 호출되는 것으로 C++의 생성자/소멸자와 비슷한 개념이다.

함수의 이름은 다음과 같이 지정해주어야만, init함수/exit함수로 인지할 수 있다.

//init 함수
int init_module(void)
{
  
  // ... 필요한 일들을 수행
  
  return 0;
}

//exit 함수
void cleanup_module(void)
{
  // ... 필요한 일들을 수행
}

만약, 원하는 함수이름으로 지정을 하고 싶다면 원하는 이름으로 하되, 그 함수가 init함수/exit함수라는 것을 알려줄 수 있어야 한다.

init함수/exit함수를 지정해주는 매크로는 다음과 같다.
만약 init함수를 int myproc_init(void) 라고 선언하였고, exit함수를 void myproc_exit(void)라고 선언하였다면,

module_init(myproc_init);
module_exit(myproc_exit);


.. 이라고 사용한다.

init함수/exit함수만 알아도 hello world같은 쉬운 프로그래밍을 구현할 수 있다.


2. directory 만들기

내가 만든 모듈을 proc file system에 연결시켜서 사용하기 위해서는 proc file system에 directory가 필요하다.
이 directory로 접근을 하는 명령을 사용한다면 현재 programing하는 module을 가져올 것이다.

보통, directory는 init함수 안에서 생성하게 된다.

directory를 만들기 위해서는 proc_dir_entry라는 구조체가 필요하다.
전역변수로 struct proc_dir_entry형 변수를 하나 pointer로 선언한 후 함수를 호출한다.

static struct proc_dir_entry *dir; //전역변수로 선언
dir = proc_mkdir(MODULE_NAME, NULL);

여기서 말하는 MODULE_NAME은 스스로 지정해주어야 하는 문자열이며, 이 이름으로 directory를 생성한다.
directory생성에 실패할 경우 dir에 NULL값이 retrun되므로 확인하여 에러처리 할 수 있다.


3. read/write 콜백 함수

user가 read나 write를 위하여 module에 접근할 경우 read를 담당하는 함수와 write를 담당하는 함수가 필요하다.
사용자의 요구를 처리하기 위한 함수로 "cat"같은 명령어로 접근할 경우에는 read를 담당하는 콜백함수가 호출되고 "echo"같은 명령어로 접근할 경우에는 write를 담당하는 콜백함수가 호출된다.

그러니까, 결국은 콜백함수를 만들어 줘야 한다는 것이다.
읽기함수나 쓰기 함수의 이름은 어떤 것으로 해주어도 상관이 없지만 형식은 지켜주어야 한다.

읽기/쓰기 call back 함수의 형식은 다음과 같다.

int read_func(char* page, char** start, off_t off, int count, int* eof, void* data);
int write_func(struct file* file, const char *buffer, unsigned long count, void *data);

읽기 함수에서는 읽을 내용을 page에 읽어오고, 쓰기 함수에서는 buffer에 사용자가 쓴 데이터를 가져온다.
이러한 형식으로 선언된 call back함수에서는 read/write로 접근하였을 때 해주어야 할일을 구현하면 된다.

이 call back함수들을 위한 entry를 생성하고 등록을 시켜주는 일은 init함수에서 한다.

우선, READ를 위한 것 부터 보면 다음과 같다.

static struct proc_dir_entry *read_file; //전역변수로 선언
read_file = create_proc_read_entry("read", 0444, "MyProc", myproc_read, NULL);

init함수에서 create_proc_read_entry함수를 호출하여 entry생성과 등록을 시켜준다. 읽기 전용으로 "read"파일을 MyProc 디렉토리 안에 만드는 것이다. 이 때 MyProc은 위에서 생성한 directory (MODULE_NAME)와 이름이 같아야 한다. 0444는 접근 권한이며 myproc_read라는 함수를 call back함수로 등록시켜준다.
create_proc_read_entry라는 함수는 wrapper함수이다. 이 함수 안에서도 결국 create_proc_entry를 호출을 하여 사용하지만 읽기 전용 proc파일을 생성하기 쉽게 하기 위해서 사용한다.
이 wrapper함수도 위에 directory 생성 함수와 마찬가지로 read_file로 return된 값이 NULL이라면 entry생성에 실패한 것이므로 에러처리를 해줄 수 있다.

다음은 WRITE를 위한 함수를 보자.

static struct proc_dir_entry *write_file; //전역변수로 선언
write_file = create_proc_entry("write", 0644, "MyProc");

init함수에서 create_proc_entry를 호출하여 entry를 생성하고 등록시킨다.
읽기/쓰기 전용으로 "write"파일을 MyProc디렉토리 안에 만들게 된다.
create_proc_read_entry 안에서도 이 함수를 호출하게 되나 wrapper함수를 사용하면 더 좋은 점은 읽기전용에 대한 설정들을 자동으로 해준다는 것이다.
create_proc_entry를 호출하게 되면 proc_dir_entry 구조체에 있는 값들을 설정을 해주어야 한다. wrapper함수를 사용하면 call back함수를 자동으로 연결시켜주지만, 이 함수는 그렇지 못하므로 그 연결을 해주기 위한 설정이 필요한 것이다.

write_file->read_proc = proc_read;
write_file->write_proc = proc_write;
//call back함수를 연결해 주어야 한다.


4. 몇 가지 유의 사항

proc_dir_entry 구조체를 생성할 때 성공적으로 만들어지지 못하면 NULL값이 return되므로 에러처리를 해준다.

proc_dir_entry 구조체를 성공적으로 생성한 후에는 구조체에 있는 owner의 값에 THIS_MODULE을 넣어주어야 제대로 동작한다.
즉, 위에 write_file을 예로 들면,
write_file->owner = THIS_MODULE 이런식으로 해주어야 한다.

init함수와 read/write call back함수에는 반드시 return값이 필요하다. 성공을 했을 경우에는 return 0를 해주자.
read/write함수에서는 데이타의 길이를 return하는 경우도 있다.


5. 모듈 컴파일

call back함수와 init/exit함수를 다 구현하였다면 컴파일을 해보자.
2.4커널 버전을 사용한다면 간단한 컴파일 명령으로 컴파일이 가능하다.

$ gcc -c -D__KERNEL__ -DMODULE -O test.c

그러나, 2.6버전의 커널을 사용한다면 Makefile이 반드시 필요하다.

$ vi Makefile

Makefile을 만들어보자.

obj-m := test.o //object file 이름이다.
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
  $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
  rm -rf *.ko
  rm -rf *.mod
  rm -rf *.o
  rm -rf *.cmd

.. 이것이 간단한 Makefile이다.

그리고 나서 컴파일을 하면 여러개의 파일이 마구 생긴다.
그 중에서 우리가 필요한 파일은 test.ko파일이다. (2.4커널버전에서는 test.o)
이것이 바로 module파일이다.


6. module 생성

$ lsmod

.. 라고 명령어를 실행시키면 지금 올라와 있는 module들이 보여진다.
이 곳에 만들어 놓은 module을 올려보자.

$ insmod test.ko

.. 이렇게 하면 만들어 놓은 test라는 이름으로 module이 올라가면서 /proc 아래에 프로그래밍 할 때 MODULE_NAME으로 주어진 이름으로 directory가 하나 생성된다.

$ cat /proc/MyProc/read

.. 라고 하면 read파일에 읽기로 접근한다.

$ echo "test" > /proc/MyProc/write

.. 라고 하면 write파일에 쓰기로 접근한다.

하는일은 call back함수에서 지정한 일을 하게 된다.

module을 삭제하고 싶으면 다음 명령어를 실행시킨다.

$ rmmod test

2007년 11월 16일 금요일

황태자비 납치사건

제목 : 황태자비 납치사건
저자 : 김진명


김진명씨에 혹해서 본 책이었는데 혹자는 김진명씨의 박진감이 없다고 했고, 혹자는 김진명씨 책 중 최고라 칭했다.
나는 김진명씨 책을 아직 다 보지 못했으므로 저러한 평은 감히 할 수 없지만, 역사의식의 고취라는 점에 있어서는 크게 영양을 미쳤다고 생각한다. 난 이 소설을 읽고나서 예전 신문을 찾아 후쇼샤 교과서 시절의 기사들을 읽었으니까.

김진명씨 소설이 욕을 먹는 이유는 반미, 반일이 굉장히 많이 섞여 있기 때문이다. 책을 읽고나면 정말로 미국이랑 일본은 X같다-_-) 라고 느낄만큼 울분이 터지는 내용이 많다. 그러나 분노하기 보다는 객관적인 사고가 필요하다고 생각한다.

황태자비 납치사건의 배경은 후쇼샤교과서가 발간되고 이것을 유네스코회에서 검증을 받는 과정이다. 물론 대한민국측에서는 일본이 교과서 왜곡을 하고 있다고 일본측에 수정을 요구했고, 일본은 왜곡이 아니라며 반박했다.

처음 이 소설을 접했을 때는, 우리나라의 황태자비를 납치한 '명성황후'에 대한 내용이라고만 생각되었는데, 여기서 말하는 황태자비는 일본의 황태자비로 후쇼샤교과서에 반발한 일본에서 지내는 한국인이 황태자비를 납치하는 것으로 소설이 시작된다.

이 한국인은 일본의 지역유지로써 신망있는 목사지만 과거 자신의 조상이 명성황후를 버리고 궁궐에서 도망친 사실을 알게되면서부터 국가에 사죄하고 역사를 되찾기 위해 노력하며 살아간다.

그리고 황태자비는 납치범에게 납치의 동기를 듣게되고 과거 '명성황후' 때의 역사에 관심을 가지게 되면서 일본의 잘못을 되돌리려고 노력하며 납치범에게 동조하게 된다.


후쇼샤 교과서는 실제로 있는 일본의 역사 교과서 이고, 대한민국의 반박에도 불구하고 유네스코를 통과해 일본에서 쓰이고 있다. 우리나라가 수정을 요구한 조항 중 몇가지는 수정이 되었으나 대부분이 수정되지 못하였다.
임진왜란이나 일제강점기 하의 사건들을 정당화 하려 했고 독도를 다케시마라 표현하였으며, 위안부, 제암리 사건을 누락시켰고, 임나일본부설을 주장했다.

이 소설이 어디까지가 사실이고 어디까지가 허구인지는 모르겠지만, 2001년 당시 일본은 우리의 수정안을 다 받아들이지 않고 교과서를 통과시켰고, 그 당시에는 많은 반발로 인하여 교과서 채택률이 매우 낮았다.
그러나 4년 후, 점점 채택률은 올라갔고, 일본의 학생들은 왜곡된 교과서로 공부를 하고있다.


우리는 이 사실을 알아야한다.
나를 알아야 상대방도 공격할 수 있는 법이다. 무작정 일본이 싫다보다는 왜, 어떠어떠해서 가 필요한 것이다. 일본문화를 좋아하는 10대 청소년들도 일본문화를 좋아하는 것이 나쁘지는 않지만 그것과 별개로 역사는 알아야한다고 생각한다.
그래야 일본에 '사실'을 주장할 수 있고 알릴 수 있는 것이다.

2007년 11월 15일 목요일

tftp 설치

1. install
  우선, tftp 패키지를 인스톨 해야한다.

  $ yum install tftp-server

  인스톨이 되면서 tftp가 깔리는 동시에 루트에 tftproot 폴더가 생성된다.


2. 설정
  /etc/xinetd.d/ 에 가보면 tftp라는 파일이 있다.
  그 파일을 열어보면 tftp에 대한 설정이 저장되어 있는데 처음 install을 했을 경우, tftp service가 disable되어있다. 그것을 "no"로 바꿔주면 enable된다.


3. 재시작
   $ /sbin/service xinetd restart

  설정을 변경해주었으므로 재시작 한다.


4. 테스트하기
   잘 설치되었는지 보려면 테스트를 해본다.
   $ tftp localhost
   라고 입력하면 자기 컴퓨터의 tftp server로 접속하게 된다.
   기본적으로 루트에 생성된 tftproot폴더로 접속된다. 아무 파일이나 다운받아보자.
   tftp> get test.txt (물론 파일을 다운받으려면 그 폴더에 이 파일이 있어야한다.)
   tftp> quit

   quit한 뒤 현재 폴더에 다운로드 받은 파일이 있나 확인해본다.
   잘 다운받아졌다면, tftp설치 complete!!

2007년 11월 13일 화요일

samba server 사용



samba server에 user추가

samba server에 user를 추가하기 위해서는 일단 리눅스 계정이 있어야만 한다.
그러므로 리눅스 계정이 있다면 그 계정으로 samba server를 만들면 되고, 아니면 리눅스 계정부터 만들어 주어야한다.

$ useradd test

test라는 이름으로 linux계정을 만드는 명령어 이다. 그리고 password를 지정해주어야 하는데 다음과 같다.

$ passwd test

test라는 계정에 password를 지정해줄 수 있게 한다.
passwd는 확인을 하기위해서 두번을 입력받아 저장한다.

이제 samba server에 이 test라는 녀석을 user로 추가해보자.
예전 버전에서는 smbadduser라는 명령어를 썼다고 하던데, 최신버전에서는 그냥 하면 되더라......;;;;;

$ smbpasswd -a test

라고 하면 test라는 계정을 samba server에 추가하면서 passwd설정까지 같이 해주는 것이다. 옵션에 따라서 추가인지 삭제인지 혹은 그룹을 지정하는 것 까지 가능하다.
이 명령어를 사용하면 test라는 계정을 samba server에 추가하면서 samba server에서 사용할 password를 물어본다.
이 때도 마찬가지로 password를 두 번 입력받아 저장한다.

"Added user test." 라는 문구가 뜨면 성공이다.


samba server 접속

server에 접속을 하기 위해서는 smbclient가 필요한데, 없으면 깔아야 한다.

$ yum install samba-client

하면 install이 되고 samba-client가 깔린다.
그리고 samba server에 접속한다.

$ smbclient //IP주소/homeDir -U ID

이런식으로 사용한다.
예를들어 127.0.0.1에 접속하려 하고 내 계정이 test라면,
$ smbclient //127.0.0.1/test -U test 라고 사용한다.
password를 치고 접속을 하면 자신의 directory가 보인다.

프롬프트도 바뀌는데
smb: \>
이렇게 뜬다.
이 samba server에서 받고 싶은 파일이 있다면 get명령어를 사용해서 파일을 받으면 된다.

smb: \> get test.txt

samba server에서 사용할수 있는 모든 명령어는 ?를 치면 다 나온다.

smb: \> ?







2007년 11월 12일 월요일

tar 압축



window에서는 알집을 사용해서 압축을 하는데,
linux에서는 tar 명령어를 사용해서 압축을 풀거나 압축을 할 수 있다.


<< 압축해제 >>

압축해제시 가장많이 사용하는 옵션은 'xvf'이다.

$ tar xvf test.tar(압축해재 할 파일명)

대부분 이런식으로 이용한다.
xvf 옵션을 많이 사용하는 이유는 대부분의 파일이 .tar로 묶여있기 때문인데, xvf옵션을 가지고 이런 확장자를 갖는 압축파일들을 풀 수가 있다.
xvf 옵션의 의미는 폴더에 압축해제를 하면서 압축을 푼 파일들을 화면에 보여달라는 뜻이다.

가끔가다가 .bz2로 묶여있는 압축파일이 있는데, 이 때는 'j' 옵션을 주면 풀 수가 있다.
.gz도 가끔 볼 수 있는데 이경우는 'z' 옵션을 주면 된다.


<< 압축생성 >>

압축을 할때 가장많이 사용하는 옵션은 'cvf'이다.
눈치를 채신분도 있겠지만, x는 압축해제, c는 압축생성이란 의미다.

$ tar cvf test.tar test
(test를 test.tar로 압축한다. 여기서 test는 dir일 수도 있고 file일 수도 있다.)

tar.gz로 압축하고 싶을 경우에는 'z'옵션을 주면 된다.


Error: suffix or operands invalid for `mov'



IEEE1394(based on TMO-LINUX)커널 컴파일 도중에 계속 뜨는 오류-_-
잘못된 곳이 없음에도 불구하고 계속 뜨길래 화가나서 검색해 봤더니, patch를 하면 괜찮아진단다;

3개의 파일을 수정을 해야한다.


1. linux/arch/i386/kernel/process.c

- asm volatile("movl %%fs,%0":"=m" (*(int *)&prev->fs));
- asm volatile("movl %%gs,%0":"=m" (*(int *)&prev->gs));
+ asm volatile("mov %%fs,%0":"=m" (prev->fs));
+ asm volatile("mov %%gs,%0":"=m" (prev->gs));



2. linux/arch/i386/kernel/vm86.c

- asm volatile("movl %%fs,%0":"=m" (tsk->thread.saved_fs));
- asm volatile("movl %%gs,%0":"=m" (tsk->thread.saved_gs));

+ asm volatile("mov %%fs,%0":"=m" (tsk->thread.saved_fs));
+ asm volatile("mov %%gs,%0":"=m" (tsk->thread.saved_gs));


3. linux/include/asm-i386/system.h

asm volatile("\n" \
"1:\t" \
- "movl %0,%%" #seg "\n" \
+ "mov %0,%%" #seg "\n" \
"2:\n" \
".section .fixup,\"ax\"\n" \
"3:\t" \

".align 4\n\t" \
".long 1b,3b\n" \
".previous" \
- : :"m" (*(unsigned int *)&(value)))
+ : :"m" (value))

#define savesegment(seg, value) \
- asm volatile("movl %%" #seg ",%0":"=m" (*(int *)&(value)))
+ asm volatile("mov %%" #seg ",%0":"=m" (value))



일일이 수정하기 귀찮다면 patch파일을 받아서 설치하는 것이 좋을 것이다.

2007년 11월 11일 일요일

IEEE1394(based on TMO-LINUX) 설치 및 컴파일


일단, IEEE1394 (based on TMO-LINUX)설치.

1. 패키지 다운로드 및 인스톨
config파일과 install파일을 포함한 kernel, law1394, tmolib 소스들을 함께 받아야한다. 그리고 install.sh파일을 실행시킨다.

$ ./install.sh

설치는 자동으로 /opt/TMO-LINUX/에 설치되며, 압축도 자동으로 풀어준다.


2. buildroot설치
buildroot를 다운받는 곳은 http://buildroot.uclibc.org/downloads 이다. (다운받기)
여기서 다운 받은 buildroot는 bz2로 압축이 되어 있으므로 tar를 사용할때 j옵션을 준다.

압축을 풀고나면 buildroot폴더가 생성이 되는데 이 안에서 컴파일을 해주어야한다. (이 컴파일 시간은 대략 1시간 좀 넘게 걸린다-_- 에러나면 끝장이다-_-;)

$ make menuconfig

여기서 옵션을 설정을 하는데, IEEE1394(based on TMO-LINUX)를 컴파일하기 위해서는 몇가지 설정을 해주어야하는 옵션이 있다.

우선, architecture는 i386. (다른보드에서 한다면 다른걸로 해도 상관없지만 1394는 대부분 i386보드다.)
그리고 Toolchain으로 들어가서 gcc버전을 바꾸어주는 부분을 찾아 gcc버전을 제일 낮은 것으로 바꾸고, cross complier와 library를 체크한다.
왜인지는 모르겠으나 'snprinf' 에러가 자꾸 발생하여 locale도 설정해주었다.

즉, Toolchain에서 설정 체크를 해주어야하는 것은 다음과 같다.

GCC compiler Version (gcc...) //gcc 버전 가장 낮은 걸로
Enable locale/gettext/i 18n support

C++ cross-compiler support
Build/install c++ compiler and libstdc++

나머지는 기본 설정으로 건드리지 않고 둔다.
그리고 저장을 하고 나와서 컴파일을 하면 된다.

$ make

(덧,
나는 kernel header version도 바꾸어 주었다. 2.6.22 버전의 커널을 사용하면 추가된 것이 많아서 enable여부나, 어떤 것을 선택할 것인가를 컴파일 도중에 물어본다. 그것이 귀찮으면 2.6.21 버전의 커널을 사용하시길...)

3. 소스 컴파일
buildroot를 설치했다면 1394소스를 컴파일한다.
compiler는 물론 cross로 i386-linux-gcc를 사용한다.
make파일에서 compiler를 지정하고 "make"명령을 사용하면 주주주주죽~ 컴파일되어가는 것을 볼 수 있다.

4. 기타 주의사항

make하다가 에러가 나면, 일단 마음을 가라앉히고 모니터를 원망스럽게 쳐다본 뒤, 컴퓨터를 한대 깐다-_-) 왜냐면, 다시 한시간동안 컴파일을 해야하기 때문이다.
보통 컴파일하다가 에러가 나는 경우는 옵션을 잘못 지정해 주었기 때문인 경우가 많다.
그럼 menuconfig를 실행시켜서 다시 옵션을 지정하고 컴파일을 해야하는데, 이 때 생성된 다른 폴더들 (예를들면 build_i386이라든가 하는)을 삭제하고 처음부터 다시 컴파일을 하는 것이 좋다.
build_i386과 toolchain_i386만 지우면 된다고 하지만, 좀 찝찝하면 project_i386까지 지워버리면 된다.

2007년 11월 4일 일요일

M (엠)

M[엠]

주연: 강동원(한민우 역), 공효진(은혜 역), 이연희(미미 역)


약 다섯달간을 기다린 영화 엠.

이명세 감독의 작품을 스크린으로 만난다는 두근거림과 강동원과 공효진 역도 궁금했고, 무엇보다 내 친구가 제작에 참여했다는 부푼 기대감으로 영화를 보러 갔다.

영화는 기대 이상이었다.
이명세 감독 다움 작품이랄까 스크린에서 모든걸 보여주고 표현하고자 했다.
많은 사람들의 악평에도 불구하고 나는 이 영화가 정말 좋았다.

시시각각으로 바뀌는 화면과 정지화면의 연속, 그리고 강동원과 공효진, 이연희의 표정, 모든 의미를 담고있는 M이라는 의미.

이 영화는 어디서 부터 시작인지 모르겠다.
나도 이명세 감독의 마법에 취해버린 것일까?ㅎㅎ

말로 설명하기는 힘든 영화이다.

어느 날 인가 부터 불면증에 시달리면서 한 글자도 쓸 수 없게 된 천재 소설가 한민우.
그는 자꾸 등뒤의 시선을 느끼며 불안해 한다.

그리고 그를 사랑해 그의 곁에 머무르는 보라색 옷을 입은 소녀와 그의 약혼녀 은혜.

의문의 바, 루팡바.


More specify



역시 이명세 감독 작품이다라는 생각을 할 정도로 대사는 적었고 스크린에서 모든 걸 보여주려 했지만, 내가 그 모든 걸 보지 못했다는 생각이 들어서 한번 더 보고 싶은 영화였다.

혹자는 M을 이명세라고 칭했고, 이명세는 인터뷰에서 M을 money라고 했지만; 역시 M은 미미일 것이다.

그리고 가장 감동적이었던 것은 마지막에 스크린이 올라갈때 제작부 3번째에 있던 그녀의 이름이었달까//ㅅ/
"정말 수고했어... 잘 봤어."

2007년 11월 2일 금요일

bootloader란

bootloader는 다른말로 bootstrap이라고 하는데 이 말의 어원은 boot(장화) + strap(끈)에서 비롯되었다.
장화의 끈을 묶고 일어서려는 사람이라는 설도 있고, 장화끈을 묶어주는 사람이라는 설도 있는데 아무튼 출발하기 직전의 준비작업이라는 의미가 되는 것 같다.

컴퓨터에서 bootloader는 OS의 최소부분을 메모리로 올려 프로세서가 이를 실행할 수 있게 해주는 일을 하는 녀석이다.
컴퓨터에 전원이 들어오면 시스템을 정상적으로 작동시킬 수 있도록 소프트웨어 및 하드웨어를 초기화 시키고 (Memory setting, CPU clock setting GPIO setting, Serial setting MAC address, Ethernet port setting 등) 커널을 부팅시키는 일을 한다.
하드웨어에 dependent하게 짜여져 있기 때문에 어셈코드가 많으며 flash메모리에 저장되기 때문에 크기가 매우 작다.

부트로더는 메모리로 운영체제를 읽어들이는 역할을 한다.
전원이 들어오면 가장 먼저 수행되어야 하기 때문에 항상 ROM같은 비휘발성 메모리에 보관되어 있다.
부트로더의 가장 큰 역할은 시스템의 초기화 이다.
CPU내의 MMU와 캐시를 활성화시키고 RT클럭과 하드웨어 등을 초기화 시킨다.


그렇기 때문에 bootloader에 대해서 공부하기 위해서는 clock 및 메모리 장치, flash를 잘 알아야하고, C와 assembler를 다룰 줄 알아야 한다.


bootloader의 종류는 매우 많은데 가장 많이 알려진 것들은 다음과 같다.

GRUB: Grand Unified Bootloader GNU 프로젝트 부트로더
LILO: linux loader x86기반의 리눅스
redboot: 레드햇에서 개발된 부트로더, eCos기반
U-boot: universal Bootloader PPCBoot와 ARMBoot를 타깃으로 개발(두개를 합친 것), 환경설정이 쉽다는 장점이 있다.
EZBoot: EZ-X5보드를 위하여 개발된 것으로 부트로더의 장점을 취합
BLOB: arm프로세서 기반의 하드웨어를 위해 개발. 아사벳보드 등
PMON: PROM Moniter MIPSqhem를 지원하기 위해 개발