커널 유저공간의 데이터 카피에 대해 질문이있습니다.

kim1158의 이미지

프로그래밍 게시판엘 몇일전 올렸던 질문인데 답을 얻지못해서
이곳에 다시 올립니다.

보통 copy_to_user,copy_from_user 같은 함수로
커널영역과 유저영역에 값을 주고받지 않습니까?
그런데 return 값일 경우에는 커널 유저공간의 구분이 없이(위같은
함수를 호출하지 않고요) 그냥 동일 영역에 있는것처럼 값을 받을수가 있네요.
어떻게 이게 가능한지 조언좀 부탁드립니다^^.

음 그러니까.
아래와 같은 코드가있다고 할때요. getbuf는 커널쪽 시스템콜이고요

유저영역 프로그램
main()
{
char* buf = (char*)malloc(100);
int size = getbuf(buf);
}

커널영역 시스템콜getbuf
int getbuf(char* buf)
{
int size;
char data[100];
..
..
..
data 값을 구해서 buf에 넣는다.
size = copy_to_user(buf,data,size)
return size;
}

유저영역의 버퍼 buf에 값을 커널쪽에서 채우려면 copy_to_user를
써주잖아요. 그런데 리턴값은 그런 함수가 없이도 그냥 받습니다.
더 흔한예로 fopen() 을 하면 open() 시스템콜이 안에서 호출되고 fd값이
리턴되잖아요. 그것도 커널쪽에서 값이 정해져서 결국 유저쪽으로 리턴되는건데
copy_to_user()같은 메소드가 없이 일반 코드 return 문만으로 유저영역으로
값을 넘겨주네요.
조언 부탁드려요-

valor의 이미지

일단 copy_to/from_user는 전달된 pointer를 이용하여 전송을 하기 위한 것입니다. 그러니까 pointer로 지정된 user 영역의 데이터들을 kernel 영역으로 옮기거나 옮겨오는 것이지요. 그리고 pointer는 argument 값으로 전달되겠지요.

반면 return 값이나 argument값은 그 자체로 전달되는 값입니다.

copy_to_user를 하기 위해서 user 영역에서 pointer를 전달하지요? 그러면 그 pointer는 어떻게 전달이 되겠습니까...

argument인 pointer는 argument로서 그대로 전달이 됩니다. return 값도 마찬가지구요.

답변이 되려나... :?:

halite의 이미지

copy_to_user 등과 같은 함수는 양이 큰 것을 복사할 때 사용하는 경우가 대부분이죠.

return 값은 인텔 시스템의 경우 보통 32bit 내의 값을 전달합니다. 또 이 값은 레지스터를 사용해 전달되기 때문에 coy_to_user와 같은 것이랑은 상관 없습니다.

간단히 말하면 return 되는 값은 copy_to_user에 사용되는 개념이랑은 별 상관 없는 것이라 봐야겠죠.

댓글 달기

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