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 <방향키> 를 이용할 수도 있다.
다음을 참고하라
http://wiki.kldp.org/wiki.php/SubmittingPatches
http://wiki.kldp.org/wiki.php/SubmittingPatches
# diff -uprN linux-2.6.29 linux-2.6.29.org > patch
이전에 사용하던 것과 다른 SCM 도구를 사용할 때 항상 용어와 개념의 차이 때문에 애를 먹는다.
난 SVN이 익숙한데, GIT를 사용하려니 애를 먹는다. 이럴 때 볼만한 좋은 글.
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 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하여야 한다. 다음은 사용 예이다.
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>
...
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;
}
#include <linux/cdev.h>
#include <linux/fs.h>
...
struct file_operations dasom_fops;
static struct cdev dasom_cdev = {
.owner = THIS_MODULE,
.ops = &dasom_fops,
.owner = THIS_MODULE,
.ops = &dasom_fops,
};
int _init dasom_init(void)
{
dev_t dev;
int err = 0;
{
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;
}
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;
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;
}




이올린에 북마크하기