커널에서 kmalloc() 로 선언했을시...
글쓴이: emptysky / 작성시간: 월, 2004/01/19 - 11:10오전
커널 모드에서 (커널모듈 프로그래밍시) 그냥 char my_buf[50]; 선언했을때
커널 공간의 스택에 my_buf[] 의 공간이 생기는게 맞는건가요?
그렇다면 커널 모듈프로그래밍에서 kmalloc()으로 메모리공간을 할당받는다는
말은 커널메모리공간(가상4G중의 1G 커널영역)의 힙영역에 공간을 잡는것인가요?
모듈 프로그래밍을 할때 변수의 메모리차지영역의 대한 개념이 정말 헷갈리는군요
일반 C프로그래밍과 같은 개념일뿐 단지 그 공간대상이 커널메모리 공간이다...<- 이 개념이 맞는건지 궁금하네요
명쾌한 답변 부탁드립니다. (__)끄뻑~
Forums:
kmalloc 라는 함수라는게, 커널함수잖아요..그럼 사용자 공간의
kmalloc 라는 함수라는게, 커널함수잖아요..
그럼 사용자 공간의 메모리를 사용하지 않을거에요..
커널메모리를 할당하는 함수인만큼.. 글니까..
아마도.. 제가 요즘 공부중인데요.. 각 PL(권한 수준)에 따라서요... 페이지 권한요.. ^^ 수준에 따라서..
유저페이지는 3이라는 값을 갖고.. 커널페이지는 0이라는 값을 갖거든요.. 1 2 는 잘안쓰이고요..
이 페이지중에 커널모듈이란게 커널모드에 접근하기위한 수단이니까.. kmalloc 로 할당받으면 마지막 1gb 중에 힙영역으로 할당받을거 같네요 ? =.=
각 페이지마다 코드 세그먼트, 스택세그먼트, 힙세그먼트 같은게 있을수 있으니까요.. 아마도 분명한건 커널메모리공간에다가.. 잡는다는 사실이에요.. =.=a 보충바람..
힘내세요.
Re: 커널에서 kmalloc() 로 선언했을시...
네.
네.
http://wiki.kldp.org/wiki.php/DocbookSgml/KernelAnalysis-HOWTO#LINUX_MEMORY_MANAGEMENT
굳이 메모리 관리의 개념을 알아야 모듈 프로그래밍을 할수 있는것은 아니니 너무 걱정하지 않으셔도 됩니다. 현재 작성중인 모듈에서 일반적인 주의 사항을(스택 사용은 최소로, 메모리 할당은 적정수준에서) 지킬수 있다면 별 문제 없습니다.
굳이 이해하지 않고서는 찜찜하다 싶으시면 관련 서적을 참조하시면서 커널 소스를 보시면 되지만, 권장하지 않습니다.
Re: 커널에서 kmalloc() 로 선언했을시...
메모리 할당하시고 주소를 프린터해보시면되겠네요char buf[50];
메모리 할당하시고 주소를 프린터해보시면되겠네요
char buf[50];
char *kbuf;
kbuf = kmalloc(sizeof(buf), 뭐시기);
printk("buf=%p kbuf=%p\n", buf, kbuf);
하하 ^^ 답장올려주세요..해보시고..
힘내세요.
리눅스는요.. ^^ flat 메모리 모델을 써서요..커널 영역이 아시
리눅스는요.. ^^ flat 메모리 모델을 써서요..
커널 영역이 아시다시피.. 끝자락에 스택 탑부분..
+1되는 지점..
0xc0000000 ~ 0xffffffff 인가 까지에요 ^^
그래서 4기가중 마지막 1기가인데요..
저 vmalloc 랑.. kmalloc 인가하는 메모리 할당함수는.. 커널 용 함수인만큼 커널에 공간을 할당해요 ^^
응.. 그러니까..
커널 스택/ 커널 힙/ 커널 코드.. 공간이 다 있는거죠 ^^ 사용자 공간처럼.. 그래서.. 아래 결과를 얻었어요
buf=c6877f20 kbuf=c7662090 kbuf2=c7662120
전부 커널영역에 할당되었죠 ?
뒤에 두개는 kmalloc로 100할당한거에요..
앞에는 배열로 할당한거고..
이제 =.= 사용자 공간에 할당된다는 말씀은 안하시겠죠 ?
사용자 공간에서 힙영역에 할당하기위해서는..
사용자용 c라이브러리인 /usr/include/malloc.h
안에 있는 malloc 함수를 써야하는데..
이거는.. 커널영역으로 올라가는.. 곳에서는 쓸수 없죠..
넹.. 커널 메모리 할당하는겁니다..
앞으로 질문 자주 올려주세요.. 공부좀 하고 싶네요 ㅎㅎ
힘내세요.
다른분들이 지적하신게 맞습니다. 제가 틀리게 답변한 부분은 수정했습니다.
다른분들이 지적하신게 맞습니다. 제가 틀리게 답변한 부분은 수정했습니다.
유저 모드에서 시스템 콜을 호출하는 경우에, 소프트웨어 인터럽트를 통해서 호출되므로 그때 커널 모드 스택으로 전환이 되겠죠.
답변 감사합니다 ^^
네...
여러님들이 올려주신 명쾌한 답변들 잘 보았습니다.
모든 분들께 감사하네요 ^^
새 해 복 많이 받으세요 (__)~ 꾸뻑
『 아픔은.. 아픔을 달래줄 약이 무엇인지 알면서도 쓰지 못할 때 비로소 그 아픔의 깊이를 알수가 있음이다. 』
『 for return...』
Re: 커널에서 kmalloc() 로 선언했을시...
수정합니다. 말을 잘 못했네요... No인 부분 제가 잘 못 알았습니다. 시스템 콜로 모듈 함수를 호출하면 유저 영역의 펑션은 유저 영역의 메모리 영역을 사용하고 커널 함수 부분에서는 커널 메모리 여역을 사용합니다...
댓글 달기