요즘 리눅스 커널에 특별한 기능을 넣고 있는데요, 이것 때문에 성능 저하가 얼마나 나오는지를 측정해야되서 밴치마크 툴을 찾아보니 SPEC CPU 2006을 많이 사용하더라구요. ^^;;; 그래서 저도 한 번 해보기로 했는데... 2006년도에 나온 버전이라서 그런지... 페도라 21버전에서는 빌드 오류가 발생했습니다. ㅠㅠ

이게 오류가 한 두개면 어찌 고쳐보겠는데... 뭔가 산 넘어 산처럼 계속 나오더라구요. 그래서 구글신께 여쭈었더니 역시나~!! 해결법을 알려주셨습니다.

아래는 CPU 2006 빌드에서 발생하는 오류를 해결하는 링크입니다. ^^

https://wiki.linaro.org/MichaelHope/Sandbox/BuildingSPECTools

http://www-hiraki.is.s.u-tokyo.ac.jp/members/tomari/runspec.html

그리고 이건 SPEC CPU 2006에 대한 간단한 사용법을 잘 정리해놓은 사이트입니다.

http://jmanbal.tistory.com/entry/spec2006-install-%EB%B0%A9%EB%B2%95

아아... 이제 성능이 잘 나오길 비는 것만 남았네요. ^^ 그럼 좋은 하루 되세요 ^^

최근에 팀을 옮기면서 리눅스 관련 일을 하게 되었습니다. ^^;;; 리눅스는 사실 MINT64 OS를 만들 때 리눅스 커널 구조를 본 게 전부라... 제가 잘 할 수 있을 까 걱정이 많이 되었는데요, 아직까지는 별 탈 없이 잘 지내고 있습니다. ^^;;;

최근에 옮긴 팀에서는 주로 리눅스 커널 관련 일을 하고 있는데요, 그러다보니 간단한 커널 모듈을 만들 일이 많아 코드를 남겨둡니다. 아래 코드는 Loadable Kernel Module 형태로 insmod를 통해 로딩되면 /dev/hello 디바이스를 생성하고 통신하는 역할을 합니다. ^^

1. 커널 모듈 소스 코드 작성 및 Makefile 작성

터미널에서 vi hello.c를 입력한 뒤 아래 코드를 붙여넣고 저장합니다.

/**
 *  본 파일은 프레임워크 예제 파일임
 */
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/syscalls.h>
#include <linux/fcntl.h>
#include <linux/cred.h>

int in_use = 0;

// 모듈 정보
MODULE_LICENSE("HIDDEN");
MODULE_AUTHOR("root");
MODULE_VERSION("1.0");
MODULE_DESCRIPTION("Hello World");

/**
 *  /dev 밑에 등록한 파일을 누가 열었을 때 호출되는 함수
 */
static int my_open(struct inode *inode, struct file *file)
{
    // 해당 파일을 동시에 여러개를 열지 못하도록 하는 코드
    if(in_use)
    {
        return -EBUSY;
    }

    in_use++;
    printk(KERN_INFO "Hello Open\n");

    return 0;
}

/**
 *  /dev 밑에 등록한 파일을 누가 닫았을 때 호출되는 함수
 */    
static int my_release(struct inode *inode, struct file *file)
{
    in_use--;
    printk(KERN_INFO "Hello Closed\n");
    return 0;
}

/**
 *  /dev 밑에 등록한 파일을 누가 닫았을 때 호출되는 함수
 */
static int my_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    int retval = 0;
    printk(KERN_INFO "Hello Ioctl~!!\n");
    return retval;
}

/**
 *  /dev 밑에 등록한 파일을 누가 읽었을 때 호출되는 함수
 */
static ssize_t my_read(struct file *filp, char *buffer, size_t length, loff_t *offset)
{
    printk (KERN_INFO "Hello Read~!!.\n");
    //printk (KERN_INFO "%X\n", sys_call_table);
    return 0;

    // 실제로 Read 명령을 처리하는 코드, 일단 예제로 남겨둠
    /*
    // Number of bytes actually written to the buffer
    int bytes_read = 0;

    // If we're at the end of the message, return 0 signifying end of file
    if (*msg_Ptr == 0) return 0;

    // Actually put the data into the buffer
    while (length && *msg_Ptr)  
    {
        put_user(*(msg_Ptr++), buffer++);

        length--;
        bytes_read++;
    }

    // Most read functions return the number of bytes put into the buffer
    return bytes_read;
    */
}

/**
 *  /dev 밑에 등록한 파일에 누가 썼었을 때 호출되는 함수
 */
static ssize_t my_write(struct file *filp, const char *buff, size_t len, loff_t *off)
{
    printk (KERN_INFO "Hello Write~!!.\n");
    return -EINVAL;
}

/**
 *  /dev/hello 파일 등록시 필요한 file operation 구조체
 */
static const struct file_operations my_fops = \
{
    .owner = THIS_MODULE,
    .open = &my_open,
    .read = &my_read,
    .write = &my_write,
    .release = &my_release,
    .unlocked_ioctl = (void*) &my_ioctl,
    .compat_ioctl = (void*) &my_ioctl
};

/**
 *  /dev/hello 파일 등록시 필요한 device 구조체
 */
static struct miscdevice my_device = \
{
    MISC_DYNAMIC_MINOR,
    "hello",
    &my_fops
};

/**
 *  커널 드라이버 시작 함수
 *      - 커널 드라이버가 로딩될 때 호출됨
 */
static int __init hello_init(void)
{
    printk(KERN_INFO "Hello, world\n");    

    int retval = misc_register(&my_device);
    return 0;
}

/**
 *  커널 드라이버 종료 함수
 *      - 커널 드라이버가 언로딩될 때 호출됨
 */
static void __exit hello_exit(void)
{   
    printk(KERN_INFO "Goodbye, world\n");
    misc_deregister(&my_device);
}

// 시작 함수와 종료 함수 지정 매크로
module_init(hello_init);
module_exit(hello_exit);    

코드를 다 붙여넣었으면 이제 터미널에서 vi Makefile을 입력한 뒤 아래 코드를 붙여넣고 저장합니다.

obj-m += hello.o

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Makefile을 생성한 후에 make를 입력하면 자동으로 빌드가 시작되고 다음과 같이 hello.ko가 생성됩니다.

[root@BuildMachine module]# ll
합계 244
-rw-r--r-- 1 root root    154  2월 24 09:39 Makefile
-rw-r--r-- 1 root root      0  2월 24 09:39 Module.symvers
-rw-r--r-- 1 root root    351  2월 24 09:42 hello.c
-rw-r--r-- 1 root root 112027  2월 24 09:41 hello.ko
-rw-r--r-- 1 root root    454  2월 24 09:39 hello.mod.c
-rw-r--r-- 1 root root  63104  2월 24 09:39 hello.mod.o
-rw-r--r-- 1 root root  50384  2월 24 09:41 hello.o
-rw-r--r-- 1 root root     29  2월 24 09:41 modules.order

3. 커널 모듈 시험 및 결과 확인

커널 모듈은 insmod를 이용하여 커널에 동적으로 올릴 수 있구요, rmmod를 이용하여 커널에서 내릴 수 있습니다. 그리고 로딩된 모듈의 목록은 lsmod를 이용하여 확인할 수 있습니다.

커널 모듈은 슈퍼유저(root) 권한으로만 로딩할 수 있으므로, 커널 모듈 시험 전에 root 계정으로 로그인하거나 sudo와 함께 insmod를 실행합니다. 다음은 커널 모듈을 로딩하고 삭제한 뒤 그 결과를 dmesg를 통해 확인한 것입니다. printk() 출력은 dmesg나 cat /proc/kmsg 를 통해 확인할 수 있습니다.

$>insmod hello.ko
$>ls /dev/hello -l
crw------- 1 root root 10, 57  2월 26 13:59 /dev/hello

$>chmod 666 /dev/hello           <== /dev/hello를 유저 권한으로 읽고 쓸 수 있게 만듬

4. 커널 모듈 테스트 프로그램 구현 및 빌드

커널 모듈이 정상적으로 로딩되었으니 이제 테스트 프로그램을 만들 차례입니다. ^^ 프레임워크 커널 모듈은 /dev/hello에 접근하면 메시지를 출력하게 되어있습니다. 커널 모듈 테스트 프로그램의 소스 코드는 다음과 같고 터미널에서 vi test.c를 입력한 뒤 저장합니다.

/**
 * 본 파일은 프레임워크 테스트 파일임
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>

int main(int argc, char** argv)
{
    int fd;

    fd = open("/dev/hello", O_RDONLY);
    if (fd == -1)
    {   
        printf("Kernel Module Open Error\n");
    }   
    else
    {   
        printf("Kernel Module Open Success\n");
    }   
    close(fd);

    return 0;
}        

저장한 테스트 프로그램의 소스코드 코드는 다음과 같이 빌드할 수 있습니다.

$>gcc -o hello hello.c

5. 커널 모듈 기능 테스트

./hello를 실행하면 테스트 프로그램이 커널 모듈이 생성한 파일을 열어서 메시지를 표시합니다. 테스트 프로그램 실행 후 dmesg나 cat /dev/kmsg를 입력하여 커널 메시지를 확인하면 정상적으로 커널 모듈이 실행되었음을 알 수 있습니다. ^^

그럼 좋은 하루 되세요 ^^

임백준씨는 제가 학부에 있을 때 처음 책으로 뵈었습니다. 임백준의 소프트웨어 산책이라는 책이었는데요, 쉽지 않은 내용을 부드럽고 재미있게 풀어쓰시는 능력에 반해서 임백준씨 책이라면 믿고 보는 편입니다. ^^ 한동안 활동이 뜸하시다 작년에 재미있는 제목의 책을 내셨더라구요, 바로 폴리글랏 프로그래밍입니다. ^^


<출처-yes24>

폴리글랏이란 단어는 여러가지 언어를 사용하는 사람을 뜻한다는데, 책의 제목에서 알 수 있듯이 주된 요지는 한 가지 언어에 너무 집착하지 말고 필요에 따라 언어를 선택해야 한다는 겁니다. 그리고 배울려면 함수형 언어를 배우는 게 앞으로 도움이 될 꺼고, 자바 프로그래머라면 스칼라가 좋을 거라는 이야기를 하고 있습니다. ^^

일단 책을 읽고 난 뒤에 스칼라 언어를 한 번 찾아보긴 했으니 임백준씨의 의도(?!)는 반 쯤 성공한 것 같습니다. ^^;;; 함수형 언에에 크게... 아니 사실은 거의 관심이 없는 저도 "스칼라가 그렇게 좋다는데 한 번 써볼까?"하는 생각을 했으니 말이지요.

간만에 편안하게 읽을 수 있는 책이 나와서 좋았습니다. 수 많은 전공서적에 파묻혀 머리가 복잡하시다면 폴리글랏 프로그래밍 어떠세요? 마치 잠시 산책을 다녀오신 듯한 느낌이 드실 겁니다. ^^)-b

제가 1년에 1번씩은 그 해를 정리하며 저는 여전히 하고 싶은 일을 하며 살고 있습니다 - 1편, 저는 여전히 하고 싶은 일을 하며 살고 있습니다 - 2편과 같은 글을 쓰곤 했는데요, 그간 워낙 많은 변화가 있다보니 2011년 이후에 뚝!! 끊어져 버렸네요. 새해가 된지 좀 지났지만 이어서 3편을 남깁니다(사실... 이런 류의 글이 시간이 지나서 다시 읽어보면 감회가 새롭거든요 ^^;;;).

다들 아시고... 예상하고 계시겠지만 2011년 이후에도 저는 여전히 하고 싶은 일을 하고 살고 있습니다. 그간 있었던 일을 나열해보자면... 2011년 하반기에는 제 책 64비트 멀티코어 OS 원리와 구조 세트가 출간되었구요, 2012년 초에는 회사를 다른 곳으로 옮겨서 새로운 출발을 했습니다.

그와 동시에 귀여운 애기가 태어나서 행복한 생활을 하고 있구요, 애기 보느라 퇴근 후 저녁시간은 거의 다 올인하고 있어서 취미생활은 새벽에 일어나 하고 있다는 게 가장 큰 변화네요. 그리고... 또 한 가지 변화는 팀을 옮겼다는 겁니다. 지금부터 할 일은 오픈소스 프로젝트와 관련된 일인데요, 오픈소스 프로젝트는 활성화가 관건이라 많은 내용을 밖으로 공개할 것 같습니다. 외부 활동도 좀 필요한 일이라 여기저기 다녀야할지도 모르겠네요. 저한테는 꽤 의미가 있는 일이라 위험(?!)을 무릅쓰고 프로젝트에 뛰어들었습니다. ㅠㅠ 언젠가는 후회할 날이 올지도... 크윽... ㅠㅠ

이제 2015년이 밝았는데요, 작년처럼 별 탈없이 우리 가족이 행복하게 잘 지냈으면 좋겠네요. ^^ 그럼 새해 복 많이 받으세요 ^^

판다보드용 우분투를 아래 명령으로 업그레이드를 진행한 후, Omap4-extras 패키지를 설치하면 리부팅 중 멈추는 오류가 발생합니다. ㅠㅠ 아아 정말 삽질은 끝이 없군요 ㅠㅠ

sudo update
sudo upgrade
sudo clean
sudo reboot

확인 결과 PHP5와 Omap4-extras 패키지가 같이 설치되면 커널 부팅 오류가 발생했는데요, 해결법은... 둘중에 하나를 안까는 겁니다. ㅠㅠ 사실 서버를 만들어 놓고 LAPM을 설치하지 않는 건 말도 안되는 일이라... Omap4-extras를 포기했습니다. ㅠㅠ

아아.. 드디어 긴 삽질이 끝났군요. ㅠㅠ

그럼 좋은 하루 되세요 ^^

우분투(Ubuntu)에서 새로운 리파지토리 추가가 필요해서 "apt-add-repository"를 입력했더니 "command not found" 오류가 발생했습니다. ㅠㅠ (요즘 이런류의 오류를 많이 겪는 듯한...) 그래서 처음엔 오타가 났나 했는데... 아무리봐도 오타는 아니었습니다.

그래서 구글신께 또 여쭤봤더니 다음과 같이 답변을 해주시더군요. 결론은 "python-software-properties"를 설치해야 한다는 겁니다. ^^;;; 그것 참... 이상하네요. 이게 왜 기본 패키지에 안들어있는지 잘 모르겠다는... ^^;;;

sudo apt-get update 
sudo apt-get install python-software-properties
sudo apt-get install software-properties-common

그럼 좋은 하루 되세요 ^^

예전에 계획한 일이 있어 판다보드(PandaBoard)를 다시 꺼내 들었는데요, 우분투 12.04 서버 버전을 깔고 싶어 튜토리얼 대로 진행을 했습니다만.... 역시나 문제가 발생했습니다. ㅠㅠ 바로 Uboot 문제인데요, 판다보드 ES 버전 보드의 램이 엘피다(ELPIDA) 사 제품으로 교체되면서 다음처럼 제대로 인식이 안되는 문제가 발생했습니다.

OMAP4460 ES2.0
SDRAM: identified size not same as expected size identified: 0 expected: 40000000

구글링해보니 이 문제를 해결하기 위해서는 결국 Uboot의 소스코드 중 omap4_common.h 파일의 다음 부분을 수정해야 한다는 걸 알게됬는데요... 사실 Uboot를 다시 빌드하는 것도 귀찮고 이걸 위해 호스트 PC에 우분투 개발 환경을 설정하는 것 또한 부담이라 다른 사람이 빌드해 놓은 걸 찾아봤습니다. ^^;;;

// 아래 부분을 주석처리해서 기능을 제거해야 함
// #define CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS

그랬더니~!! SVT 사이트에서 해당 부분을 수정하고 빌드한 boot 이미지를 찾을 수 있었습니다. 사이트에서 압축 파일을 통째로 다운받아 압축을 풀면 boot 디렉토리에서 MLO, u-boot.bin, uimage 파일을 확인할 수 있는데요, 이 파일을 우분투 이미지 다운로드 사이트에서 다운로드한 OMAP4 버전 Prebuild 이미지에 덮어쓰면 정상적으로 부팅이 됩니다.

판다보드에 우분투 설치에 대한 내용은 softswagen 사이트에서 자세히 볼 수 있습니다. 참 자세히 설명해줘서 따라하는데 큰 무리는 없었던 것 같아요(그 Uboot 문제로 부팅 안되는 문제만 빼면... 쿨럭..;;;)

어휴... 이걸 몰라서 하루종일 삽질했네요. ^^;;;

그럼 좋은 하루 되세요. ^^


MLO


u-boot.bin


uImage


캡차(CAPCHA)는 Completely Automated Public test to tell Computers and Humans Apart의 약자로, 뜻을 그대로 해석하면 컴퓨터와 사람을 구분하는 자동화된 테스트입니다. 사실 자동 가입 방지나 자동 글쓰기 방지 등에 많이 사용되는데요, 보통 이 캡차를 입력하는데 10초 정도를 사용한다고 합니다. ^^;;;

그런데, 이렇게 무의미하게 쓰여지는 10초를 의미있는 곳에 쓰자는 게 리캡차(ReCAPCHA)라는 프로젝트입니다. 어떻게 활용하냐구요? 구글에서 진행하는 쿠텐베르크 프로젝트가 있는데요, 바로 여기에 사용됩니다. ^^;;; 쿠텐베르크 프로젝트는 전세계의 고서부터 최근 논문까지 모두 디지털화하자는 프로젝트인데요, 고서를 디지털화할때 스캔을 해서 만듭니다. 그런데, 오래되다보니 글자가 번지거나 선명하지 않아서 못 읽는 경우가 생기는데요, 이런 경우는 일일이 사람이 보고 판단해줘야 한다는군요. ^^;;;


리캡차는 고서에서 컴퓨터가 못 읽는 부분과 실제 CAPCHA를 합쳤습니다. 사람이 CAPCHA를 맞췄다면 같이 입력한 고서에서 추출한 글자 또한 맞다고 생각하는거죠. 정말 멋진 아이디어지 않습니까!!! 깜짝 놀라고 또 너무 감동받았습니다. ㅠㅠ 이렇게 해서 복원된 책들만 해도 수백만권이 넘는다네요. ㅠㅠ 세상에는 정말 멋진 사람들이 넘치는 것 같습니다. ^^


리캡차에 대해 설명한 EBS의 동영상을 보려면 http://tvcast.naver.com/v/214835/list/19813를 클릭하시면 됩니다.


그럼 오늘도 좋은 하루 되세요 ^^

사실 읽기는 한참 전에 읽었는데 너무 정신 없을 때 읽는 바람에 이제야 서평을 남기네요. ^^;;; 세계 최대의 QnA 사이트인 스택 오버플로우의 창시자라 예전부터 관심있게 보고 있던 책이었거든요.


<이펙티브 프로그래밍 - 출처 yes24>

책의 내용은 아주 흥미롭습니다. 자기가 스택 오버플로우를 만든 이유부터해서 개발자가 왜 좋은 컴퓨터를 써야하는지, 왜 듀얼 모니터가 그토록 중요한지를 거쳐 나중에는 바른 자세가 왜 중요한지까지 다양한 내용을 다루고 있습니다. ^^;;; 아무래도 저자가 자신의 블로그에 썼던 글을 옮겨와 책으로 만들어서 그런 것 같아요. 덕분에 지루하지 않게 잘 읽었던 것 같습니다.

물론 책이 재미있는 내용만 다루고 있지는 않습니다. 동료와의 관계나 상사와의 관계같은 부분도 언급을 하고 있는데요, 조금 심각할 수 있는 내용이지만 저자 특유의 위트로 잘 풀어나가고 있습니다. 책을 읽으면서 나도 팀에 있는 능력자들에게 어울리는 사람인지 한 번 생각하게 되더군요. ^^;;;; 최소한 남들과 같이 걸을 수 있는 레벨은 되어야할텐데.... 수련을 더 해야겠다는 생각을 했습니다.

야외 활동이 적어지는 겨울인데, 따뜻한 아랫목에서 코딩호러의 이펙티브 프로그래밍 어떠세요?

오늘 이메일로 이북(E-book)을 반값 세일한다고 왔길래 들어가봤더니만... 헉!! 이북만 반값 세일하는 게 아니었군요 @0@)-b 도서도 반값세일합니다!! 꽤 유명한 책들도 있던데요~ 대표적으로 컴파일러 구조와 원리, 뇌를 자극하는 윈도우즈 시스템 프로그래밍, 제프리 리처의 Windows via C/C++가 있습니다. 전체 리스트는 http://www.hanbit.co.kr/book/bestsellers.html에서 보실 수 있습니다. ^^;;;


<반값 세일 목록 - 출처 한빛미디어>

제가 이런 말씀을 드리는 이유는... 바로~!!! 제 책도 반값 세일을 한다는 거죠!!! 64비트 멀티코어 OS 원리와 구조 1권 , 64비트 멀티코어 OS 원리와 구조 2권을 모두 반값에 구하실 수 있습니다. >ㅁ<)/~ 책 값이 너무 비싸서 사기가 부담스럽다는 이메일을 종종 받는데요, 이제는 부담없이 사실 수 있으니 지금 사시면 좋을 것 같네요 ㅠㅠ

언능 지르세요~!!

올해 초만 해도 한 해를 어떻게 보내야 할 지 막막했는데, 벌써 연말이 다가오고 있습니다. ㅠㅠ 정말 지난해보다 올해는 더 정신이 없이 지나간 것 같더라구요. 그래서 뭔가 이래서는 안 되겠다 싶어 책을 찾아보던 중!!! 눈에 확 띄는 책을 찾았습니다. @0@)-b 슬로씽킹이 바로 그겁니다.


<슬로씽킹-출처 yes24>

일단 책 표지에 나와 있는 문구들은 굉장히 인상 깊어서 책을 사긴 했는데요, 얼래... 책을 몇 장 넘기고 나서는 제가 생각하던 책이 아니라는 생각이 들더라구요. 사실 저는 뭔가... 생각의 폭을 넓히는 방법이나 문제를 다른 각도로 바라볼 수 있는 기법같이 테크니컬한 내용을 다루고 있을 줄 알았는데, 그런 것보다는 실제 사례를 살펴보면서 성급하게 생각해서 실패한 부분과 이를 극복하기 위해 다시 어떤 노력을 들였던지에 대해서 설명하고 있습니다. ^^;;; 물론 여기서 어떤 노력은 시간과 노력을 들여서 "천천히" 찾은 해결책인 거지요.

이 책을 찾은 독자라면... 정신없이 하루하루를 살고 "언발에 오줌누기"라도 해야 눈 앞에 쌓인 문제를 겨우 해결할 수 있는 사람들일텐데... 이런 사람들을 위해 뭔가 더 실천해볼 수 있는 이야기를 해줬으면 더 좋지 않았을까 하는 생각이 들었습니다. ^^;;;

제가 공대생이라 그런지 읽고나서 든 생각은 "그래서 어떻게 하라는거지? 시간을 들여 계속 생각하고 답을 찾으라는 건가?" 였습니다. ㅠㅠ 이궁... 결국 답은 스스로 찾을 수 밖에 없겠군요. ㅠㅠ

우연히 웹서핑을 하다가 굉장한 TED의 발표를 보게 되었습니다!!! 아침에 눈이 번쩍 떠지던데요~!! 풍차를 이용해서 전기를 만들고 물을 퍼올린 한 청년의 이야기입니다.

말라위에 기근이 닥쳐 공부를 못하게 되자 스스로 도서관에 가서 책을 읽고 풍차를 만들 계획을 세웠다는데... 고물을 주워 만든 풍차로 전등을 키고 물을 퍼올렸답니다. 정말 대단한 것 같습니다.

이 청년이 마지막에 한 말이 정말 인상적인데요, 이렇게 말했습니다.

"어떠한 일이 있어도 꿈을 포기하지 마세요"

정말 가슴에 와 닿는 이야기가 아닐 수 없습니다. ㅠㅠ 시간 나실 때 한 번 보세요. 정말 멋집니다. ^^)-b

그럼 즐거운 주말 되세요 >ㅁ<)/~

아시는 분들도 있겠지만 제가 원래 좀 저돌적입니다. ^^;; 무슨 이야기인고 하니 한 번 뭔가 해야되겠다고 생각하면 그대로 달리는 성격이란 것이죠. 그래서 앞뒤 안 가리고 덤비는 통에 고생도 많이 했는데요, 이번에도 고생을 엄청했습니다. ㅠㅠ

파트타임으로 석사를 하고 있어서 논문 준비를 해야했는데요, 연구 주제를 잡다가 키보드 관련 주제를 잡으면 좋겠다는 생각을 했습니다. 그게 아마 올해 초... 3월 쯤이었던 것 같네요. 그리고 관련 정보를 모으다가 방향을 잡은 게 6월이었습니다. 근데... 여기서 한 가지 큰 실수를 했는데요... 이왕 하는 거 크게 해보자는 생각이 든거죠. ㅠㅠ

크게 하려면 당연히 시간이 필요하고 그렇다고 이거 때문에 다른 일에 지장이 있으면 안되니까, 아침에 좀 일찍 일어나기 시작했습니다. 예전에 책 쓸 때는 새벽 시간을 주로 이용했는데요, 지금은 애기를 봐야되서 새벽시간은 좀 어렵더라구요. 5월 초부터 지금까지 휴일도 없이 계속 아침에 작업을 했던 것 같습니다. ^^;;; 와이프가 저보고 독하다고 그랬어요. ㅋㅋㅋ

약 5개월 동안 미친 듯이 달렸더니 이번에도 뭔가 뚝딱 나왔습니다. 시간으로 따지면 약 300시간 이상(2시간 * 30 * 5) 쓴 것 같네요. 사실 주말에는 와이프랑 애기 재우고 밤샘 작업한 적도 한두 번이 아니라서 실제로는 더 될 것 같은... ㅠㅠ. 논문에 대한 이야기는 나중에 또 하겠지만... 잘 되면 이걸로 학위도 받을 수 있을 것 같네요. >ㅁ<)/~ 아아... 드디어 졸업(할 수 있을까요 ㅠㅠ)...

이제 아침이 좀 한가로워지겠군요. 만세~!! 

그럼 좋은 하루 되세요 >ㅁ<)-b

ps) 올해도 목표 달성~!!

집에 애기가 있는지라 소음이 심한 PC 대신에 소음이 거의 없는 맥미니를 주로 사용하고 있습니다. 사실 아주 옛날에 중고로 산 모델이라 성능이 엄청 떨어져서 하드(?!)한 작업은 좀 힘든데요, 그래도 꾸역꾸역 쓰고 있는 중입니다. ㅠㅠ

제가 vi를 좀 좋아하는지라(^^;;;) Sublime Text2를 vi 모드로 설정해서 쓰고 있는데요, 커서 이동을 위해 J나 K 같은 문자를 길게 누르면 키가 반복 입력되서 이동하는 게 아니라 특수 문자를 입력할 수 있는 메뉴가 뜨더라구요. ㅠㅠ

얼마 간은 참고 썼는데 오늘 드디어 인내심이 폭발해서 이게 뭔가 찾아봤더니만... 액센트가 있는 문자를 쉽게 입력하기 위해 맥에서 지원하는 기능이더군요. @0@ 아니, 이렇게까지 신경써주지 않아도 되는데... 쿨럭..;;; 이걸 키 반복으로 바꾸려면 다음과 같이 입력하면 됩니다.

# 키 반복으로 설정하는 경우
defaults write -g ApplePressAndHoldEnabled -bool false

# 특수 문자 입력으로 설정하는 경우
defaults delete -g ApplePressAndHoldEnabled

이제야 잘 되는군요. ^^;;; 맥의 액센트가 있는 문자 입력 기능에 대한 내용은 Back to the MAC님의 블로그를 참조하세요.

많은 분들이 그러시겠지만 저도 나름 사정이 있어서 프로그래밍을 좀 일찍 시작했습니다. 대학 입학 후 1년정도 다닌 뒤에 바로 취직을 했으니까요... 아니 해야 했으니까요. ^^;;; 집안에 어려움이 있어서 휴학을 하고 일을 해야 했는데, 일을 좀 일찍 시작한 덕분에 남들보다 프로그래밍에 빨리 익숙해진 것 같습니다. 전화위복이랄까요? ^^;;;

프로그래밍을 남들보다 일찍 시작한 건 좋은 점이지만... 사실 한 가지 문제가 있습니다. 그것은 바로 손가락의 통증인데요, 제 타이핑 습관이 바닥까지 힘 껏 때리는 것이라... 키보드를 오래 타이핑하면 손가락 마디가 쑤십니다. ㅠㅠ 젊을 때 너무 오래까지 코딩하던 습관이 이렇게 돌아올 줄은 몰랐어요. ㅠㅠ

그래서 키보드 선택에 굉장히 민감한데요, 최근까지는 리얼포스를 주로 썼습니다. 뭐, 기성품 키보드 중에는 끝판왕이라고 불리는데요, 디자인은 좀 레트로(옛날 키보드?)스러운데 키감은 꽤 정갈하고 키 압이 낮아 프로그래머들이 좋아하는 키보듭니다.

리얼포스
<리얼포스 87 - 출처 레오폴드 사이트>

사실 저 디자인은 좀 있어보이는 건데... 실제 다른 리얼포스 제품의 사진을 보시면... 그냥 만원짜리 키보드처럼 보입니다. 엄청 비싼 키보드고 엄청 좋은 키보드인데... 안타까운 점이지요. ㅠㅠ

좀 안다하는 사람들이 리얼포스만큼이나 많이 쓰는 키보드가 바로 기계식 키보드인데요, 체리 키보드, FILCO 마제스터치, 레오폴드 FC 시리즈, 레이저의 블랙 위도우, 더키 Shine 키보드, 덱 프랑슘/헤슘, 한성 기계식 키보드 등등 키보드가 여기에 속합니다. 왜 기계식인고 하니... 접점 시트와 러버돔 시트로 이루어진 일반 멤브레인 키보드와 달리 키 하나 하나가 기계식 스위치로 이루어져 있기 때문입니다. 아래 사진을 보면 이해가 더 빠르실 것 같네요. ^^;;

더키 Shine
<더키 G2 - 출처 레오폴드 사이트>
체리 스위치
<체리 기계식 스위치 - 출처 레오폴드 사이트>

키 하나 하나에 스위치가 삽입되다보니 가격이 좀 비싸지만, 특유의 키 감과 소리 때문에 꽤 많이 쓰이고 있습니다. 요즘은 빠른 반응성을 무기로 게임 유저들을 공략하고 있더라구요. ^^;;;

기계식 키보드의 핵심인 스위치는 사실 튜닝이 가능한데요, 간단한 구조로 되어있어 내부 스프링과 축 부분을 쉽게 교체 및 윤활할 수 있습니다. 실제로 이런 취미를 즐기는 분들이 있는데 키보드 매니아키보드랩에 많이 모여있습니다. 저도 여기에 잠시 들렸다가 커스텀 키보드에 빠지게 됬어요. ㅠㅠ

커스텀 키보드 <트루커스텀님의 커스텀 키보드 - 출처 kbdlab>

사이트에 가보시면 위에 보시는 것처럼 키보드를 자체 제작하시는 분들도 꽤 있으시고, 이를 DIY 키트 형태로 제공하시는 분들도 있습니다. 저도 운 좋게 구해서 직접 조립해서 쓰고 있는데요 결론은 대만족~!!!입니다. 손가락이 좀 안 좋아서 키 압이 낮은 걸 굉장히 좋아하는데, 기성품에서는 찾을 수 없은 키 압을 만들었거든요. 단순히 스위치를 열어서 키 압이 낮은 스프링으로 교체만 한거지만 아주 좋습니다. 손가락에 힘을 조금만 줘도 키가 입력되니까 손가락에 힘 줄 필요가 없어서 쑤시는 게 덜 해진 느낌입니다. ^^;;;;

다만... 바닥까지 엄청 빨리 내려가다보니까 바닥에 닿았을 때 오는 충격은 예전보다 더 세진 건 함정... ㅠㅠ 그래도 충격을 흡수하는 고무링으로 어찌 해결해볼 수 있을 것 같군요. ^^;;;

요즘 키보드 덕에 일 할 맛 납니다. >ㅁ<)-b
손가락이 완전 행복하네요 ^^

그럼 좋은 하루 되세요 ^^

아두이노
아두이노 인벤터 킷 - 출처 sparkfun

아두이노(Arduino)의 경우 맥(Mac)에서도 개발을 할 수 있도록 스케치(Sketch) 프로그램을 제공하고 있습니다. 마침 아두이노 보드가 생긴지라 테스트를 해보려고 맥에 연결한 뒤 간단한 LED Blink 예제를 실행해봤는데요, 아래와 같은 오류가 발생하더라구요. ㅠㅠ

avrdude: stk500_recv(): Programmer is not responding

맥(Mac)에서는 어지간하면 다 드라이버를 설치해주기 때문에 아무 생각없이 아두이노를 꽂았는데, 에러 메시지를 봤을 때는 약간 당황스러웠습니다. 그래서 구글 검색을 해봤더니 저와 같은 문제를 겪은 사람이 한두 명이 아니더라구요. 아두이노 보드는 우노 보드를 사용하고 있는데, 요즘 나오는 atmega8U 칩 버전이 아닌 FTDI 칩을 사용하는 버전에서 그런 문제가 많이 보였습니다.

한참을 검색하다가 혹시 드라이버에 무슨 문제가 있는 건가해서 드라이버쪽으로 검색을 해봤는데요, 아니나 다를까!! 역시 드라이버가 문제였습니다. ㅠㅠ FTDI 사의 사이트에서 드라이버를 업데이트하니 정상적으로 업로드가 되었습니다. 다운로드 받으려면 여기로 이동하시면 됩니다. ^^

아... 보드 설치한지 거의 1시간 만에 기본 예제를 실행했네요. ^^;;; 갑자기 피곤이 밀려와서 쉬어야겠습니다. ㅎㅎ

그럼 즐거운 주말 되세요 ^^

회사를 이직한지 이제 2년이 갓 넘었습니다. 이직 후 1년 동안은 새로운 분야에 적응하랴 회사 분위기에 적응햐라 앞만 보고 달렸는데요, 2년 차부터는 조금 적응이 되서 뒤도 가끔 돌아보며(?!) 살고 있습니다. 이전 회사와 지금 회사의 가장 큰 차이점을 들자면 마음의 "여유"라고 할 수 있을 것 같군요. ^^

이전에 근무하던 S사에서는 최전방 부서에서 일했습니다. 플래시 메모리 관련 제품을 만드는 부서였는데, 스마트폰용 저장매체의 펌웨어를 만드는 것이 팀이 맡은 역할이었습니다. 스마트폰용 저장매체는 플래시 메모리를 기반으로 하는데요, S사는 플래시 메모리와 관련 제품을 꽉 잡고 있는 회사라... 제가 있던 부서는 꽤 바빴습니다. ^^;;; 세계 시장 점유율을 유지하려면 더 높은 용량을 제품을 더 빨리, 그리고 싼 값에 출시해야 했기 때문이지요.

이런 연유로 개발도 빨리해야 했고 고객사에서 들어온 제품 불량 분석도 빨리해야 했습니다. 팀원들이 워낙 특출나서 펌웨어도 뚝딱 만들어내고 불량 분석도 몇시간 내에 끝났지만... 뭔가 위태로워보였습니다. 아니, 위태로웠습니다. 촉박한 개발 기간으로 인한 테스트 기간의 부재와 "실수"에 대한 부담감 때문이었는데요. 내가 한 실수 때문에 제품 출시가 늦어지거나, 불량 원인 분석이 잘못되어 진짜 원인을 놓쳤을 때 이런 부분들이 즉시 "돈"으로 환산됐습니다. 그나마 행복한 케이스는 고객 출시 일정이 늦어져서 제품 가격을 조금 깎아주는 정도였지만, 판매한 제품 전체를 다시 배로 실어와서 펌웨어 수정 후 다시 보내야하는 재앙 수준의 일도 벌어졌습니다.

제가 S사에서 겪은 분위기는 다들 겉으로는 웃으며 즐겁게 일하는 듯 하지만, 실제로는 언제 터질 줄 모르는 폭탄을 안고 일을 하는 느낌이었습니다(물론 제가 좀 소심한 성격이라 더 그렇게 느낀 것일 수도 있어요 ^^;;;) 이때는 정말 회사가기 싫더라구요. ㅠㅠ 보통 퇴근할 때 펌웨어 테스트를 걸어놓는데 출시일이 다가올때는 걱정때문에 새벽에 몰래 출근해서 테스트 결과를 확인한 일도 일도 비일비재했습니다. 아침에 출근해서 발견한 버그가 심각한 문제라 출시일이 늦어질까봐 겁이났던 거죠. ㅠㅠ

그런데 저만 그런 것이 아니었더군요. 다들 코드를 만지는 게 부담이었던지 소스코드 저장소에 커밋을 꺼리는 웃지 못할 일도 발생하고, 업무 분장 시에 복잡하고 어려운 핵심 모듈을 맡지 않으려 서로 등 떠미는 일도 있었습니다. ^^;;; 물론 어찌어찌 굴러는 갔지만... 글쎄요, 온 힘을 다해 프로젝트에 힘을 쏟진 "않았던" 것 같습니다. 뭔가 새로운 시도를 하고 시행착오를 겪으며 더 나은 방법을 찾아야 하겠지만 그러지 "않았습니다". 지금 생각해보면 이 모든 게 "마음에 여유"를 잃어버려서 그랬던 것 같아요. 시간이 없고 실수가 "돈"으로 바로 환산되니 그만큼 부담이었던 거죠.

프로그래머 그 다음 이야기를 읽다가 옛날 기억이 떠올랐는데... 직원들이 마음에 여유를 잃어버리는 일, 그것만큼 회사에 손해가 되는 일이 없는 것 같은 생각이 들어서 한자 남겨봅니다. 시간적인 여유는 그렇다치더라도 "마음에 여유"까지는 뺏지 않았으면 좋겠네요. ^^;;;

http://image.yes24.com/goods/5354328/L

<프로그래머 그 다음 이야기 - 출처 yes24.com>

그럼 즐거운 주말 되세요. ^^

[서평] "Make: 아두이노 DIY 프로젝트"와 "손에 잡히는 아두이노"

휴일을 맞아 밀린 여러가지 일들을 해치우고 있습니다. ㅠㅠ 가장 먼저 했던 일은 우리 애기랑 놀아주는 일이었고... 이틀을 풀로 놀아줬더니만 체력이 거의 소진되어 어제는 집에만 있었네요 ^^;;; 어린이 날에 오히려 더 빡시게 놀아줬어야 하는 생각이... ^^;;;; 그 다음으로 했던 일은... 학교 텀 프로젝트인데... 공간 데이터베이스를 이용해서 서비스를 만드는 프로젝트입니다. ^^;;; 이건 우여곡절이 많아서... 따로 이야기를 해야할 정도군요. 쿨럭..;;;

그리고 마지막이 바로~!! 밀린 책 보기~!!! @0@)-b 사실 텀 프로젝트한다고 별로 보지는 못했지만, 이전에 봤던 책과 방금 다 읽은 따끈따끈한 책이 있으니 책 이야기를 해볼까 합니다. ^^)/~

Make: 아두이노 DIY 프로젝트
<Make: 아두이노 DIY 프로젝트 - 출처 yes24>

"Make 프로젝트"는 뭔가 만들기를 좋아하는 사람들이 모여 자기가 직접 만든 프로젝트를 자랑하는 곳이라고 알고 있는데요, 한빛미디어의 Make 시리즈 책을 통해서 대충 어떤 분위기(?)인지 파악만 하고 있습니다(왠지 더 알았다가는 발을 못 뺄것 같은 느낌이... ㅎㄷㄷ).

이 책 역시 Make 정신에 따라 여러가지를 직접 만들 수 있게 설명하고 있는데요, 설명 수준이 거의 예술입니다. 뭐랄까요... 혹시 내가 뭘 중간에 잊어 먹을까봐 계속 체크해주는 느낌이랄까... 특히 소스코드 부분은 완전 초보를 생각하고 쓴 건지 엄청 자세합니다. @0@)-b 덕분에 아주 쉽게 읽을 수 있었어요. 한 가지 아쉬운 점은 직접 따라 만들 시간이 없어서 책으로만 보고 만족했다는 거죠. ㅠㅠ

서점에 가실 분은 Make: 아두이노 DIY 프로젝트를 한 번 보시길 추천합니다. 저처럼 뭔가 만들기를 좋아하는 분이라면 아주 재미있게 보실 수 있을 것 같네요. ^^

손에 잡히는 아두이노
<손에 잡히는 아두이노 - 출처 yes24>

아... 뭐랄까요... 이 책은... 아두이노의 창시자가 쓴 책이라고 해서 호기심에 본 책인데... 딱히 뭐라 말씀드릴 것이 없어요. ㅠㅠ 책 서문에도 나와있듯이 디자이너와 같이 프로그래밍을 전혀 모르는 사람들을 위해 아두이노를 소개하는 것이 목적인 책이라... 프로그래머들이 보기에는 "응?!" 할 정도로 뭔가 많이 빠진듯 한 느낌에 책입니다. 그래서 그런지 페이지 수도 작고 금방 읽을 수 있는 게 이 책의 장점(?!)이더군요. ^^;;;

아두이노가 무엇이고 어떤 일을 할 수 있는지 궁금하시다면 Make: 아두이노 DIY 프로젝트를 먼저 보시고, 시간이 나신다면 손에 잡히는 아두이노를 한 번 훑어 보시는 것도 좋을 것 같습니다.

그럼 좋은 하루 되세요 ^^

* Cygwin이 자주 업데이트 되는 바람에 가상머신을 사용해서 개발하실 수 있도록 준비했습니다. 계속해서 빌드에 오류가 생기신다면 http://jsandroidapp.cafe24.com/xe/8920 에 가셔서 가상머신을 사용하시기 바랍니다. ^^

* 2014년 4월 13일자 Cygwin을 기준으로 내용이 업데이트 되었습니다 ^^

* 빌드에 문제가 생기거나 정상적으로 동작하지 않는다면, MINT64 OS 개발용 가상머신을 이용하세요 ^^

** 가상머신 이미지 다운로드: http://jsandroidapp.cafe24.com/xe/8920**

* 관련 내용은 64비트 멀티코어 OS 원리와 구조 QnA 사이트(www.mint64os.pe.kr)에서 계속 업데이트 되고 있습니다. ^^


제 책 "64비트 멀티코어 OS 원리와 구조" 가 나온지도 벌써 3년이 지났습니다. ^^;;; 책이 출간됨과 동시에 가장 많이 질문을 받는 것이 OS 제작을 위한 환경 구축 방법인데요...

얼마전부터 환경 구축에 어려움을 겪는 분들이 많아지셔서 Cygwin 최신 버전을 다운 받아서 빌드를 해봤습니다. ^^;;; 실제로 빌드를 진행하다보니 몇 가지 변경점이 보이더군요. ㅠㅠ 그래서 그 내용을 여기다가 정리해놓습니다. ㅠㅠ

<출처 - yes24.com>

ps1) 혹시 아래대로 수행했는데 빌드에 문제가 생기거나 정상적으로 동작하지 않는다면, 곧 업로드될 MINT64 OS 개발용 가상머신을 이용하세요 ^^ ps2) 안타깝게도 Cygwin에 덮어쓰는 방법은 이제 더이상 동작하지 않습니다.


Cross Compiler를 만들려면 먼저 Cygwin 사이트(http://www.cygwin.com/install.html)로 이동해서 32비트 Cygwin Installer를 다운로드 받습니다. Setup.exe 파일을 다운하면 됩니다. ^^;;;

다운로드 후 파일을 실행하면 어떻게 설치할 것이고 패키지 소스는 어디에서 다운 받을 것인지 선택하는 부분이 나오는데, 책에 나와있는 카이스트 사이트(ftp://ftp.kaist.ac.kr)가 더이상 유효하지 않으니 다른 사이트를 선택해야합니다.

우리나라 근처에 있는게 아무래도... 속도도 빠르니 가까운 일본 주소인 ftp://ftp.jaist.ac.jp를 선택하면 됩니다. ^^;;; 패키지 소스를 다운 받을 주소를 선택하고 난 뒤에는 "Select Package" 화면이 나올 때까지 적당히 Next를 선택해주면 됩니다. ^^;;;

"Select Package" 화면이 나오면 아래의 항목들을 설치해줍니다. 책을 쓸 때는 C++ 관련 항목이 없어도 정상적으로 빌드가 되었지만, 지금은 C++ 컴파일러를 설치하지 않으니 configure 중에 오류가 발생하더군요. ㅠㅠ

+Devel
    + binutils - 2.24.51-2 버전, 소스 및 바이너리 모두 설치
    + bison - 2.7.1-1 버전, 바이너리만 설치
    + flex - 2.5.35-1 버전, 바이너리만 설치
    + gcc-core - 4.8.2-2 버전, 소스 및 바이너리 모두 설치
    + gcc-g++ - 4.8.2-2 버전, 바이너리만 설치
    + libiconv - 1.14-2 버전, 바이너리만 설치
    + libtool - 2.4.1 버전, 바이너리만 설치
    + make - 4.0-2 버전, 바이너리만 설치
    + patchutils - 0.3.2-1 버전, 바이너리만 설치
+Libs
    + libgmp-devel - 6.0.0a-1 버전, 바이너리만 설치
    + libmpfr-devel -3.1.2-1 버전, 바이너리만 설치
    + libmpc-devel - 1.0.2-1 버전, 바이너리만 설치
    + libncurses-devel - 5.7-18 버전, 바이너리만 설치

위의 항목이 설치되고 나면 binutils부터 차례대로 빌드를 시작하면 됩니다.

binutils를 빌드하려면 /usr/src 디렉터리 아래에 있는 binutils 디렉터리로 이동해서 다음과 같은 순서로 커맨드를 입력하면 빌드와 설치가 끝납니다.

// 디렉터리 이동 후 아래 작업 수행
$> cd /usr/src/binutils-2.24.51-2   <== 디렉터리 이름은 binutils 버전에 따라 다를 수 있음    
$> export TARGET=x86_64-pc-linux
$> export PREFIX=/usr/cross
$> ./configure --target=$TARGET --prefix=$PREFIX --enable-64-bit-bfd --disable-shared --disable-nls
$> make configure-host
$> make LDFLAGS="-static"
$> make install

아래는 테스트를 위한 부분입니다. 아래처럼 커맨드를 실행했을 때 x86_64 관련 항목이 보이면 제대로 된 것입니다. ^^;;;;

$> /usr/cross/bin/x86_64-pc-linux-ld --help | grep "supported "
/usr/cross/bin/x86_64-pc-linux-ld: supported targets: elf64-x86-64 elf32-i386 a.
out-i386-linux efi-app-ia32 efi-bsdrv-ia32 efi-rtdrv-ia32 efi-app-x86_64 efi-bsd
rv-x86_64 efi-rtdrv-x86_64 elf64-little elf64-big elf32-little elf32-big srec sy
mbolsrec tekhex binary ihex
/usr/cross/bin/x86_64-pc-linux-ld: supported emulations: elf_x86_64 elf_i386 i38
6linux

binutils 빌드 및 설치가 끝났다면 gcc를 cross compile할 차례입니다. gcc는 아래와 같은 순서로 입력하면 빌드와 설치가 완료됩니다. ^^;;;

압축 해제, 파일명은 cygwin에서 다운받은 GCC 버전에 따라서 다를 수 있으니 실제 디렉터리를 확인하여 입력해야 합니다. ^^;;; 아래 패치 파일도 모두 마찬가지 입니다.

$> cd /usr/src
$> tar -xvf gcc-4.8.2.tar.bz2
$> export TARGET=x86_64-pc-linux
$> export PREFIX=/usr/cross
$> export PATH=$PREFIX/bin:$PATH

압축 해제가 끝났으니 소스가 있는 디렉터리 이동 후 나머지 작업 수행합니다.

$> cd /usr/src/gcc-4.8.2    <== 디렉터리 이름은 GCC 버전에 따라 다를 수 있음
$> ./configure --target=$TARGET --prefix=$PREFIX --disable-nls --enable-languages=c --without-headers --disable-shared --enable-multilib
$> make configure-host
$> make all-gcc
$> make install-gcc

빌드가 완료된 후 테스트용입니다. 아래와 같이 입력했을 때 m64가 보이면 정상적으로 설치된 것입니다.

$> /usr/cross/bin/x86_64-pc-linux-gcc -dumpspecs | grep -A1 multilib_options
*multilib_options:
m64/m32

빌드한 크로스 컴파일러는 MINT64 OS를 개발하는데 필요한 최소한의 환경만 구성되어 있습니다. 64비트 관련 gcc 라이브러리 등은 빌드되지 않은 상태이므로, 빌드된 컴파일러로 test.c 파일을 빌드했을 때 발생하는 오류는 무시하셔도 됩니다. ^^

자, 이제 64비트 바이너리를 생성할 수 있는 gcc가 생성되었으니, 즐거운 OS 프로그래밍하세요 ;)

64비트 멀티코어 원리와 구조가 나온지 약 3년이 지났습니다. 그동안 QnA 사이트를 운영하면서 가장 많이 받았던 질문이 개발환경 설정에 대한 글이었는데요, 아무래도 cygwin 버전이 올라가다보니 책에 있는 빌드방법으로는 제대로 빌드가 되지 않더라구요(지금도 개발환경에 대한 질문이 계속 올라온다는...). ㅠㅠ 그래도 많은 분들이 도와주셔서 어찌어찌 성공하신 분들도 있지만... 사실 책임은 저한테 있는지라 언젠가는 해결해야 겠다고 생각했습니다.

<64비트 멀티코어 원리와 구조 - 출처 yes24>

그래서~!!! 오늘 애기를 빡시게 놀게한다음 일찍 재우고 다시 개발환경을 만드는 중입니다. 그래서 내용도 업데이트하고 이번에는 가상머신으로 만들어서 다운받아 바로 쓸 수 있도록 만들 생각입니다. @0@)-b 이렇게 하면 빌드에 문제가 생겨도 가상머신을 다운받아 실행하면 되니 문제가 없을 것 같더군요. ^^;;;

크로스 컴파일러를 만드는게 시간이 많이 걸리는지라... 지금 시작하면 언제 끝날지 잘 모르겠네요. ㅠㅠ 그래도 이번에 확실히 해서 큰 포부를 가지고 OS 개발을 시작하셨다가... 개발 환경 설정 때문에 좌절하시는 일이 없도록 잘 해보겠습니다. @0@)/~

그럼 좋은 밤 되세요 >ㅁ<)-b

ps1) 아침에는 개발 환경 설정을 업데이트 할 수 있으면 좋겠네요 ㅠㅠ

ps2) Yes24 사이트에서는 책이 품절로 나오는군요. ' ')a... 교보문고에 가시면 아직 구할 수 있습니다. ^^

사실 게임 매니악스 슈팅 게임 알고리즘은 출시 예정 소식이 들릴 때 부터 관심을 갖고 보고 있던 책인데요, 여러가지 일이 있다보니 이제야 완독했네요 ^^;;; 책을 덮고 나니 아주 잘 정리된 사전을 본 듯한 기분이었습니다. 뭐랄까요... 필요하면 언제든지 알고리즘을 찾아 쓸 수 있게 주제 별로 정리해둬서 그런 것 같습니다. ^^)/~

이 책의 백미를 꼽으라면... 다른 분들도 서평에 언급을 하셨지만 예전 게임에 어떤 알고리즘이 쓰여졌다고 설명하는 부분인 것 같습니다. 사실 알고리즘하고 그림 몇 장가지고는 잘 안 와닿는데... "예전 게임의 어디 보스에서 이런 알고리즘이 쓰였다!!" 라고 설명해주니 바로 이해가 되더라구요. 사실 제가 소시적에 오락실을 좀 많이 다녀서 그런 것일 수도... 쿨럭..;;;

Shooting

<출처 - yes24.com>

여튼 간만에 재미있게 읽은 책이네요 ^^)/~ 이제 나머지 시리즈(탄막 게임 알고리즘과 퍼즐 게임 알고리즘)도 천천히 읽어봐야 겠습니다.

그럼 좋은 하루 되세요 ^^

요즘 개인적인 이유로 우분투 계열의 리눅스를 의도적으로 쓰려고 하고 있습니다. 예전에도 쓰긴 했지만 빌드 머신으로만 활용한지라... ㅠㅠ 사실 쓴다고 이야기하기도 부끄러울 정도였거든요. 그래서 열심히 써보려고 하긴 하는데, 역시나... 맨날 쓰는 것만 쓰니 마찬가지네요. ^^;;;

쓰다가보니 부팅 때마다 매번 실행하고 싶은 프로그램이 생겼는데요, 매번 실행하려니 이것도 일이더라구요. 그래서 찾아봤더니 /etc/rc.local에 실행하고 싶은 프로그램을 지정해두면 자동으로 실행할 수 있더군요. ^^ 아래처럼 말이죠.

# 매 부팅 시 /usr/test 프로그램을 자동 실행하 싶다면 /etc/rc.local에 다음과 같이 입력

/usr/test &

그럼 좋은 하루 되세요 ^^

ps) /etc/inittab에 추가하는 방법도 있습니다. respawn 옵션은 프로그램이 죽었을 때 자동으로 재실행해주는 옵션이에요 ^^)/~

MyProgram::respawn:프로그램 경로

요즘 나오는 리눅스들은 기본적으로 ASLR(Address Space Randomization) 옵션이 켜져있는데요, 이 옵션이 켜지면 프로세스가 실행될 때마다 로딩되는 주소가 바뀌게 됩니다. 크래커들의 공격을 막기위해 들어간 기능인데요, 만든 프로그램을 디버깅할 때는 오히려 불편하더라구요. 그래서 ASLR을 끄는 방법을 찾아봤더니 의외로 간단했습니다.

echo 0 > /proc/sys/kernel/randomize_va_space

콘솔에서 위의 명령을 입력하면 즉시 ASLR 옵션이 비활성화됩니다. 활성화하려면 0을 1로 바꿔주면 되겠지요. ^^)/~

그럼 좋은 하루 되세요 ^^

펌웨어 관련 리버스 엔지니어링 자료를 찾다보니 이 바닥에서 아주 유명한 도구가 있더군요. Firmware Mod Kit(FMK)이 바로 그건데요, 펌웨어 정보를 파악해서 추출(Extract)과 재조립(Repackaging)을 편리하게 해주는 도구입니다. binwalk와 squash 파일 시스템 관련 각종 도구 및 스크립트로 구성되어 있는데, 각각 설치할 필요 없이 한 곳에 모아뒀다는 것이 장점인데, 직접 써보니 만능(?!)은 아니네요. ^^;;;

FMK를 백트랙(Backtrack) 5에 설치하고 분석하다보면 lzma 관련 라이브러리가 없다는 오류가 발생하는데요, 아래처럼 liblzma-dev 라이브러리를 설치해주면 됩니다. 간단한 내용이지만 잊어먹을까봐 남겨봅니다(요즘 들어 깜빡깜빡하는 일이 많아지고 있어요 ㅠㅠ).

sudo apt-get install liblzma-dev

그럼 좋은 하루 되세요 ^^

0. 들어가기 전에...

이 글은 64비트 멀티코어 OS 구조와 원리의 QnA 사이트(http://mint64os.pe.kr)에 등록된 RUMO님의 질문과 그에 대한 답변을 요약한 것입니다. 자세한 내용은 C언어로 커널을 개발중입니다를 참고하시기 바랍니다. ^^


1. 질문 내용

안녕하세요; 커널을 혼자 공부중인 학생입니다...

아주 기초부터 썩어빠진 놈이 커널짠답니다.

2개월째 낑낑 대는데 아주 기초적인 부분부터 막막합니다. 자비를 베풀어 도움을 주십사 합니다 ㅠ

먼저 boot.asm 을 만들었습니다....부트로더이지요. 책을 참고하여 만들었습니다.

또 어셈블리어로 kernel.bin을 만들었습니다. boot.asm이 kernel.bin으로 점프하지요. 맞습니다 여기까지 잘됩니다.

헌데 커널을 C언어로 작성한뒤 병합하니 이상하게도 boot.asm만 실행된다는 것입니다.

일단 개발환경부터 말씀드리자면 VM웨어에 우분투를 설치하여 작업중이며 테스트 또한 VM에 테스트중입니다.

원래 boot.asm과 kernel.asm은 아래와 같이 컴파일 하였습니다.

nasm -f bin -o boot.bin boot.asm nasm -f bin -o kernel.bin kernel.asm cat boot.bin kernel.bin > kernel.img

커널이 어셈으로 짜여졌을때는 매우 잘 동작 하였습니다.

헌데 C언어로 짠 커널 (ckernel.c라고 하겠습니다.)...

nasm -f bin -o boot.bin boot.asm gcc -c ckernel.c ld -e ckernel -Ttext 0x00 -e textout ckernel.c objcopy -R .comment -R .note -S -O binary ckernel.c ckerenl.bin cat boot.bin ckernel.bin > ckernel.img

이렇게 컴파일 하니 부트로더만 동작한다는 것입니다...

그러던중 알게된것이 엔트리 포인트입니다만 이것또한 저에겐 너무 와닿지 않는 개념인지라;;;

당췌 어찌 해야될지 모르겠습니다. 컴파일도 제대로 하고 있는게 맞는지; 엔트리 포인트를 제대로 찍은건지;

초보자라 설명도 중구난방입니다...첨부 파일을 보시면 바로 이해가 되실겁니다 -_-;;

몇주째 개고생중입니다. 제발 도와주십시오 ㅠ


2.답변 내용

안녕하세요, 커널을 만드시느라 고군분투하고 계시는군요. ^^

어셈블리어로 작성된 부트로더에서 C 언어로 작성된 32비트 커널로 점프하기 위해서는 크게 2가지가 필요합니다.

첫 번째는 스택입니다. 스택에 관련된 레지스터는 ESP와 EBP가 있는데, 1Mbyte 이하 영역중에서 마음에 드는 곳을 지정해주면 됩니다. 한가지 주의할 점은 스택은 아래로 자라기 때문에 레지스터에 설정하는 값이 스택 영역의 끝부분을 가리키고 있어야겠지요. boot.asm을 ESP는 초기화하여 스택은 만들어 놓으셨더군요. 그런데 EBP는 초기화 되어있지 않던데 EBP 레지스터도 ESP와 같은 값으로 초기화하면 좋을 것 같습니다. ^^;;;

두 번째는 엔트리 포인트입니다. 엔트리 포인트는 C 코드가 제어를 넘겨받았을 때 제일 처음 코드 수행을 시작해야 하는 부분을 나타냅니다. 만일 빌드 결과물이 리눅스의 ELF 파일 포맷이나 윈도우의 PE 파일 포맷 형식이라면 링커(LD)에 -e 옵션을 주어 엔트리 포인트를 지정해주는 것이 의미가 있습니다. 하지만, 지금은 커널을 만들고 있고 실제로 C 코드의 출력 결과물은 메타 정보 없이 코드/데이터만 들어있는 바이너리(Binary) 형식을 사용하고 있으니, 링커에서 지정해준 엔트리 포인트는 의미가 없습니다.

따라서 강제로 엔트리 포인트인 kernel_main() 함수를 부트로더가 점프하는 어드레스인 0x10000로 지정해줘야 합니다(kernel.c 파일을 보고 엔트리 포인트 함수가 저게 아닐까 생각했는데, 원하시는 함수가 있으시면 그걸로 선택하시면 됩니다 ^^). 저도 예전에 이 문제로 고민을 많이 했는데요, 해결방법은 아주 간단합니다. 컴파일러가 코드를 컴파일할 때 실제로 C 파일에 나열된 함수의 순서를 그대로 따릅니다. 그러니 엔트리 포인트로 사용할 함수를 C 파일에 가장 위쪽으로 옮겨주면 되겠지요. ^^

두 부분을 제외한 나머지는 제가 봤을 때 충분한 것 같네요. ^^ 부트로더에서 C 언어 커널로 점프하는 부분에 대한 더 자세한 내용이 궁금하시다면, 64비트 멀티코어 OS 원리와 구조 에서 7장을 참고하시면 됩니다. 엔트리 포인트에 대해서도 자세히 설명해 놓았으니 도움이 되실겁니다. ^^

그럼 파이팅입니다. ^^

ps) OS를 빌드하실 때 배치 파일이나 makefile을 이용하시면 좀더 편리하게 작업하실 수 있습니다. ;)

얼마 전 제가 쓴 64비트 멀티코어 OS 원리와 구조의 A/S건으로 보안 프로젝트 카페에 가입을 하게되었는데요, 배울 내용이 많아 종종 들러서 공부를 하고 있습니다(감사합니다. 보안 프로젝트 선배님들 ^^). 오늘도 아침에 일어나 애기가 자는 사이 뭐라도 배울 게 없나 훑어보고 있었는데요, 재미있는 내용을 발견했습니다.

Kioptrix » Downloads 2014-02-08 09-20-39

할만한 해킹 첼린지 문제라는 글인데요, kioptrix라는 사이트에서 제공하는 가상머신 이미지를 구동시켜 루트권한을 얻는 겁니다. 제가 이런 류의 첼린지에 좀 흥미가 있어서 관심있게 봤는데요, 혹시 저 말고도 관심있는 분들이 계실까봐 링크를 걸어둡니다. ^^

그럼 좋은 하루 되세요 ^^

ps) 사실 아직 다운로드 받아서 해본 건 아니라... 내용이 어떤 지는 잘 모릅니다. ㅠㅠ 애기가 푹 자는 저녁이나 해볼 수 있거든요 ㅠㅠ

제가 주로 들리는 블로그 리스트에 전규현님의 블로그(http://allofsoftware.net/)가 포함되어 있는데요, 오늘 굉장히 인상적인 글을 읽었습니다. 실리콘밸리 개발자 눈에 비친 한국 SW회사라는 글인데요, 좀 신선한 충격이 있어서 그 부분을 인용해봤습니다. 아래와 같은 부분인데요, UML 설계에 대신에 칠판에 그려서 사진으로 찍어 문서에 포함한다는 내용입니다. ^^)/~

B씨는 계속 얘기를 했다. 설계에 UML을 사용했는데 보통 UML은 필요가 없다. 우리는 대부분 칠판에 설계를 하다가 고치기를 반복한 후 사진을 찍어서 문서에 포함한다. 툴을 이용해서 다시 그리는 것은 시간 낭비다. 마지막 버전을 툴로 그리기도 하는데 정해진 툴도 없다. UML을 이용해서 쓸모도 없는 다이어그램을 잔뜩 만든 문서는 개발에 도움이 안되고 오히려 방해가 된다. 툴을 이용하면 칠판보다 고치기가 어렵고 다이어그램을 많이 그릴수록 고치는데 시간이 많이 들어가 바로 고칠 수가 없다. 또 A사 설계는 콤포넌트가 명확히 구분되어 있지 않아서 나눠서 협업하기 어려웠고 반대로 설계 내용은 너무 상세해서 오히려 비효율적이었다.

이전 회사에 있을 때 체계적인 소프트웨어 개발이 이슈가 되어 설계 문서 작성이 엄청 빡빡해진 적이 있는데요, UML로 요구사항 분석서를 작성한 뒤에 수정하기가 엄청 힘들어서 고생 많이 했거든요. ^^;;; UML 다이어그램이 한두 개도 아니고 일일이 마우스 커서를 움직여 수정하고 정렬하는 데 시간이 너무 걸리더라구요. 그래서 슈도코드를 작성하면 플로우차트를 그려주는 도구를 사용해서 중간에 좀 수월하게 작업하긴 했는데, 그 때 이런 방법을 알았다면 좀더 쉽게 작업할 수 있었을 텐데 말입니다. ^^;;;; (아니... 높으신 분들이 워낙 딱딱하신 분들이라 싫어했을지도.... 쿨럭..;;;)

앞으로 점점 더 나아지겠죠. ^^)/~ 

그럼 좋은 하루 되세요 ^^

64비트 멀티코어 OS 원리와 구조 세트가 출간된지 3년이 다 되어갑니다. 책에 대한 QnA 사이트가 필요해서 책 출간과 동시에 mint64os.pe.kr 사이트도 운영 중인데요, 지금까지 약 300개의 QnA가 달렸습니다. @0@)/~ (그중에 오탈자에 대한 문의도 다수 있다는 건 함정... 쿨럭..;;;)

<출처 - yes24.com>

질문에 대해서 답변을 달다보면 가끔 통찰력이 느껴지는 질문도 있는데요, 이런 질문들은 혼자보기가 아깝더라구요. ^^;;; 그래서 정리해서 공유하는게 어떨까하는 생각을 했습니다. 시간이 나는대로 틈틈이 정리해서 올려볼 예정이니 기대해주세요 >ㅁ<)/~

그럼 좋은 하루 되세요 ^^

마크다운(Markdown)으로 플리커 사이트(flickr.com)의 이미지 삽입하기

마크다운(Markdown)은 텍스트만 이용해서 구조적인 글을 쓰도록 도와주는 일종의 문법인데요, 저는 주로 개발 로그를 정리하거나 틈틈이 메모를 할 때 사용하고 있습니다. 물론 요즘은 블로그(kkamagui.tistory.com)에 글을 남길 때도 마크다운을 사용하고 있습니다. ^^;;;

마크다운을 처음 접하게 된 건 위키(Wiki) 때문이었는데요, 위키가 글을 엮기 편하고 문법 자체가 아주 간단해서 개발 로그를 남기는 데 그만이더라구요. 그래서 처음에는 설치형 위키인 도쿠 위키(Doku Wiki)를 썼는데요, 혼자 돌리기에는 왠지 무거운 느낌도 있고해서 위키패드로 갈아탔습니다. 위키패드를 써보니 기능도 만족스럽고 마음에 쏙 들더라구요. 그래서 위키패드로 글을 쓰기 시작하다가 위키 문법에 집착하게 되고, 이게 블로깅까지 이어지면서 결국 텍스트로 글쓰는 행위 자체에 집착하게 됐습니다. ㅠㅠ

마크다운을 즐겨 쓰시는 분들 중에는 저처럼 웹에 있는 위지윅(WYSWYG) 에디터가 불편한 분도 있으실 겁니다. 위지윅 에디터의 오류로 쓴 글이 날라가거나 굵게 한 글씨가 제대로 해제가 안되고 계속 굵게 나온다거나 하는 문제를 몇 번 겪고나니 의욕이 사그라들더라구요. ㅠㅠ 뭐, 마크다운으로 갈아탄 뒤에는 그런 일이 없어졌지만요. ^^)/~ 그래서 직접 글 쓰기 사이트(Writer's Note)도 만들어 쓰고 있습니다(개 밥 먹는 중이에요 ㅎㅎ).

제가 사실 이미지는 왠만하면 잘 안넣는데요, 그래도 가끔 필요한 경우가 있어서 제 티스토리 블로그(kkamagui.tistory.com)에 이미지를 올리고 그 링크를 가져와서 넣고 있습니다. 이미지를 많이 안 쓰다보니 별로 불편한 점을 모르고 있다가 오늘 문득 불편하다는 생각이 들더라구요. 그래서 어떻게 하면 좋을까 생각을 해봤는데, 플리커 같은 사이트에 블로깅용 이미지를 모아두고 링크를 거는 방법이 좋을 것 같더군요.

그런데 왠 걸~!! @0@)/~ 실제로 이미지를 올린 뒤에 링크를 아래처럼 걸어보니 정상적으로 표시되지 않는 겁니다. ㅠㅠ 분명히 플리커 사이트에서는 잘 표시되는데 말이죠. 한참을 고민하다가 저만 이런 문제를 겪는게 아닐 것 같아서 검색을 해봤더니~!! Wannabeman 님도 같은 문제로 문제를 겪으시다가 고생 끝에 찾은 방법을 공유해주셨더군요. 해결책은 markdown과-삽질한-하루에서 보실 수 있는데요, 결론만 말씀드리자면....

사진에서 공유 버튼을 누르면 .jpg로 끝나는 그림 링크가 나오는데요, 이 링크를 마크다운 문법으로 넣어주면 됩니다~!! >ㅁ<)~!!

마크다운으로 이미지를 삽입하는 방법은 사실 링크를 삽입하는 방법과 같은데, 차이점이라면 !를 앞에 붙여주는 정도입니다. 아래처럼 말이죠 ^^;;;

![이미지 대체 텍스트에요](http://farm6.staticflickr.com/5532/12181791906_1fd29764e7_o.jpg)

이미지 대체 텍스트에요

<이미지 출처-yes24.com>

아아... 진작 검색해볼 껄 그랬구요. ㅠㅠ 그래도 해결책을 찾았으니 다행이라는....

그럼 즐거운 하루 되세요 ^^

리눅스에서 gcc를 사용해서 코드를 컴파일하고 있는데, 뜬금없는 에러가 나왔습니다. 경고(Warning)를 에러(Error)로 취급해서 빌드를 멈춘다는 메시지였는데요, 아래와 같습니다.

cc1plus: all warnings being treated as errors

make[1]: *** 끝나지 않은 작업을 기다리고 있습니다....

사실 정확한 해결책은 경고(Warning)가 발생하는 코드를 수정하는 것이지만... 경고가 발행하는 곳이 한 두 군데가 아니라서 경고를 에러로 처리하는 옵션을 끄기로 했습니다. 사실 끄는 방법은 아주 간단한데요, gcc의 컴파일 옵션에 -Wno-error를 추가해주면 됩니다. 아래처럼 말이죠 ^^)/~

root> gcc -o a.elf -Wno-error a.c

Makefile을 이용해서 빌드한다면 CFLAG 옵션에다 추가하면 더 간단히 해결할 수 있습니다.

그럼 좋은 하루 되세요 ^^

+ Recent posts