시스템콜 관련 질문입니다.

aceforever의 이미지

#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 도 추가를 하고 싶은데
어떤 파라메터들을 적어야하는지 궁금합니다.
이런 시스템콜 관련해서 파라메터들이 잘 나온 글이 어디 없을까요..

부탁드립니다..

pastime의 이미지

적어도 sys_our_write 에서는

printk() 를 빼셔야 될 것 같습니다...

그리고 함수의 원형은 아래와 같습니다.

asmlinkage long sys_close(unsigned int fd);

asmlinkage off_t sys_lseek(unsigned int fd, off_t offset, unsigned int origin);
new5244의 이미지

Quote:
컴파일후에 insmod로 모듈을 올리면

같은 메세지들이 계속 반복되서 나타나네요..
특히 write() 와 read() 가 계속해서 호출이 되는거 같아요...
printk 함수 호출 때문에 write 시스템콜이 재귀적으로 호출이 되어서 그러는거 같은데요...
이 경우 어떻게 해결을 하여야 하나요

printk() 는 커널에서 제공하는 함수이므로 write 시스템콜을 재귀적으로 호출하지는 않구요
시스템에서 떠있는 응용프로그램에서 read()/write() 시스템콜은 빈번하게 사용하기 때문에 그런것입니다.
read()/write() 에 pid 값을 찍어보면 어떤 프로세스가 사용하는것인지 알수 있을것입니다.

from saibi

kslee80의 이미지

자세하게는 안 봐서 확실하지는 않지만...
printk() 코드를 봤을때는...
내부적으로 write 콜을 사용하더군요...
대강...console 에 메세지를 표시할때 사용하는듯..

sys_our_write 내부에서 printk() 를 사용할때
sys_call_table[__NR_write] 를 원래대로 돌려놓고
printk() 사용하고 다시 바꾸는..."꽁수" 를 써도 되지 않을까 싶습니다;;

P.S.) 그거..숙제죠..? =_=;;

sjpark의 이미지

kslee80 wrote:
자세하게는 안 봐서 확실하지는 않지만...
printk() 코드를 봤을때는...
내부적으로 write 콜을 사용하더군요...
대강...console 에 메세지를 표시할때 사용하는듯..

sys_our_write 내부에서 printk() 를 사용할때
sys_call_table[__NR_write] 를 원래대로 돌려놓고
printk() 사용하고 다시 바꾸는..."꽁수" 를 써도 되지 않을까 싶습니다;;

P.S.) 그거..숙제죠..? =_=;;

시스템콜의 write와는 다르죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.