시스템콜 관련 질문입니다.
#include <linux/kernel.h>
#include <linux/module.h>
#include <sys/syscall.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/time.h>
#include <linux/timer.h>
extern void *sys_call_table[];
asmlinkage int(* original_open)(const char *, int, int);
asmlinkage int(* original_close)(const char *, int, int);
asmlinkage int(* original_read)(unsigned int fd, char *buf, unsigned int count);
asmlinkage int(* original_write)(unsigned int fd, char *buf, unsigned int count);
asmlinkage int sys_our_open(char *fname, int flags, int mode){
printk("OPEN system_call is invoked\n");
return (original_open(fname, flags, mode));
}
asmlinkage int sys_our_close(char *fname, int flags, int mode){
printk("CLOSE system_call is invoked\n");
return(original_close(fname, flags, mode));
}
asmlinkage int sys_our_read(unsigned int fd, char *buf, unsigned int count){
printk("READ system_call is invoked\n");
return (original_read(fd, buf,count));
}
asmlinkage int sys_our_write(unsigned int fd, char *buf, unsigned int count){
printk("WRITE system_call is invoked\n");
return (original_read(fd, buf, count));
}
int init_module(){
original_open = sys_call_table[__NR_open];
original_open = sys_call_table[__NR_close];
original_read = sys_call_table[__NR_read];
original_write = sys_call_table[__NR_write];
sys_call_table[__NR_open] = sys_our_open;
sys_call_table[__NR_close] = sys_our_close;
sys_call_table[__NR_read] = sys_our_read;
sys_call_table[__NR_write] = sys_our_write;
return 0;
}
void cleanup_module(){
sys_call_table[__NR_open] = original_open;
sys_call_table[__NR_close] = original_close;
sys_call_table[__NR_read] = original_read;
sys_call_table[__NR_write] = original_write;
printk("--------bye---------\n");
}
==============================================
이렇게 코드를 작성했느데요..
컴파일후에 insmod로 모듈을 올리면
같은 메세지들이 계속 반복되서 나타나네요..
특히 write() 와 read() 가 계속해서 호출이 되는거 같아요...
printk 함수 호출 때문에 write 시스템콜이 재귀적으로 호출이 되어서 그러는거 같은데요...
이 경우 어떻게 해결을 하여야 하나요.
어떤 코드를 추가하여야 하는지 궁금합니다.
혹시 아시는 분 계시면 답변 부탁드려요.
아참..그리구요..close 시스템콜의 파라메터들이 open 시스템콜의 파라메터들과 같은가요? 위 소스처럼 하면 컴파일은 되긴 되는데요
insmod하면 close 시스템콜 때문에 에러메세지도 뜨네요..
이문제는 어떻게 해결하면 될까요?
그리구 마지막 질문은요..위 코드처럼 lseek 도 추가를 하고 싶은데
어떤 파라메터들을 적어야하는지 궁금합니다.
이런 시스템콜 관련해서 파라메터들이 잘 나온 글이 어디 없을까요..
부탁드립니다..
적어도 sys_our_write 에서는printk() 를 빼셔야
적어도 sys_our_write 에서는
printk() 를 빼셔야 될 것 같습니다...
그리고 함수의 원형은 아래와 같습니다.
[quote]컴파일후에 insmod로 모듈을 올리면 같은 메세지들
printk() 는 커널에서 제공하는 함수이므로 write 시스템콜을 재귀적으로 호출하지는 않구요
시스템에서 떠있는 응용프로그램에서 read()/write() 시스템콜은 빈번하게 사용하기 때문에 그런것입니다.
read()/write() 에 pid 값을 찍어보면 어떤 프로세스가 사용하는것인지 알수 있을것입니다.
from saibi
printk()
자세하게는 안 봐서 확실하지는 않지만...
printk() 코드를 봤을때는...
내부적으로 write 콜을 사용하더군요...
대강...console 에 메세지를 표시할때 사용하는듯..
sys_our_write 내부에서 printk() 를 사용할때
sys_call_table[__NR_write] 를 원래대로 돌려놓고
printk() 사용하고 다시 바꾸는..."꽁수" 를 써도 되지 않을까 싶습니다;;
P.S.) 그거..숙제죠..? =_=;;
Re: printk()
시스템콜의 write와는 다르죠.
https://nicesj.com
https://blog.nicesj.com
댓글 달기