커널에서 kmalloc() 로 선언했을시...

emptysky의 이미지

커널 모드에서 (커널모듈 프로그래밍시) 그냥 char my_buf[50]; 선언했을때
커널 공간의 스택에 my_buf[] 의 공간이 생기는게 맞는건가요?
그렇다면 커널 모듈프로그래밍에서 kmalloc()으로 메모리공간을 할당받는다는
말은 커널메모리공간(가상4G중의 1G 커널영역)의 힙영역에 공간을 잡는것인가요?

모듈 프로그래밍을 할때 변수의 메모리차지영역의 대한 개념이 정말 헷갈리는군요
일반 C프로그래밍과 같은 개념일뿐 단지 그 공간대상이 커널메모리 공간이다...<- 이 개념이 맞는건지 궁금하네요
명쾌한 답변 부탁드립니다. (__)끄뻑~

jyj9782의 이미지

kmalloc 라는 함수라는게, 커널함수잖아요..
그럼 사용자 공간의 메모리를 사용하지 않을거에요..
커널메모리를 할당하는 함수인만큼.. 글니까..
아마도.. 제가 요즘 공부중인데요.. 각 PL(권한 수준)에 따라서요... 페이지 권한요.. ^^ 수준에 따라서..
유저페이지는 3이라는 값을 갖고.. 커널페이지는 0이라는 값을 갖거든요.. 1 2 는 잘안쓰이고요..
이 페이지중에 커널모듈이란게 커널모드에 접근하기위한 수단이니까.. kmalloc 로 할당받으면 마지막 1gb 중에 힙영역으로 할당받을거 같네요 ? =.=
각 페이지마다 코드 세그먼트, 스택세그먼트, 힙세그먼트 같은게 있을수 있으니까요.. 아마도 분명한건 커널메모리공간에다가.. 잡는다는 사실이에요.. =.=a 보충바람..

힘내세요.

hb_kim의 이미지

blackkey wrote:
커널 모드에서 (커널모듈 프로그래밍시) 그냥 char my_buf[50]; 선언했을때
커널 공간의 스택에 my_buf[] 의 공간이 생기는게 맞는건가요?

네.

blackkey wrote:
그렇다면 커널 모듈프로그래밍에서 kmalloc()으로 메모리공간을 할당받는다는
말은 커널메모리공간(가상4G중의 1G 커널영역)의 힙영역에 공간을 잡는것인가요?

네.

http://wiki.kldp.org/wiki.php/DocbookSgml/KernelAnalysis-HOWTO#LINUX_MEMORY_MANAGEMENT

blackkey wrote:
모듈 프로그래밍을 할때 변수의 메모리차지영역의 대한 개념이 정말 헷갈리는군요
일반 C프로그래밍과 같은 개념일뿐 단지 그 공간대상이 커널메모리 공간이다...<- 이 개념이 맞는건지 궁금하네요
명쾌한 답변 부탁드립니다. (__)끄뻑~

굳이 메모리 관리의 개념을 알아야 모듈 프로그래밍을 할수 있는것은 아니니 너무 걱정하지 않으셔도 됩니다. 현재 작성중인 모듈에서 일반적인 주의 사항을(스택 사용은 최소로, 메모리 할당은 적정수준에서) 지킬수 있다면 별 문제 없습니다.

굳이 이해하지 않고서는 찜찜하다 싶으시면 관련 서적을 참조하시면서 커널 소스를 보시면 되지만, 권장하지 않습니다.

ahgod의 이미지

hb_kim wrote:
blackkey wrote:
커널 모드에서 (커널모듈 프로그래밍시) 그냥 char my_buf[50]; 선언했을때
커널 공간의 스택에 my_buf[] 의 공간이 생기는게 맞는건가요?

Yes and No.
No : 유저모드에서 시스템 콜을 이용해서 모듈에 있는 함수까지 호출된 경우 그냥 유저 프로세스의 스택을 사용합니다.
Yes : 인터럽트 서비스 루틴의 경우 관련된 프로세스가 없고, 커널 프로세스의 스택을 씁니다.

여기서, 유저모드에서 시스템 콜을 이용했다고 해서 반드시 유저 프로세스의 스택을 사용하는 것은 아니라고 알고 있습니다. ^^*

새해 복 많이 받으세요~~

jyj9782의 이미지

메모리 할당하시고 주소를 프린터해보시면되겠네요
char buf[50];
char *kbuf;

kbuf = kmalloc(sizeof(buf), 뭐시기);
printk("buf=%p kbuf=%p\n", buf, kbuf);

하하 ^^ 답장올려주세요..해보시고..

힘내세요.

jyj9782의 이미지

리눅스는요.. ^^ flat 메모리 모델을 써서요..
커널 영역이 아시다시피.. 끝자락에 스택 탑부분..
+1되는 지점..

0xc0000000 ~ 0xffffffff 인가 까지에요 ^^
그래서 4기가중 마지막 1기가인데요..

저 vmalloc 랑.. kmalloc 인가하는 메모리 할당함수는.. 커널 용 함수인만큼 커널에 공간을 할당해요 ^^

응.. 그러니까..

커널 스택/ 커널 힙/ 커널 코드.. 공간이 다 있는거죠 ^^ 사용자 공간처럼.. 그래서.. 아래 결과를 얻었어요

buf=c6877f20 kbuf=c7662090 kbuf2=c7662120

전부 커널영역에 할당되었죠 ?

뒤에 두개는 kmalloc로 100할당한거에요..

앞에는 배열로 할당한거고..

#define MODULE
#define __KERNEL__

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mm.h>

int init_module(void){
char buf[40];
char *kbuf;
char *kbuf2;

kbuf = (char *)kmalloc(100, GFP_KERNEL);
kbuf2 = (char *)kmalloc(100, GFP_KERNEL);

printk("buf=%p kbuf=%p kbuf2=%p\n", buf, kbuf, kbuf2);

kfree(kbuf);

return 0;
}

void cleanup_module(void){
}

이제 =.= 사용자 공간에 할당된다는 말씀은 안하시겠죠 ?
사용자 공간에서 힙영역에 할당하기위해서는..

사용자용 c라이브러리인 /usr/include/malloc.h
안에 있는 malloc 함수를 써야하는데..

이거는.. 커널영역으로 올라가는.. 곳에서는 쓸수 없죠..

넹.. 커널 메모리 할당하는겁니다..

앞으로 질문 자주 올려주세요.. 공부좀 하고 싶네요 ㅎㅎ

힘내세요.

hb_kim의 이미지

다른분들이 지적하신게 맞습니다. 제가 틀리게 답변한 부분은 수정했습니다.

유저 모드에서 시스템 콜을 호출하는 경우에, 소프트웨어 인터럽트를 통해서 호출되므로 그때 커널 모드 스택으로 전환이 되겠죠.

emptysky의 이미지

네...
여러님들이 올려주신 명쾌한 답변들 잘 보았습니다.
모든 분들께 감사하네요 ^^

새 해 복 많이 받으세요 (__)~ 꾸뻑

『 아픔은.. 아픔을 달래줄 약이 무엇인지 알면서도 쓰지 못할 때 비로소 그 아픔의 깊이를 알수가 있음이다. 』
『 for return...』

ahgod의 이미지

ahgod wrote:
Yes and No.
No : 유저모드에서 시스템 콜을 이용해서 모듈에 있는 함수까지 호출된 경우 그냥 유저 프로세스의 스택을 사용합니다.
Yes : 인터럽트 서비스 루틴의 경우 관련된 프로세스가 없고, 커널 프로세스의 스택을 씁니다.

여기서, 유저모드에서 시스템 콜을 이용했다고 해서 반드시 유저 프로세스의 스택을 사용하는 것은 아니라고 알고 있습니다. ^^*

수정합니다. 말을 잘 못했네요... No인 부분 제가 잘 못 알았습니다. 시스템 콜로 모듈 함수를 호출하면 유저 영역의 펑션은 유저 영역의 메모리 영역을 사용하고 커널 함수 부분에서는 커널 메모리 여역을 사용합니다...

댓글 달기

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