Vimdiff 사용법

from Linux 2010/01/21 14:55

linux에서 (거의) 기본적으로 제공하는 vim 을 이용하면 diff 툴을 사용할 수 있다.
vimdiff 로 실행가능하고 vim 에서 -d 옵션을 사용해서 사용할 수도 있다.

간단한 사용법은 다음을 참고하자.
http://amjith.blogspot.com/2007/07/visual-diff-tools-in-linux.html

정리하면,
do - 다른 윈도우의 변경 사항을 현재 윈도우로 가져오기
dp - 현재 윈도우의 변경 사항을 다른 윈도우로 넣기
]c - 다음 변경 사항으로 이동
[c - 이전 변경 사항으로 이동
Ctrl W + Ctrl W - 다른 윈도우로 이동

다른 윈도우로 이동할 때는 Ctrl + W <방향키> 를 이용할 수도 있다.

Tag // diff, vim, vimdiff

Linux 커널 패치 만들기

from Linux 2010/01/20 17:28
다음을 참고하라
http://wiki.kldp.org/wiki.php/SubmittingPatches

# diff -uprN linux-2.6.29 linux-2.6.29.org > patch

이전에 사용하던 것과 다른 SCM 도구를 사용할 때 항상 용어와 개념의 차이 때문에 애를 먹는다.
난 SVN이 익숙한데, GIT를 사용하려니 애를 먹는다. 이럴 때 볼만한 좋은 글.

Git - SVN Crash Course

If you are just after tracking someone else's project, this get you started quickly:

git clone url
git pull
svn checkout url
svn update

글의 거의 맨 처음에 나온 저 글 하나로 이 글이 어떤 글인지 알 수 있을 듯 하다.

커널에 관련해서 소스를 뒤지거나 Kernel Tree 안의 Documents들을 참조하는 일이 잦아졌다. 내 피씨(의 하드디스크)가 매우 느린 관계로 I/O 부하를 좀 줄이고자 웹사이트를 자주 뒤지는 편이다. 다음 두 개가 좀 편하다. 다른 건 나중에 추가!

Kernel Source : http://lxr.linux.no
Kernel Documents : http://www.mjmwired.net/kernel/Documentation/

Kernel의 Booting Parameter 넘기는 부분을 알고 싶어서 본 글
Booting ARM Linux : http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html

Linux Device Driver 중 Character device 의 코드를 보면 기존의 2.6 기준으로 수정되지 않은 코드들은 register_chrdrv() 함수를 사용하여 Character device를 등록하도록 되어 있다. register_chrdrv 함수의 원형은 다음과 같다.

int register_chrdev(unsigned int major, const char *name,
      const struct file_operations *fops)

그러나 2.6의 디바이스 드라이버들은 이와 다른 방식을 사용한다. register_chrdrv를 사용하는 방식은 Linux device driver 개정 3판을 보면 3장의 "예전 방식"이라는 부분에서 이를 다룬다. 예전 방식이 아닌 새로운 방식으로 작성하려면 register_chrdev 대신 register_chrdrv_region/alloc_chrdev_region 과 cdev_init, cdev_add 로 작성하면 된다.

register_chrdrv_region 함수는 원하는 디바이스의 번호를 미리 알고 있을 때 사용하고, alloc_chrdev_region 함수는 디바이스의 번호를 동적으로 할당받아 파라미터로 받는 dev_t 구조체 포인터를 이용해 dev_t 구조체에 넣는다.
register_chrdrv 대신 register_chrdrv_region을 사용하는 것으로 혼동할 수 있는데 그게 아닌 cdev_add 함수까지 사용하여야 한다. 실제 커널 소스의 register_chrdrv 함수를 보면 이런 과정이 구현되어 있음을 볼 수 있다.
cdev_add 함수를 사용하기 위해서는 struct cdev 구조체를 사용하여야 하는데 이 구조체를 초기화 시켜주는 함수가 cdev_init 이다. struct cdev 구조체 등을 사용하려면 <linux/cdev.h> 를 include하여야 한다. 다음은 사용 예이다.

#include <linux/kernel.h>
#include <linux/cdev.h>
#include <linux/fs.h>

...
struct file_operations dasom_fops;

static struct cdev dasom_cdev = {
    .owner = THIS_MODULE,
    .ops = &dasom_fops,
};

int _init dasom_init(void)
{
    dev_t dev;
    int err = 0;

    if(major) {
        dev = MKDEV(major, minor);
        err = register_chrdev_region(dev, 1, "dasomoli");
    } else {
        err = alloc_chrdev_region(&dev, mior, 1, "dasomoli");
        major = MAJOR(dev); 
    }
    if(err < 0) {
        err = -ENODEV;
        return err;
    }
    ...
   
    cdev_init(&dasom_cdev, &dasom_fops);
    dasom_cdev.owner = THIS_MODULE;
    dasom_cdev.ops  = &dasom_fops;

    if(cdev_add(&dasom_cdev, dev, 1)) {
        printk(KERN_INFO"dasom: cdev creation failed.\n");
        err = -ENODEV;
        goto error_label;
    }
   
    ...
   
    return 0;
   
error_label:
    return err;
}