꺄뜨르 2011. 5. 11. 19:55


Kernel 에서제공하는함수중kernel programming에자주사용되는함수는다음과같이분류할수있다.

Port I/O
Interrupt
Memory
Synchronization
Kernel message 출력
Device Driver register

--------------------------------------------------------------------------------

I/O device 와data를주고받기위한함수들
void insb(unsignedport, void *addr, unsigned long count)
Port에서count bytes를읽어서메모리의addr주소부터저장
void insw(unsignedport, void *addr, unsigned long count)
Port에서16bit * count 만큼읽어서메모리의addr주소부터저장
void insl(unsignedport, void *addr, unsigned long count)
Port에서32bit * count 만큼읽어서메모리의addr주소부터저장
void outsb(unsignedport, void *addr, unsigned long count)
Memory의addr번지에서부터count bytes를읽어서port에쓴다.
void outsw(unsignedport, void *addr, unsigned long count)
Memory의addr번지에서부터count * 16bit를읽어서port에쓴다.
void outsl(unsignedport, void *addr, unsigned long count)
Memory의addr번지에서부터count * 32bit를읽어서port에쓴다.
Pausing I/O
입출력이너무빠르면device에서처리할수없는경우가발생할수있기때문에한번의입출력후잠시멈추어줄수있다.
앞에설명한함수의이름뒤에‘_p’를붙인이름의함수로구현되어있다.
예) inb() 함수의경우inb_p()

//아마도 요 함수들도 중요할듯

인터럽트의설정및처리에관한함수(or 매크로)
cli()/sti()
clear/set interrupt enable
save_flags(unsigned long flag), restore_flags(unsigned long flag)
status register의내용을저장하고복원
save_flags(), restore_flags() 두매크로는같은함수안에서호출되어야한다. flag를다른함수로pass해서는안된다.
intrequst_irq(unsignedintirq, void (*handler)(int),unsignedlong flags, const char *device)
커널로부터IRQ를요청하고, 이IRQ에대한interrupt handler를install
void free_irq(unsignedintirq)
request_irq()에서획득한irq를반납함


Kernel에서동적메모리를할당할때사용하는함수들
void * kmalloc(unsignedintlen, intpriority)
커널메모리할당. 128~131056byte까지가능
priority:GFP_BUFFER, GFP_ATOMIC, GFP_USER, GFP_KERNEL
물리적으로연속적인메모리를할당한다.
void kfree(void*obj)
kmalloc()에서할당받은커널메모리를반납
void * vmalloc(unsignedintlen)
커널메모리할당
크기제한없음
가상주소공간에서연속적인메모리영역을할당
void vmfree(void*addr)
vmalloc()에서할당받은커널메모리를반납

사용자공간과커널공간사이에데이터를공유하기위한함수
unsigned long copy_from_user(void *to, const void *from, unsigned long n)
사용자주소공간에서n byte만큼data 복사.
unsigned long copy_to_user(void *to, const void *from, unsigned long n)
사용자주소공간에n byte만큼data 복사
void * memset(void*s, char c, sizt_tcount)
메모리s에c를count만큼복사
put_user(datum,ptr) / get_user(ptr)
사용자공간에datum을전달하거나가져오기위한매크로

동기화
void sleep_on(structwait_queue **q)
q의번지를event로sleep하며, uninterruptible
void sleep_in_interruptible(structwait_queue **q)
q의번지를event로sleep하며, interruptible
void wake_up(structwait_queue **q)
sleep_on(q)에의해sleep한task를wakeup
void wake_up_interruptible(structwait_queuq**q)
sleep_on_interruptible(q)에의해sleep한task를wakeup

Standard out 으로메시지를출력하기위한함수
printk(constchar *fmt,….)
printf의커널버전
printk(LOG_LEVEL_ message)
LOG_LEVEL:KERN_EMERG, KERN_ALERT, KERN_ERR,KERN_WARNING, KER_INFO, KERN_DEBUG

printk(“<1>Hello, World”);
printk(KERN_WARNING”warning…\n”);
 
Device Driver register
intregister_xxxdev
(unsigned intmajor, const char *name,structfile_operations *fops)
character/block driver를xxxdev[major]에등록
xxx:blk/chr
intunregister_xxxdev(unsignedintmajor, const char *name)
xxxdevs[major]에등록되있는device driver를제거
intregister_netdev(constchar *name)
intunregister_netdev(constchar *name)
MAJOR(kdev_tdev)/MINOR(kdev_tdev)
장치번호dev로부터major/minor 번호를구함