커널 모듈 프로그래밍 관련.

yabaman의 이미지

어떤 하드웨어가 있는데요, 이 하드웨어 드라이버 모듈을 올리면 /dev/ 아래에 장치가 생성되고,

이 하드웨어를 사용할때는 장치에 대해서, open() system call 을 통해서, fd 를 얻고, ioctl / read / write 등을 통해서, 컨트롤을 하는데요,

user mode 에서는 기냥 open / ioctl / read / write / close 등을 통해서 제어를 하면 되는데, 이를 커널 모듈에서 사용 해야 할 일이 생겼습니다.

커널 모듈에서는 어떠한 방식으로 저것 들을 사용 할 수 있을까요?

kmalloc 이 있고, printk 등을 쓰고 하는 것으로 봐서는,
비슷한 방법으로 대체된 function 이 있을것도 같은데, 제가 이쪽 분야에 대해서 문외한이라서..

잘 아시는 분들의 도움 부탁드립니다. ^^;

kodol의 이미지

만약 user mode로 coding된 program을 kernel mode로 바꾸시는거라면

1. makefile에서 library를 제거하고 kernel의 최종 binary에 link되도록 object를 추가해주셔야하며
2. 각 file들에서 include file을 kernel source에 있는 include file들로 바꿔주셔야 합니다
3. 그리고 code중 open(), ioctl() 등을 driver에서 제공하는 function과 이름 및 parameter를 맞춰주셔야 합니다 ( system call 없이 바로 call하기 위함)

위 3가지를 하신다음에 compile하시고 compile 및 link error를 제거해나가시면 됩니다

그리 쉽지는 않지만 그렇다고 어려운 작업이 아니니 한번 해보세요

yabaman의 이미지

Quote:
3. 그리고 code중 open(), ioctl() 등을 driver에서 제공하는 function과 이름 및 parameter를 맞춰주셔야 합니다 ( system call 없이 바로 call하기 위함)

이 부분에 대해서 잘 모르겠습니다.

int 모듈명_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
int 모듈명_close(struct inode *inode, struct file *filp);
int 모듈명_open (struct inode *inode, struct file *filp);

이러한 함수들이 그쪽 드라이버 안에 존재 하긴 합니다만,
이것들을 어떻게 open() / close() / ioctl() 과 매칭 시킬 수 있을까요?

kodol의 이미지

int 모듈명_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
int 모듈명_close(struct inode *inode, struct file *filp);
int 모듈명_open (struct inode *inode, struct file *filp);

=>
int 모듈명_ioctl(unsigned int cmd, unsigned long arg);
int 모듈명_close();
int 모듈명_open ();

driver에서 위와같이 바꾸시고 kernel mode로 바꿀 code에서 함수를 call하는 방식을 사용하시면 됩니다

inode 및 flip은 어차피 file system에서 사용할 driver file 등을 나타내는것이고 user mode에서 system call을 이용하여 call할때 필요한 parameter입니다

yabaman의 이미지

말씀하신대로, 모듈명_open, 모듈명_close 부분은 filp 를 사용 하는 부분이 없어서 고쳐도 될 것 같습니다.

하지만, 모듈명_ioctl() 에서는,

Quote:
minor = MINOR(filp->f_dentry->d_inode->i_rdev);
for (i=0; i<minor; i++)
dev = dev->next;
pri = list_entry(dev->next, ... 생략 ... );

이런식으로 filp 에서 무엇인가 가져오고, 뒷 부분에 이를, 사용을 하는 부분이 있어서, 그렇게 고쳐도 될지 판단이 안서네요.

음, 그래서 검색하다 찾은것이, module 내에서 filp_open 을 통해서 파일을 여는 코드인데요, 드라이버를 사용할 모듈에서 module_init 시, filp_open 을 통해서 filp 를 얻어온 후,

드라이버를 사용할 때, 즉, 모듈명_ioctl 을 부를때 얻어온 filp 를 파라메터로 넘기는 방식으로 코드를 작성해도 될려나요?

그리고 kodol 님 답변 감사합니다. ^^;

kodol의 이미지

저는 사실 embedded 환경에서만 일하고 있고 file system을 다뤄본적이 없어서 yabaman님과 같이 할 경우에 제대로 될 지는 확신이 안서거든요..
해보시고 가능여부를 알려주시겠어요?

안되면 다른 방법을 의논하지요..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.