커널 모듈(character 디바이스 드라이버) 프로그래밍중 궁금한 점입니다.

hitman7의 이미지

우선 아래와 같은 코드를 작성하였습니다.
(다른 부분의 코드들은 생략하였으며, 프로그램을 실행시키는데는 아무런 문제가 없었습니다. 커널은 2.4.20입니다.)

struct file_operations fops={
    .write=d_write
}
 
static ssize_t d_write(struct file* file,const char* buf,size_t length,loff_t* offset)
{
    printk(KERN_INFO "device write\n");
    return 0;
}

컴파일후 결과물을 insmod하고 디바이스 파일을 만들어 준후 아래와 같은 명령을 실행하면.

#echo "test" >> drv_test

device write 문자열이 무한 루프를 돌더군요.

궁금한점.
---------------------
1. write가 어떠한 방식으로 동작하기 때문에 무한 루프를 돌까요?
2. return 값을 바꾸면 1일때는 5번, 2일때는 3번, 3이상일 경우 2번의 문자열이 출력됩니다. 어떤 이유일까요?
3. write 함수의 두번째 인수인 const char* buf에서 왜 const 키워드를 붙일까요?

초보,중수,고수님들의 답변좀 부탁드리겠습니다.
머리가 나빠서인지 이런 궁금한점 때문인지 진도가 잘 안나아가 지네요. :)

cwryu의 이미지

d_write()에서 실제로 write한 길이만큼 리턴해야 합니다. 만약 그게 원데이터보다 적으면 앞부분만 실제로 write되었다고 생각하고 나머지를 다시 시도합니다. 그냥 디버깅중이면 length를 리턴하면 되겠네요.

hitman7의 이미지

감사합니다.

머리가 나빠서 다시 여러 문자열을 데이터를 넣어가면서 테스트 해보니 이해가 되는군요.

return 0 를 했을경우 답변처럼 write한것이 없다고 생각하게 됩니다. 즉 들어온 문자열이 "test"라면 총 5바이트가 들어왔는데 0바이트를 읽었으므로 다시시도를 합니다. 하드코딩으로 return 0를 해놓았기에 이번에도 재시도 되겠네요. 그러면서 무한루프...

return 1 을 했을경우 1바이트를 읽었으므로 총 5바이트에서 1바이트를 읽었으니 이러한 시도를 4번 더 하게 됩니다. 따라서 5번의 디버그 메시지 출력.

return 2 일 경우 2바이트 읽었으므로 5바이트에서 3바이트가 남고 또 2바이트를 읽었다고 하니 1바이트, 그리고 한번더 해서 3번의 디버그 메시지 출력.

ㅎㅎㅎ
머리나쁜사람은 이렇게 정리해야 되는거군요... :'(

far and hard way

익명사용자의 이미지

const를 함수에서 사용하는 것은 함수 내부에서 그 값이 바뀌지 않도록 보장하는 의미를 가진다고 하네요.

hitman7의 이미지

답글 감사합니다.

우선 3번은 put_user와 get_user를 헷갈려 했군요.
put_user의 경우 read에서 buf파라메터는 Destination이지만.
get_user의 경우 write에서 buf파라메터는 Source입니다.

즉 소스의 buf이므로 명기적으로 buf자체의 내용에는 변경이 없으므로 const 를 명기해 줍니다.

far and hard way

댓글 달기

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