하루에 1시간 걷기를 통해서 정신건강과 신체적 건강을 챙겨보자.
소소한 도전 - 공부에 미쳐보자 1. 소소한 도전
[10대, 꿈을 위해 공부에 미쳐라!]
[20대, 공부에 미쳐라!]
[30대, 다시 공부에 미쳐라!]
2009년 한 해를 마감하는 지금 가장 후회되는 것을 말하면 공부를 너무 하지 않았다는 점이다. 공부는 죽기전까지 벗어날 수 없는 숙명과 같은 것이다. 공부에 미쳐보자. 자유 시간에 시간을 그저 멍하니 보내지 말고 책 한줄이라도 읽자. 외국어 한 단어라도 외우자. 이렇게 공부에 미쳐보자.
int main(void)
{
int 나이;
for(나이 = 10;나이<=100;나이++)
{
if(나이%10 == 0)
{
cout << 나이 << "대에 공부에 미쳐라" << endl;
}
else if(나이 >= 79)
{
cout << "이제부터 노후생활" << endl;
break;
}
}
return 0;
}
Linux, System call 추가하기. 4. 디지털 라이프
/*
오랫동안 정리를 하지 않았던 이메일을 정리하는 도중에 작년에 운영체제 과목시간에 제출했던 리눅스, 시스템콜 추가하기 프로그래밍 레포트 자료가 남아있는 것을 발견했습니다. 컴퓨터를 전공하고 있지만 MS의 노예였던 저는 리눅스를 한번도 건들여 본 적없던 미지의 OS였기 때문에 이 레포트를 작성하는데 매우 많은 삽질을 했던 것이 기억납니다. 아래 내용은 제가 작성했던 레포트 그대로 복사해 왔습니다. 지금보면 참 부끄러운 한국어 실력이네요 ^3^ 삽질을 통해서 레포트는 어떻해서든 제출했는데 이게 맞는 것인지는 모르겠고, 최신판 페도라 리눅스에서 이렇게 할 수 있는지는 모르겠네요ㅡ_ㅡ;; 전공생으로서 블로그에 첫번째 전공 관련 포스팅을 할 수 있어요 좋네요. 많은 레포트들은 다 지워졌는데 이게 남아있었다니 ㅎㅎ
*/
[ 과제 : 리눅스의 시스템 콜을 추가하여라, 두개의 수를 이용하여 연산하여라 ]
일반적으로 윈도우 시스템을 사용하는 사용자는 리눅스를 사용하기 위해서 2가지 방법을 통해서 가능하다.
1. 파티션 분할을 통한 디스크에 직접 설치
2. 가상 머신을 이용한 윈도우 안에서 설치
위 방법 중 만약의 사태에 적절하게 대응 할 수 있는 가상머신을 사용하여 윈도우에 설치, 가상 머신은 일반 사용자들도 많이 사용하는 VMware을 사용함 (http://www.vmware.com)

우리나라에서는 여러 곳에서 제작된 다양한 리눅스를 사용할 수 있는데 크게 3가지로 볼 수 있다.
1. 아시아 리눅스 - 韓,中,日 삼국 공동제작
2. 페도라 리눅스 - 레드햇계열
3. 우분투 리눅스 - 데미안계열
이번 레포트를 진행하는데 있어 사용하기 편한 리눅스를 선별하기 위해서 한컴리눅스와 페도라, 우분투 리눅스를 각 각 설치해 보았는데 가장 편하게 사용할 수 있는 리눅스가 페도라 리눅스라고 생각되어 이번 레포트는 페도라 리눅스를 사용하여 진행하였다.

페도라 리눅스6의 커널은 Linux-02.6.18.1 버전이다. 이번 시스템 콜을 추가하기 위해서는 리눅스가 제공하는 기본 커널이 아닌 전체 커널이 필요하기 때문에 http://www.kernel.org에서 Linux-2.6.18.2 버전을 다운 받아서 /usr/src/kernels/linux-2.6.18.2 경로에 설치하였다.

시스템콜을 추가하기 위해서는 unistd.h와 syscall_table에 새로운 시스템 콜을 추가하여야 하는데 다음 파일의 경로는 다음과 같다.
/usr/src/kernels/linux-2.6.18.2/include/asm-i386/unistd.h
/usr/src/kernels/linux-2.6.18.2/arch/i386/kernel/syscall_table.S
시스템콜은 시스템에서 사용자에 의해 이름이나 번호로 불러오는 것이 가능한데 커널을 통해 시스템콜의 이름과 번호를 등록하게 된다. 새롭게 등록된 시스템콜은 syscall_table을 통해서 커널에 등록된 시스템콜을 호출하게 되는 것이다.

↑ unistd.h에 추가된 새로운 시스템 콜

이렇게 시스템 콜 이름과 번호를 등록하였다. 사용자가 C를 통해서 시스템콜을 불러오기 위해서는 시스템콜이 커널 안에 파일로서 존재해야 하는데 지금 만들어야 할 것이 커널에 새로운 시스템콜을 정의하는 것이다. 이 작업은 다음과 같은 경로에서 작업한다.
/usr/src/kernels/linux-2.6.18.2/kernel
이 경로에서는 커널에서 사용 가능한 시스템 콜이 파일로서 존재한다. 이 곳에 새로운 시스템콜의 동작을 프로그래밍 할 수 있다.
/************************************************************************
// newsyscall.C
#include <linux/linkage.h> // linkage을 사용하기위해서는 등록하야 함
#inlcude <linux/unistd.h>
#include <linux/errno.h>
Asmlinkage int sys_newsyscall(int a,int b)
{
Inttmp = 0;
tmp = a + b;
//단순히 인수 a,b를 받아서 tmp 안에 더함
printk(“<1>two num add in tmp= %d\n”,tmp);
//printk는 C에서 printf와비슷한 출력을 담당한다, printk도 커널에 등록되어있다.
returntmp;
}************************************************************************/
다음과 같이 unistd.h, syscall_table.S/kernel/newsyscall.c 과정을 한 경우에는 커널을 새롭게 컴파일 하여야 새로운 환경에서 새로 등록한 시스템콜을 사용할수있다
커널을 컴파일 하기 위해서는 지금까지 작업한 내용을 저장하고 makefile에추가하여야 하는데 새롭게 등록한 newsyscall.C는/kernel/Makefile에 꼭 등록해야 새로운 커널에서 사용 가능하다.

이제 커널을 컴파일해야 한다. 커널을 컴파일 하는 방법은 다음과같다. 기존의 커널과 같은 커널에서 작업을 하는 경우라면 커널을 컴파일 하는 과정이 매우 빠르게진행된다.
1. Make

2. Make install
이 과정을 통해서 커널이 컴파일이 되었고 자신이 작업한 새로운 시스템콜을 사용 가능하게 되었다. 저의 경우 시스템콜 작업을 통해서 커널 자체를 새롭게 컴파일 했기 때문에 매우 오랜 시간이 걸렸다.

컴파일이 끝난 후에 reboot을 통해서 시스템을재기동한후 새로 작업한 시스템콜을 사용 가능한지 C프로그래밍을 하여야 한다.

위의 소스는 제가 /root 에 작성한 syscalltest.c , 위 코딩을 실행하면 다음과 같은결과를 받을수 있다.

# 정작 C 코딩은 몇 줄 안되고 기능도 별거 없는거 만들기 위해서 그 과정이 더 복잡했던 막나가는 삽질 ㅠㅠ


최근 덧글