2007년 12월 27일 목요일

ssh 접속 에러


$ ssh IP주소
..로 접속을 하려는데 접속이 되지 않는 경우가 있다.
바로 어제까지 접속이 잘 되었는데 말이다!!!!!

그리고 경고메세지로
WARNING: POSSIBLE DNS SPOOFING DETECTED!
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
.. 라는 메세지가 뜬다.

리눅스에서는 자기가 접속했던 곳의 서버를 list해서 저장해 가지고 있다.
그런데 server쪽의 설정이 바뀐다면 주소가 같더라도 위와 같은 경고메세지를 띄우며 server로의 접속을 막는다.

이 경우 그 list파일을 삭제해버리면 만사 OK이다.
그 list파일은 자신의 홈 디렉토리에 있다.

$ cd
$ ls .ssh
(확인차)
$ rm -rf .ssh

2007년 12월 21일 금요일

Θ, Ο, Ω notation


Θ - notation

Θ(g(n))은 어떤 프로그램의 수행시간 f(n)에 대하여 f(n)보다 같거나 작게 되는 C1*g(n)과, f(n)보다 크거나 같게 되는 C2*g(n)이 존재한다.
이것을 만족하는 C1, C2가 존재한다면 그 프로그램은 Θ(g(n))의 수행시간을 갖는다.
즉, Θ는 asymptotically tight bound를 의미한다.


Ο - notation

Ο(g(n))은 어떤 프로그램의 수행시간 f(n)에 대하여 f(n)보다 같거나 작은 C*g(n)이 성립하는 상수 C가 존재한다면, 그 프로그램은 Ο(g(n))의 수행시간을 갖는다.
즉, Ο는 upper bound를 의미한다.


Ω - notation

Ω(g(n))은 어떤 프로그램의 수행시간 f(n)에 대하여 f(n)보다 크거나 같은 C*g(n)이 성립하는 상수 C가 존재한다면, 그 프로그램은 Ω(g(n))의 수행시간을 갖는다.
즉, Ω는 lower bound를 의미한다.


2007년 12월 17일 월요일

나는 전설이다.

나는 전설이다. (I am Legend)

주연 : 윌스미스(로버트 역)


좀비영화, 액션영화, 2% 부족했던 영화.
미안하지만, 윌로는 채워지지 않았어-_ㅠ

인류가 발명한 치료제.
홍역 바이러스를 유전자 조작하여 만들어낸 암 치료제 이다.
임상실험 결과 100% 완치가 되었고 널리 사용되었다.
그러나 부작용으로 바이러스 감염자가 생겨났다.
이 바이러스에 감염된 사람은 머리카락이 빠지고 눈이 빨개졌으며, 잇몸이 까매지고, 동공이 수축되지 않아 빛을 보질 못하였으며 굉장히 폭력적으로 변했다.
게다가 이 바이러스는 전염되었으며, 공기중으로 퍼졌다.
처음 바이러스가 생성된 뉴욕시는 폐허가 되었고, 감염자를 격리시키려 뉴욕을 폐쇠하려했으나, 실패로 돌아갔다.
면역체가 있어 감염되지 않은 사람들은 감염된 자의 먹이가 되었다.
면역체가 있는 사람들 중 한명인 로버트 네빌은 3년여를 폐허가 된 뉴욕시에 혼자 머물며 매일같이 백신을 연구한다.
낮에는 애견인 샘과 함께 돌아다니며 도시를 관찰하고 면역체가 있는 생존자들을 찾기위해 라디오 방송을 한 후, 감염자들이 활동하는 밤이되면 집안에서 모든 빛을 차단하고 잠을잔다.
화합물을 우선은 동물에게 실험하고, 상태가 양호해지면 임상실험을 하는 형태로 백신을 만들어 보려 하지만 쉽지 않다.

스포일러 보기


굉장히 뭔가가 아쉬운 영화였다.
정말로 2%부족한 영화-_-
물론 윌스미스를 사랑해 마지 않지만, 약간 부족했다는 느낌은 지울 수 없었다.ㅠㅜ

나는 감염자들도 사회를 이루고 살아가며, 사랑하고, 인간같은 존재이다라는.. 뭔가가 나올 줄 알았는데-_-); 그런것도 하나도 없고;
'그'가 로버트가 잡아간 감염자를 구하려고 자신을 빛에 노출시키면서 까지 나오려고 했던 건 아닐까 하고 생각했다.
그리고 '그'가 우두머리급으로 행동하는 것과 로버트를 같은 방법으로 덫에 걸리게 한걸 보면 굉장히 지능적인 놈일 거라 생각했는데-_-; 그냥 아무 예기없고 별볼일 없더라;

그리고 왜 전설이라는거야-_-;
좀 껴맞춘 티도 나고.. -_-;
그냥 좀비영화에 초점을 맞췄으면 더 재밌었을거 같았다.ㅎ

끝이 좀 허무하긴 하지만, 나름 재밌게 보았던 영화. (초/중반엔..ㅋ)

2007년 12월 6일 목요일

세븐데이즈

세븐데이즈.

주연: 김윤진(유지연 역), 김미숙(한숙희 역), 박희순(김성열 역)


간만에 스릴만점 영화-_-)b
굉장히 흥미진진했고 재밌었다. 구성또한 굿.

유지연은 죄가 있는 자도 없게하는 유능한 변호사이다. 그녀에게는 세상과도 바꿀 수 없는 딸이 하나 있는데 딸이 납치되고, 납치법으로 부터 전화가 걸려온다.
납치범의 요구는 돈이 아니었다. 그의 요구는 형사재판을 받고 있는 한 흉악범을 무죄석방시키라는 것이었다.
그 흉악범은 강간 전과가 화려한 사람으로 살인사건으로 재판을 받고 있었다. 사형을 받아 마땅했지만, 유지연은 딸을 구하기 위해 그를 무죄로 만들기로 결심힌다.
하지만 사건을 조사하면 조사할 수록 범인은 바로 그 흉악범이었다.
그러다 피해자의 엄마인 한숙희를 만나게 되고 그녀는 자신의 딸을 죽인 흉악범을 변호하려하는 유지연에게 따가운 눈총을 보낸다.
유지연은 딸을 만나기 위해서라면 무슨짓이든 할 것을 결심하는데...


반전 또한 대박이었다.
왠지 예측하긴 했지만, 설마~했던 것이 실제로 돌아오니 기분이 묘했다.ㅎ

간만에 재밌는 스릴러 영화였다.
중간중간 잔인한 장면도 조금 있지만, 쏘우에 비하면야 새발의 피도 못된다-_-);

그리고 또하나.
김윤진이 완전 이쁘다-_-) 오... 최고..
김윤진이 날씬하다는 생각은 많이 해봤어도 이쁘다는 생각은 안해봤는데, 영화보니까 캡이쁘더라. ㅎㅎㅎ

아 맞다!! 여기 나오는 김윤진 딸 짱 귀엽다-_-)b
내스타일이야..-_-...

아무튼 이 영화의 주제는 그거다.
"모성애는 무섭다"

2007년 12월 5일 수요일

priority inheritance 주의할점



priority inheritance 를 확인하다가 priority가 바뀌지 않는 것을 보았다.
이것이 왜 바뀌지 않았나를 근 한달간 고민했던 것 같다.

그 이유는 아주 간단했다.

mutex가 밖으로 나오면 즉, unlock을 하고 나면 원래의 priority로 돌아가기 때문이었다-_-);
나는 unlock을 하고 나서 printf를 하였으므로 당연히 priority가 바뀌지 않을 수밖에... ㅠㅜ

꼭 lock안에서 priority를 확인을 해야한다는 것. 잊지말자!


eCos application 작성


eCos application을 작성해보자.

우선, c파일이든 cpp파일이든 하나 만든다.
코드작성법은 C와 유사하다.

C에 있는 stdio.h 라든가 하는 라이브러리를 사용할 수가 있고, eCos에서 제공하는 라이브러리들은 "cyg/kernel/"에 있다.

만약 thread에 관한 사항을 사용하고 싶으면 #include <cyg/kernel/kapi.h>를 포함시켜주면 된다. eCos thread에 관한 함수들이 있는 라이브러리이다.

C로 코딩을 할 경우 프로그램이 시작하는 곳은 main함수이다.
하지만 eCos의 경우에는 cyg_user_start함수이다.

간단한 hello world를 찍는 다음 예제를 보자.


=====================================================================================
#include <stdio.h>

void cyg_user_start(void)
{
  printf("Hello, world\n");
}
=====================================================================================

C프로그래밍과 별반 다를게 없어보이지 않는가?
main함수의 이름만 바뀌었다는 것을 제외하면 말이다.

thread를 생성하여 Hello world 프로그래밍을 해보자.

=====================================================================================
#include <stdio.h>
#include <stdlib.h>
#include <cyg/kernel/kapi.h>

#define STACK_SIZE 4096
#define nTHREAD      2

cyg_thread threads[nTHREAD]; //thread object
char stack[nTHREAD][STACK_SIZE]; //thread's stack
cyg_handle_t myThread1, myThread2; //thread handle
cyg_thread_entry_t printout; //thread function

void cyg_user_start(void)
{
//two threads create
  cyg_thread_create(
    4,                                                  //thread priority
    printout,                                         //thread function
    0,                                                  //message (function argument)
    "myThread1",                                  //thread name
    (void *) stack[0], STACK_SIZE,       //thread's stack
    &threads[0]);                                 //thread object

  cyg_thread_create(
    4,
    printout,
    1,
    "myThread2",
    (void *) stack[1], STACK_SIZE,
    &threads[1]);

//thread resume
  cyg_thread_resume(myThread1);
  cyg_thread_resume(myThread2);
}

void printout(cyg_addrword_t data)
{
  int message = (int) data;

  while(1)
  {
    printf("myThread %d print.....: Hello, world\n", message+1);
  }
}
=====================================================================================

이 프로그램은 두개의 thread가 돌아가면서 무한으로 hello world를 찍는 프로그램이다.
여기서 보듯이,
eCos에서는 thread를 생성할 때 priority를 줄 수가 있다.
현재는 두 thread 모두 priority를 4를 주었기 때문에 RR로 스케줄링 받아 동작하지만, 두 thread가 priority가 다르다면 높은 priority가 먼저 돌아가게 될 것이다.

또한 eCos의 특징을 볼 수 있는것이 바로 cyg_thread_resume이라는 함수이다.
보통 C프로그램에서는 thread를 create함과 동시에 thread가 수행되게 되는데, eCos에서는 그렇지 않다.
thread를 create하는 것은 단지 생성을 하는 것 뿐이고 thread를 수행시켜주기 위해서는 resume을 해주어야 한다.
때때로 필요없을 때 thread를 잠시 쉬게 할 수 있는데 그 함수는 suspend이다.
suspend를 해두었다가 다시 필요할 때 resume을 시켜 thread를 깨울 수 있다.


이러한 application을 만들었다면 컴파일을 해야한다.
Makefile을 만들어서 컴파일을 할 수가 있는데 Make file은 다음과 같다.

$ vi Makefile

=====================================================================================
INSTALL_DIR=/home/test/ecos/myThread/myThread_install
//eCos kernel configuration때 생성된 install파일의 경로를 잡아준다.

include $(INSTALL_DIR)/include/pkgconf/ecos.mak

XCC     = arm-elf-gcc
//i386용으로 컴파일하고 싶으면 i386-elf-gcc로 하면 된다.
XCXX   = $(XCC)
XLD     = $(XCC)

CFLAGS     = -I$(INSTALL_DIR)/include -I/opt/ecos/gnutools/arm-elf/arm-elf/include
CXXFLAGS = $(CFLAGS)
LDFLAGS   = -nostartfiles -L$(INSTALL_DIR)/lib -Ttarget.ld

#RULES
.PHONY: all clean
OBJECTS = myThread.o

all : $(OBJECTS)
    $(XCC) $(CFLAGS) $(LDFLAGS) $(ECOS_GLOBAL_LDFLAGS) -o myThread $(OBJECTS)

clean :
    -rm -f $(OBJECTS) myThread

myThread.o : myThread.c
    $(XCC) -c $(CFLAGS) myThread.c $(ECOS_GLOBAL_CFLAGS) $<
====================================================================================

그리고 나서 컴파일.
$ make


컴파일을 하면 실행파일이 만들어진다.
그러나 eCos에서 실행파일을 올릴 때는 .o 파일이나 .exe 파일을 올리지 않는다.
.srec파일을 올린다.
그러므로 object copy를 해주어야 한다.

$ objcopy -O srec myThread myThread.srec

하면 srec파일이 생긴다.

이것을 보드에 올리면 된다.

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를 지원하기 위해 개발

2007년 10월 31일 수요일

eCos 컴파일 에러

installation problem, cannot exec 'cpp0' : 어쩌구
..라는 컴파일 에러.

처음엔 cpp0라는 파일때문인 줄 알고 열심히 cpp0파일을 찾았지만 찾을 수 없었다.

하지만 그 원인은 makefile에 있었다.

eCos에서는 makefile을 만들어서 사용하는데,
컴파일러를 지정해주는 부분에, 크로스 컴파일러를 지정해 주었다.

XCC = arm-linux-gcc

이렇게 말이다.

그리고 나는 arm 보드에 올릴꺼니까 당연하다고 생각하고 있었다.

하지만 내가 망각한 사실이 있었으니-0-;
이것은 eCos application이라는 것.

컴파일러는 arm-elf-gcc였다.
바보같이 gnutools 하위폴더는 arm-elf라고 잡아주고선-_-); XCC를 틀려놨다.

아무튼 그래서 엉뚱한 cpp0 에러는 해결되었다.

2007년 10월 30일 화요일

악마는 프라다를 입는다.

악마는 프라다를 입는다.

주연: 메틸스트립(미란다 역), 앤 해서웨이(앤디 역)


이 영화는 책을 읽은 후에 나중에 DVD로 보게 되었는데 책과 내용이 조금 달라 더욱 재밌었다.

사회 초년생이며 잡지에 사회글을 기고하는 기자가 되기를 꿈꾸며 상경한 앤드리아는 자신의 생각과는 조금 다르게 패션잡지 에디터의 비서가 된다.
배울 것도 많고, 모든 여성들이 꿈꾸는 자리인데다가 패션잡지 에디터인 미란다의 추천이라면 어느 잡지사든 원하는 곳에 입사할 수 있다는 말을 들은 앤드리아는 열심히 해내리라 결심하지만 수석비서인 에밀리는 자신을 부리기만하고 미란다는 불가능한 요구들을 하기 시작한다.
언제 어디서든 미란다의 연락에 불려나가기 일쑤이고, 미란다의 무리한 요구들을 수행하려 여기저기 뛰어다닌 탓에, 남자친구와도 멀어지고 가족과 보낼 시간도 점차 줄어들면서 친구들과 가족들은 바쁜 앤드리아에게 지쳐가고, 앤드리아도 자신을 이해해주지 않는 주위가 서운하기만 하다.

처음에 패션계에는 전혀 관심이 없던 앤드리아는 미란다의 질책과 주변의 이상한 시선속에서 지내다 나이젤의 충고아닌 충고덕에 눈을 뜨고 프로라는 것에 미란다와 패션잡지의 사람들을 다른 시선으로 보게 되면서 자신도 변화하게 된다.
좀 더 나은 자신을 보이게 되고 미란다의 불가능해 보이는 요구를 미란다의 입맛에 맞게 수행하면서 자신의 직장에 적응을 해나간다.
처음에 패션감각없고 뚱뚱하지만 똑똑한 여자를 채용하겠다고 생각한 미란다는 바뀌어가는 앤드리아의 모습이 맘에 들고 그녀를 수석비서로 생각, 중요한 파리의 패션쇼에 데려가려 한다.

그리고 파리에서...

스포일러보기



화려한 그녀들의 패션과 눈 돌아갈 정도의 많은 명품들의 등장으로 볼거리가 많았던 영화지만, 화려함 속에 숨어있는 다른 이면도 함께 볼 수 있는 영화였다.
프로의 자세도 느낄 수 있었고, 내 일에 대한 강한 자부심도 느낄 수 있었던 영화. 나는 내일을 사랑하고 있는가 다시한번 생각해보게 되었다.
나도 당당하게 이 분야에서 내가 최고다라고 말할 수 있을 때까지 노력해야겠다. 더불어 강한 정신력과 무엇에도 흔들리지 않을 선택을 할 수 있는 신념을 길러주기를 당부한 영화였다고 본다.

난 더 나아갈 것이고 좀 더 높은 곳에 이르를 것이며 내 일을 사랑할 것이다.
아니 이미 진행형이다.


2007년 10월 29일 월요일

redboot configuration (in eCos)

eCos에서 redboot를 configuration 하는 것은, eCos가 지원하는 보드에 올린다면 매우 쉬운 일이다.

내가 사용하고 있는 보드는 trace32를 테스팅하기 위해 사용하던 IMO보드이다.

이름은 조금 다르지만, 일단 코어는 s3c2410이므로, eCos가 지원하는 smdk2410에 맞춰 주면 된다.


eCos에서 configration 방법은 두가지가 있다. tool을 사용하는 것과, command를 날리는 방법.

일단은 두가지 다 해보도록 하겠다.


우선, tool을 사용하는 것.

tool을 사용하는 것이 더 빠르고 쉽다.

하지만 tool을 사용해서 에러가 난다면 command를 추천한다; 왠지 tool은 불신감이 솟구쳐서-_-;;



1. tool 실행

$ configtool

의 command를 치면 조금 많이 심플한 tool이 하나 보인다.


2. hardware선택

tool의 메뉴에서 build->template를 클릭하면 하드웨어를 선택할 수 있다.

eCos에서 지원하는 하드웨어들이 죽 list로 보여지는데 거기서 Samsung의 smdk2410을 선택하고,

그 아래 보면 package라는 부분이 있다.

default라고 되어있지만, redboot를 configuration할 것이기 때문에 redboot를 선택해준다.

그리고 "확인"

그리고 나서 보면 tool의 configuration 옵션이 바뀌어 있는 것을 볼 수 있다.

확인해 주어야 할 것은 architecture와 redboot 부분이다. 활성화 된 내용을 확인하고, 바꿀 옵션이 있다면 바꾼다.

하지만, 그냥 save해도 잘 돌아간다.

옵션을 다 바꾸었다면 save.


3. 이미지 만들기

redboot 이미지를 만들어야 한다.

build->Gernerate Build Tree를 선택해서 우선 트리를 생성한 후에,

build->library를 선택한다. (컴파일과 비슷한 것.)


그러면 완성-_-)b 이 되는데-_-!

smdk2410에 올릴때 중요한 것이 하나 빠졌으니,

이렇게 만든 이미지를 flash에 구워 부팅을 시키면 jump vector가 엉뚱한데를 가르키며 부팅이 제대로 되지 않는다.

해서 삽질을 엄청나게 했지만,

file->import를 선택하고

/opt/ecos/eocs-2.0/packages/hal/arm/arm9/smdk2410/current/misc/smdk2410_redboot_ROMRAM.ecm 을 포함시켜주어야만 함을 알았다.

'왜?' 인지는 아직 알아내지 못했지만;



그럼 다음으로 terminal창에서 configuration 하는 법.

일단, 해주는 일은 같지만 interface에서 쉽게 하느냐 못하느냐의 차이다.


terminal창에서 다음 command를 순서대로 날리면 된다.


$ ecosconfig new smdk2410 redboot

(새로만드는데, architecture와 package를 지정해준다)

$ ecosconfig import /opt/ecos/ecos-2.0/packages/hal/arm/arm9/smdk2410/current/misc/smdk2410_redboot_ROMRAM.ecm

(역시 파일을 import 해준다)

$ ecosconfig tree

(tree 생성)

$ make OLDGCC=1

(책에는 'make'라고만 해도 된다고 했는데, OLDGCC는 뭘까요-_-;)




tool로 했든 command로 했든지 간에 아무튼 make가 성공한다면, 여러개의 파일이 생긴다.

그 중에서 install폴더를 찾아 들어가면 bin폴더 아래에 이미지 파일이 생성된 것을 볼 수 있다.

binary파일과 elf파일 srec파일 img파일.

img파일은 안써봤고-_-; srec파일은 eCos보드에 올릴 때 쓰는 것이다.

하지만 redboot은 부트로더니까, binary파일로 올렸다.

(trace 32로 올렸음; flash날려먹어서)

eCos 설치하기

우선, eCos 설치 메뉴얼은 http://ecos.sourceware.org 에 있다는 것을 밝히는 바이다.

하지만, 나같이 영어 울렁증 있는 사람은 절대 못본다-_-; 죄다 영어라서;

그리고 eCos 메뉴얼을 비롯 관련 서적들도 다 영어다-_-; 아놔.... ㅠㅡ


eCos설치는 매우 간단하다.


먼저 다운로드를 해야하는데,

$ wget --passive-ftp ftp://ecos.sourceware.org/pub/ecos/ecos-install.tcl  을 실행하면 자동으로 /opt/ecos 폴더 아래 받아진다.

 

폴더로 따라 들어가 보면 ecos-install.tcl 파일이 있을 건데, 그 파일을 실행시킨다.

$ sh ecos-install.tcl

 

이 명령이 실행되지 않으면 tcl을 지원하지 않는 것이므로 패키지를 인스톨한다.

(eCos를 깔다보면 자신의 리눅스 컴퓨터에 아직 설치되지 않은 pakage가 많음을 느낄 것이다.

나는 4개 정도의 페도라 패키지를 인스톨했다.

패키지 인스톨 명령은 "yum install (패키지 이름)" 이다.)

 

설치 중 첫번째로 물어보는 것은 어느 사이트에서 다운받을 것이냐 인데, 아무데서나 받으면 된다.

두번째로 설치 디렉토리를 물어본다. 기본 값은 /opt/ecos이다.

세번째로 타겟 보드의 코어를 물어본다.

그것은 타겟보드가 arm인지 pc인지 등을 물어보는 것인데, 그냥 전부다 체크해주면 된다.

언제 어떤 보드를 쓰게 될지 모르므로..

아니면 원하는 코어만 체크한다.

 

그리고 나서 eCos 명령어를 사용하기 위해서는 명령어가 필요하다.

$ . /opt/ecos/ecosenv.sh

 

eCos를 사용하게 될 때마다 (즉, 시스템이 부팅된 후) 매번 이 명령어를 실행시켜줘야 하는데, 그게 귀찮으므로 .bash_profile에 명령어를 넣는다.

.bash_profile에 넣을 경우에는

. /opt/ecos/ecosenv.sh 를 추가해주고 저장한다음, .bash_profile의 수정내용을 적용시킨다.

$ source .bash_profile

 

잘 설치가 되어 있는지 확인을 해보려면, 아무 경로에나 빈폴더를 하나 만들고 그 안에서 configtool 이라고 명령을 실행해 본다.

$ configtool

 

이 때 configtool 화면이 뜬다면 제대로 설치된 것이 맞다-_-)b

2007년 10월 25일 목요일

커널 컴파일



1. 커널 다운로드 받기


$ ftp ftp.kernel.org

login은 anonymous로 한다.

ftp> mget (받을 파일이름)

ftp> quit


현재 폴더에 커널이 받아진 걸 볼 수 있다.

그걸 /usr/src/ 로 옮겨서 압축을 해제한다.

$ tar xvf (파일이름)





2. 커널 컴파일


$cd /usr/src/linux-버전


$ make mrproper

$ make menuconfig

커널 옵션 설정. 필요한것들만 바꾼다.


$ make dep

$ make bzImage

$ make module

크로스 컴파일러 설치

 

리눅스환경에서 arm 기반 프로그램을 컴파일해서 올리자면, arm용 (arm9기반이니까) 컴파일러가 필요한데-

이 때 해야하는 작업이 크로스 컴파일이다.


크로스컴파일. 말은 그럴싸하니 멋있지만, 삽질의 장본인이다. (그앙!)


그럼 우선, 크로스컴파일을 해보자.



<< 크로스컴파일러 깔기 >>

 

1. 다운받는다.


어디서고 상관없지만, 나는 arm.linux.org.uk에서 받았다...

$ wget http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/cross-3.2.tar.bz2

arm용으로 3.2버전을 받았다.


압축을 풀고, 원하는 곳으로 옮긴다.

압축을 풀면 나오는 arm이라는 폴더를 /usr/local/ 에 두었다. (그냥 내맘-_-)


2. 패스설정한다.


그리고 나서 .bash_profile을 고쳐주어야 한다. 그렇지 않으면 command를 찾지 못할 것이다.

.bash_profile은 ~/ 경로를 찾으면 있다.

다른 방법으로 cd 치고 엔터를 누르면 이동하는 경로이다.

보통 ls로는 보이지 않는 파일이고, 파일목록으로 보고 싶으면 ls -al을 하면 보인다.


vi를 이용해서 편집을 한다.

PATH 라고 되어 있는 부분을 찾는다.

보통은

PATH=$PATH:$HOME/bin 이라고 되있을 건데, 여기다가 크로스컴파일러 깐 곳의 path를 입력해준다.

PATH=/usr/local/arm/bin:$PATH:$HOME/bin


bin폴더 아래에 가보면 크로스 컴파일러가 가득한 것을 볼 수 있다.

크로스 컴파일러가 있는 경로를 넣어주면 되는 것이다.


마지막으로 바뀐 bash_profile을 적용시켜주어야 한다.

$ source .bash_profile


그리고 나서 확인을 해보려면, command를 입력해보면 된다.

arm-linux-gcc 라고 입력하고 엔터를 쳤을 때,

input file이 없다고 에러메세지가 뜨면 제대로 경로를 잡은 것이고,

그렇지 않고 없는 command라고 뜬다면 제대로 경로를 잡지 못한것이다.