c언어는 header 찾는데 시간 다 걸리는 것 같다.
ctags 없으면, grep 으로 찾아야 하다니.. 정말 java와 IDE 툴인 eclipse와 idea는 정말 개발 환경이 좋아..


irq controller 관련 header
linux/include/asm/arch/irqs.h


linux/include/linux/irq.h 를 보면, 아래와 같이 include하는 것을 확인할 수 있다. 이 파일을 include 하면, 위에서 정의된 header파일을 include하는 것과 동일하다.
#include <asm/irq.h>





Posted by '김용환'
,

CPU 구성요소

c or linux 2011. 4. 20. 17:08

cpu 하면, 떠오르는것은 alu와 registers뿐.. 어떻게.. 엄청 까먹어..


정리함.

cpu 구성요소
1. 제어장치 (cu)
2. 산술논리연산(alu)
3. registers(메모리)
   - 범용 (GRP) : r0, r1, r2
   - 제어 (Control) : pc, sp
   - 상태 (Status)
4. 내부 버스
Posted by '김용환'
,


timer 예제


#include <asm/arch/irqs.h> // IRQ_OST1
#include <asm/hardware.h> // OIER_E1, ...
#include <asm/arch/pxa-regs.h>  // OIER, ...


/* TIMER */
#define OST1_TIMER_ON OIER |= OIER_E1; OSSR |= OSSR_M1; OSMR1 = OSCR+timerClkVal
#define OST1_TIMER_OFF OIER &= ~OIER_E1; OSSR |= OSSR_M1
#define SEC_CLK 3686400

static int timerPeriod=1, timerClkVal=1*SEC_CLK;


/* interrupt callback */
void ost1_interrupt(int irq, void *dev_id, struct pt_regs *regs) {
printk("os timer1 interrupt\n");
OST1_TIMER_OFF;
flag_ost1_int = 1;
}

int fnd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) {

       switch(cmd)
{

case 3 :
/* param : ioctl(fd, 3, timerPeriod); */
timerPeriod=arg;
timerClkVal=timerPeriod*SEC_CLK;
break;
default:
break;
}
return 0;
}


static int __init fnd_init(void) {

int result;
...
result = request_irq(IRQ_OST1, ost1_interrupt, SA_INTERRUPT, "fnd", NULL);
if (result != 0) {
printk("irq error");
return -1;
}
...

}




보드에서 insmod


[root@Xhyper255 /root]$insmod fnd.o
FND module is up...
FND_MAJOR = 253
[root@Xhyper255 /root]$
[root@Xhyper255 /root]$
[root@Xhyper255 /root]$mknod /dev/FND c 253 0




interrupt가 등록되었음을 확인할 수 있다. 19번으로 등록됨을 확인할 수 있다.

[root@Xhyper255 /root]$cat /proc/interrupts
  0:          0   eth0
  2:          0   GPIO 2-80
  3:          0   PXA USB core
  6:         42   AC97
 14:      15160   serial
 15:          9   MMC controller
 17:          0   DMA
 18:    2070369   timer
 19:          0   fnd
 25:          0   PXA PCMCIA CD
 27:          0   ads7843
 39:          0   PXA CF CD
Err:          0





fnd_app.c

/***************************************

 * Filename: fnd_app.c

 * Title: fnd Device Application

 * Desc: Implementation of system call

 ***************************************/

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <fcntl.h>


int main(void)

{

    int retn;

    int fd;


    int flag = 0;

    int menu;

short data, timerPeriod;

short fndValue;

    

    fd = open("/dev/FND", O_RDWR);

    printf("fd = %d\n", fd);

    

    if (fd<0) {

        perror("/dev/FND");

        exit(-1);

    }

    else

        printf("[APP]FND detected...\n");

    

    while(1)

    {

        printf("\n\n===== FND Test Program ====\n");

        printf(" 1. OSTimer_1 Interrupt Period Setting\n");

        printf(" 2. FND0 Read\n");

        printf(" 3. FND0 Write\n");

        printf(" 4. FND Clear\n");

        printf(" 0. Program Quit\n");

        do {

            printf(" Select Menu => ");

            scanf("%d", &menu);

        } while(menu<0 || menu>4);

        if(menu == 0) break;


        switch(menu) {

            case 1:

                printf("Input OSTimer_1 Int. Period Value(1~10) => ");

                scanf("%hd", &timerPeriod);

     ioctl(fd, 3, timerPeriod);

printf("\n[APP]OSTimer_1 Period Setting Done!!\n");

                break;

            case 2:

                printf("[APP]Wait OSTimer_1 Int...\n");

                read(fd, &data, sizeof(short));

printf("\n[APP]FND0 Value Read(%04x) Done!!\n", data);

                break;

            case 3:

                printf("Input FND0 Write Value(0~9) => ");

                scanf("%hd", &fndValue);

write(fd, &fndValue, sizeof(short));

printf("\n[APP]FND0 Value Write Done!!\n");

                break;

            case 4:

     ioctl(fd, 4, flag);

                break;

        }

    }


    close(fd);

    

    return 0;

}



 
실행결과 , 동작 잘됨


[root@Xhyper255 /root]$./fnd_app
fnd_open
fd = 3
[APP]FND detected...


===== FND Test Program ====
 1. OSTimer_1 Interrupt Period Setting
 2. FND0 Read
 3. FND0 Write
 4. FND Clear
 0. Program Quit
 Select Menu => 1
Input OSTimer_1 Int. Period Value(1~10) => 5
[FND_DD]ioctl(cmd:3)..

[APP]OSTimer_1 Period Setting Done!!


===== FND Test Program ====
 1. OSTimer_1 Interrupt Period Setting
 2. FND0 Read
 3. FND0 Write
 4. FND Clear
 0. Program Quit
 Select Menu => 2
[APP]Wait OSTimer_1 Int...
os timer1 interrupt
read data => 0000

[APP]FND0 Value Read(0000) Done!!


===== FND Test Program ====
 1. OSTimer_1 Interrupt Period Setting
 2. FND0 Read
 3. FND0 Write
 4. FND Clear
 0. Program Quit
 Select Menu =>



Posted by '김용환'
,



major number 가 10번인 misc에 대한 정보를 확인할 수 있다.

[root@linux2 proc]# cat /proc/misc
 63 device-mapper
175 agpgart
228 hpet
135 rtc




device driver 관점에서 봤을 때..
/proc는 체계적인 정보를 확인할 수 없다.

커널 2.6부터는 /sys 디렉토리가 있는데, 시스템 정보가 체계적으로 있다.

[root@linux2 class]# pwd
/sys/class
[root@linux2 class]# cd misc
[root@linux2 misc]# ls -al
합계 0
drwxr-xr-x   6 root root 0  4월 18 03:52 .
drwxr-xr-x  19 root root 0  4월 18 11:05 ..
drwxr-xr-x   2 root root 0  4월 18 03:52 agpgart
drwxr-xr-x   2 root root 0  4월 18 03:52 device-mapper
drwxr-xr-x   2 root root 0  4월 18 03:52 hpet
drwxr-xr-x   2 root root 0  4월 18 03:52 rtc

[root@linux2 misc]# cd rtc
[root@linux2 rtc]# ls -al
합계 0
drwxr-xr-x  2 root root    0  4월 18 03:52 .
drwxr-xr-x  6 root root    0  4월 18 03:52 ..
-r--r--r--  1 root root 4096  4월 20 14:35 dev
[root@linux2 rtc]# cat dev
10:135



sys파일 시스템은 안드로이드와 전력관리할 때 많이 사용되기도 한다고 한다..

'c or linux' 카테고리의 다른 글

CPU 구성요소  (0) 2011.04.20
[공부중] OS Timer 예제 - interrupt  (0) 2011.04.20
[공부중] 커널 타이머  (0) 2011.04.20
[공부중] minor number 기반으로 다루기  (0) 2011.04.20
[공부중] memory mapped / io mapped  (0) 2011.04.19
Posted by '김용환'
,



#include <linux/timer.h> 
static struct timer_list timer1;


void my_timer_func(unsigned long data) {
printk("my_timer_func");
FND_CS0 = fnd_val[data];
}


static int __init fnd_init(void) {
...
// kernel timer
init_timer(&timer1);
timer1.expires=jiffies + HZ * 4;
timer1.function = my_timer_func;
timer1.data = 5;
add_timer(&timer1);
...
}

static void __exit fnd_exit(void) {

unregister_chrdev(FND_MAJOR, "FND");
    printk("FND module is down...\n");
    
    
}

module_init(fnd_init);
module_exit(fnd_exit);




add timer의 의미는 kernel의 timer로 사용하도록 되어 있다.
중간에 timer가 도는 도중에 rm 을 하면 문제가 될 수 있다.
unregister 하기 전에 del_timer를 반드시 해야 한다.


static void __exit fnd_exit(void) {
del_timer(&timer1);
unregister_chrdev(FND_MAJOR, "FND");
    printk("FND module is down...\n");
    
    
}


테스트 - 5초 뒤에 timer가 호출되었다!!

[root@Xhyper255 /root]$insmod fnd.o
FND module is up...
FND_MAJOR = 253
[root@Xhyper255 /root]$my_timer_func  




계속 반복하게 하려면..

void my_timer_func(unsigned long data) {
....
//
timer1.expires=jiffies + HZ * 2;
add_timer(&timer1); 




여러개의 timer가 동작하는데, 하나의 handler에서 처리하게 하려면 argument인 unsigned long 타입인 data를 잘 이용하도록 하는 것이다.

커널에서 unsigned long 타입으로 사용하는 파라미터는 어떤 값인지 들어갈 수 있다는 것을 의미한다.

 
Posted by '김용환'
,

보통은 major number로 다루지만, tty 처럼 minor number 기반으로 처리해야 할 상황들이 있을 때 사용된다.

[root@linux2 my_parm]# tty
/dev/pts/4
[root@linux2 my_parm]# ls -al /dev/pts
합계 0
drwxr-xr-x   2 root root      0  4월 18 03:52 .
drwxr-xr-x  10 root root   5120  4월 19 11:39 ..
crw--w----   1 root tty  136, 1  4월 19 09:53 1
crw--w----   1 root tty  136, 2  4월 19 10:22 2
crw--w----   1 root tty  136, 3  4월 19 09:54 3
crw--w----   1 root tty  136, 4  4월 20 09:49 4
crw--w----   1 root tty  136, 5  4월 20 09:45 5
crw--w----   1 root tty  136, 6  4월 19 15:09 6

같은 major 번호와 다른 minor 번호를 가진다.


mintor 번호를 따로 가진다면, device driver를 따로 가져야 한다.
그렇다면.. 멀티테스킹에서 
write 함수는 minor 번호만큼 가지고 있어야 한다.
하나가지고 공통으로 쓰기 어려우니. minor 번호당 write 함수가 있어야 한다.



minor 기반으로 read/write/ioctl/open/release가 되는 함수를 만들어서 처리하게 하기..


#include <linux/module.h>

#include <linux/init.h>

#include <linux/kernel.h>

#include <linux/major.h>

#include <linux/fs.h>

#include <asm/uaccess.h>        //copy_to_user

#include <asm/io.h>             //outb, inb

#include <linux/delay.h>        //mdelay, udelay



#define FND 0xf1000000 


#define FND_CS0 (*((volatile unsigned short *)(FND))) 

#define FND_CS1 (*((volatile unsigned short *)(FND + 0x00100000))) 

#define FND_CS2 (*((volatile unsigned short *)(FND + 0x00200000))) 

#define FND_CS3 (*((volatile unsigned short *)(FND + 0x00300000)))


#define ADDR_FND_CS0 ((volatile unsigned short *)FND) 

#define ADDR_FND_CS1 ((volatile unsigned short *)(FND + 0x00100000)) 

#define ADDR_FND_CS2 ((volatile unsigned short *)(FND + 0x00200000)) 

#define ADDR_FND_CS3 ((volatile unsigned short *)(FND + 0x00300000)) 


static short fnd_val[] = {0x3f3f,0x0606,0x5b5b,0x4f4f,0x6666,0x6d6d,0x7c7c,0x2727,0x7f7f,0x6767};


static int FND_MAJOR = 0;


//int fnd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);


int fnd0_open (struct inode *inode, struct file *filp)

{

    printk("fnd0_open\n");

    MOD_INC_USE_COUNT;



    return 0;          /* success */

}


int fnd0_release (struct inode *inode, struct file *filp)

{

    printk("fnd0_close\n");

    MOD_DEC_USE_COUNT;

    return 0;

}


ssize_t fnd0_read (struct file *filp, char *buf, size_t count, loff_t *f_pos)

{

short data;


data = FND_CS0;

// equals

//data = inw(ADDR_FND_CS0);


printk("read data => %04x\n",data);

copy_to_user(buf, &data, count);


return(count);

}


ssize_t fnd0_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos)

{

int data;


copy_from_user(&data, buf, count);

printk("write data => %08x\n",data);


FND_CS0 = fnd_val[data];

// equals

//outw(fnd_val[data], ADDR_FND_CS0);


return(count);

}


int fnd0_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)

{

switch(cmd)

{

  case 10:  

printk("\n");

printk("cmd = 1\n");

FND_CS0 = 0x0000;

break;

default:

break;

}

return 0;

}


int fnd1_open (struct inode *inode, struct file *filp)

{

    printk("fnd1_open\n");

    MOD_INC_USE_COUNT;



    return 0;          /* success */

}


int fnd1_release (struct inode *inode, struct file *filp)

{

    printk("fnd1_close\n");

    MOD_DEC_USE_COUNT;

    return 0;

}


ssize_t fnd1_read (struct file *filp, char *buf, size_t count, loff_t *f_pos)

{

short data;


data = FND_CS1;

// equals

//data = inw(ADDR_FND_CS0);


printk("read data => %04x\n",data);

copy_to_user(buf, &data, count);


return(count);

}


ssize_t fnd1_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos)

{

int data;


copy_from_user(&data, buf, count);

printk("write data => %08x\n",data);


FND_CS1 = fnd_val[data];

// equals

//outw(fnd_val[data], ADDR_FND_CS1);


return(count);

}


int fnd1_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)

{

switch(cmd)

{

  case 10:  

printk("\n");

printk("cmd = 1\n");

FND_CS1 = 0x0000;

break;

default:

break;

}

return 0;

}



int fnd2_open (struct inode *inode, struct file *filp)

{

    printk("fnd2_open\n");

    MOD_INC_USE_COUNT;



    return 0;          /* success */

}


int fnd2_release (struct inode *inode, struct file *filp)

{

    printk("fnd2_close\n");

    MOD_DEC_USE_COUNT;

    return 0;

}


ssize_t fnd2_read (struct file *filp, char *buf, size_t count, loff_t *f_pos)

{

short data;


data = FND_CS2;

// equals

//data = inw(ADDR_FND_CS2);


printk("read data => %04x\n",data);

copy_to_user(buf, &data, count);


return(count);

}


ssize_t fnd2_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos)

{

int data;


copy_from_user(&data, buf, count);

printk("write data => %08x\n",data);


FND_CS2 = fnd_val[data];

// equals

//outw(fnd_val[data], ADDR_FND_CS2);


return(count);

}


int fnd2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)

{

switch(cmd)

{

  case 10:  

printk("\n");

printk("cmd = 1\n");

FND_CS2 = 0x0000;

break;

default:

break;

}

return 0;

}


int fnd3_open (struct inode *inode, struct file *filp)

{

    printk("fnd3_open\n");

    MOD_INC_USE_COUNT;



    return 0;          /* success */

}


int fnd3_release (struct inode *inode, struct file *filp)

{

    printk("fnd3_close\n");

    MOD_DEC_USE_COUNT;

    return 0;

}


ssize_t fnd3_read (struct file *filp, char *buf, size_t count, loff_t *f_pos)

{

short data;


data = FND_CS3;

// equals

//data = inw(ADDR_FND_CS3);


printk("read data => %04x\n",data);

copy_to_user(buf, &data, count);


return(count);

}


ssize_t fnd3_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos)

{

int data;


copy_from_user(&data, buf, count);

printk("write data => %08x\n",data);


FND_CS3 = fnd_val[data];

// equals

//outw(fnd_val[data], ADDR_FND_CS0);


return(count);

}


int fnd3_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)

{

switch(cmd)

{

  case 10:  

printk("\n");

printk("cmd = 1\n");

FND_CS3 = 0x0000;

break;

default:

break;

}

return 0;

}




void fnd_clear(void)

{

FND_CS0 = 0x0000;

FND_CS1 = 0x0000;

FND_CS2 = 0x0000;

FND_CS3 = 0x0000;

//mdelay(500);

}

/*

struct file_operations fnd_fops = {

    read:       fnd_read,

    write:      fnd_write,

    open:       fnd_open,

    ioctl:    fnd_ioctl,

    release:    fnd_release,

};

*/


struct file_operations minor0_fops =

{

read     : fnd0_read,

    write    : fnd0_write,

    open     : fnd0_open,

    release  : fnd0_release,

    ioctl    : fnd0_ioctl,

};


struct file_operations minor1_fops =

{

read     : fnd1_read,

    write    : fnd1_write,

    open     : fnd1_open,

    release  : fnd1_release,

    ioctl    : fnd1_ioctl,

};


struct file_operations minor2_fops =

{

read     : fnd2_read,

    write    : fnd2_write,

    open     : fnd2_open,

    release  : fnd2_release,

    ioctl    : fnd2_ioctl,

};


struct file_operations minor3_fops =

{

read     : fnd3_read,

    write    : fnd3_write,

    open     : fnd3_open,

    release  : fnd3_release,

    ioctl    : fnd3_ioctl,

};


int minor_open (struct inode *inode, struct file *filp)

{

    printk( "call minor_open\n" );

    printk("MINOR(inode->i_rdev) : %d\n", MINOR(inode->i_rdev));

    

    switch (MINOR(inode->i_rdev))

    {

    case 0: filp->f_op = &minor0_fops; break;

    case 1: filp->f_op = &minor1_fops; break;

    case 2: filp->f_op = &minor2_fops; break;

    case 3: filp->f_op = &minor3_fops; break;

    default : return -ENXIO;

    }


    if (filp->f_op && filp->f_op->open)

        return filp->f_op->open(inode,filp);


    return -2;

}


struct file_operations minor_fops =

{

    open     : minor_open,

};




static int __init fnd_init(void)

{

    int result;


    printk("FND module is up...\n");


    fnd_clear();    // H/W Initialization


    //result = register_chrdev(FND_MAJOR, "FND", &fnd_fops);

    result = register_chrdev(FND_MAJOR, "FND", &minor_fops);

    

    

    if (result < 0) {

        printk(KERN_WARNING " can't get major \n");

        return result;

    }

    if(FND_MAJOR == 0)

FND_MAJOR = result;


    printk("FND_MAJOR = %d\n", FND_MAJOR);

    return 0;

}


static void __exit fnd_exit(void)

{

unregister_chrdev(FND_MAJOR, "FND");

    printk("FND module is down...\n");

}


module_init(fnd_init);

module_exit(fnd_exit);





테스트 app

/***************************************

 * Filename: fnd_app.c

 * Title: fnd Device Application

 * Desc: Implementation of system call

 ***************************************/

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <fcntl.h>


int main(void)

{

    int retn;

    int fd;


    int flag = 0;

    int fnd_no, menu;

    char dev_name[100];

    

    

    while(1)

    {

        printf("\n\n===== FND Test Program ====\n");

        printf(" 0. FND0 Test\n");

        printf(" 1. FND1 Test\n");

        printf(" 2. FND2 Test\n");

        printf(" 3. FND3 Test\n");

        printf(" 4. Program Quit\n");

        do {

            printf(" Select Menu => ");

            scanf("%d", &fnd_no);

        } while(fnd_no<0 || fnd_no>4);

        if(fnd_no == 4) break;


        while(1)

        {

            printf("\nFND%d Test...\n", fnd_no);

            do {

                printf("Select(0.0_print,1.1_print, ...,9.9_print,10.clear,11.Quit) => ");

                scanf("%d", &menu);

            } while(menu<0 || menu>11);

            if(menu == 11) break;

    

            sprintf(dev_name, "/dev/FND%d", fnd_no);

            fd = open(dev_name, O_RDWR);

            if (fd<0) {

                perror(dev_name);

                exit(-1);

            }

            else printf("/dev/FND%d detected(fd:%d)...\n", fnd_no, fd);

    

      if (menu == 10)  {

       ioctl(fd, menu, flag); // clear

      }

      else { // menu is 4byte(int)

       write(fd, &menu, sizeof(menu));

      }


            close(fd);

        }

    }

    

    return 0;

}


 

Makefile 

CC      = arm-linux-gcc

INCLUDEDIR = /root/linux/include

#CFLAGS += -D__KERNEL__ -DMODULE -I$(INCLUDEDIR) -Wall -O

CFLAGS += -D__KERNEL__ -DMODULE -I$(INCLUDEDIR) -Wall -march=armv4 -DMODULE


#CFLAGS += -D__KERNEL__ -I$(INCLUDEDIR) -Wall -Wstrict-prototypes \

#            -Wno-trigraphs -Os -mapcs -fno-strict-aliasing -fno-common \

#           -fno-common -pipe -mapcs-32 -march=armv4 -Wa,  -mtune=strongarm \

#           -mshort-load-bytes -msoft-float -DMODULE



TARGET = fnd

OBJS = $(TARGET).o



All: $(TARGET).o $(TARGET)_app


$(TARGET).o: $(TARGET).c

    $(CC) $(CFLAGS) -c -o $(OBJS) $(TARGET).c


$(TARGET)_app : $(TARGET)_app.c

    $(CC) -o $(TARGET)_app $(TARGET)_app.c


clean :

    rm -rf *.o $(TARGET)_app





보드에서 커널 모듈 등록
 


[root@Xhyper255 /root]$insmod fnd.o
FND module is up...
FND_MAJOR = 253



[root@Xhyper255 /root]$mknod /dev/FND0 c 253 0
[root@Xhyper255 /root]$mknod /dev/FND1 c 253 1
[root@Xhyper255 /root]$mknod /dev/FND2 c 253 2
[root@Xhyper255 /root]$mknod /dev/FND3 c 253 3
[root@Xhyper255 /root]$ls -al /dev/FND*
crw-r--r--    1 root     root     253,   0 Jan  1 00:14 /dev/FND0
crw-r--r--    1 root     root     253,   1 Jan  1 00:14 /dev/FND1
crw-r--r--    1 root     root     253,   2 Jan  1 00:14 /dev/FND2
crw-r--r--    1 root     root     253,   3 Jan  1 00:14 /dev/FND3




실행코드


[root@Xhyper255 /root]$./fnd_app


===== FND Test Program ====
 0. FND0 Test
 1. FND1 Test
 2. FND2 Test
 3. FND3 Test
 4. Program Quit
 Select Menu => 0

FND0 Test...
Select(0.0_print,1.1_print, ...,9.9_print,10.clear,11.Quit) => 1
call minor_open
MINOR(inode->i_rdev) : 0
fnd0_open
/dev/FND0 detected(fd:3)...
write data => 00000001
fnd0_close

FND0 Test...
Select(0.0_print,1.1_print, ...,9.9_print,10.clear,11.Quit) => 11


===== FND Test Program ====
 0. FND0 Test
 1. FND1 Test
 2. FND2 Test
 3. FND3 Test
 4. Program Quit
 Select Menu => 3

FND3 Test...
Select(0.0_print,1.1_print, ...,9.9_print,10.clear,11.Quit) => 8
call minor_open
MINOR(inode->i_rdev) : 3
fnd3_open
/dev/FND3 detected(fd:3)...
write data => 00000008
fnd3_close

FND3 Test...
Select(0.0_print,1.1_print, ...,9.9_print,10.clear,11.Quit) =>



와우 겁나 잼있다..


ioctl의 cmd 부분은 실제로는 다르게 사용되고 있다.
cmd의 구성은 구분번호, 매직번호, 데이터 크기. 읽기 쓰기 구분으로 나눠서 argument를 전달 할 수 있다. 

 
Posted by '김용환'
,




memorymapped 는 메모리 주소
iomaped는 포트로 어드레스 매핑

write는 보통 메모리 access
in/out은 보통 IO access

그러나 커널에서 아무거나 쓸 수 있도록 관리되어 있다.
내부는 cpu dependent 하게 되어 있다.



Posted by '김용환'
,

device 목록 보고

c or linux 2011. 4. 19. 17:12


리눅스의 모든 드라이버는 major number로 구분되어 사용되어야 한다.
 
 [root@linux2 my_parm]# cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  6 lp
  7 vcs
 10 misc
 13 input
 14 sound
 29 fb
116 alsa
128 ptm
136 pts
180 usb
216 rfcomm
254 내가 등록한 것. 

Block devices:
  1 ramdisk
  2 fd
  8 sd
  9 md
 22 ide1
 65 sd
 66 sd
 67 sd
 68 sd
 69 sd
 70 sd
 71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp





커널 소스 밑에 있는 Documentation/devices.txt 파일을 보면, 예약된 디바이스 목록을 볼 수 있다.

 예약하지 않은 번호는 60-63, 120-127, 240-254이다.
 
Posted by '김용환'
,

그동안 이걸 몰라서, tar zxvf ... 하고, mv 명령어를 이용했는데. 굳이 그럴 필요가 없었다...

tar zxvf aaa.tar.gz -C ~/tmp
Posted by '김용환'
,

아래 싸이트에서 리눅스 커널에 대해서 소스 검색이 가능하다..

http://lxr.linux.no



 
Posted by '김용환'
,