kernel 영역의 메모리를 user space에서 접근(?)
글쓴이: swunk / 작성시간: 목, 2005/11/10 - 4:10오후
user space에서 값을 전달해서 copy_from_user() 를 통해서kernel space에 자료구조(링크드 리스트)를 생성합니다.
자료구조의 내용을 확인하기 위해서 copy_to_user()로 사용자에게 링크드리스트의 (시작주소)헤더 주소를 넘깁니다.
헤더 주소를 알기때문에 링크드리스트의 모든 내용을 접근 가능할 거라고(?) 짐작했지만 안되더군요...
해당 헤더값만 접근 가능했습니다. 그 외의 값을 접근하려 하면 세그먼트 폴트 납니다.
여기서 질문 입니다.
1)커널 영역에서 생성한 자료구조를 user space에서 접근하려면 혹은 자료구조를 통채로 넘기려면 어떻게 해야 하나요 ?
2) 위에서 링크드리스트의 시작주소를 받아왔슴에도 불구하고 값들에 접근하려 하면 세그멘트 폴트가 나는 이유는 무엇인가요 ?
답변 부탁드립니다.
꾸벅...
Forums:
어설픈 지식과 함께 오래된 기억에 의하면copy_는 말그대로 co
어설픈 지식과 함께 오래된 기억에 의하면
copy_는 말그대로 copy하는것으로 기억합니다.
그 주소를 그냥 넘기는것이 아니고요.
user영역과 kernel영역은 주소체계가 다른것으로 알고 있습니다만(정확하지 않습니다. ㅠ.ㅠ) 1번 질문과 같은 비슷한 작업을 하려면 mmap을 사용하지면 되지 않을까 합니다.
2)은 copy_의미로 설명이 되지 않을까 합니다. (일종의 memcpy를 생각하시면 될것입니다)
# 앗 copy_로 주소값 자체를 복사 하신것이라면 --; 다른분에게 패스~
주소값을 복사했기 때문에 가능할것이라고 짐작했었습니다.mmap에
주소값을 복사했기 때문에 가능할것이라고 짐작했었습니다.
mmap에 대한 정보를 찾기가 만만치 않네요...
예전부터 얘기는 들었지만 자료가 없어서 도통 사용 못하고 있었는데...
아시는 분들 갈켜주세요...
kernel 영역의 메모리를 user space에서 접근(?)
네트웍 모듈을 작성중이신것 같은데..
(일반 PC에서 리눅스로 작업을 하신다는 가정하에..) Kernel에서 할당한 메모리의 주소와 UserSP에서 사용하는 주소는 완전히 다른것입니다. 그러므로 커널에서 사용하는 주소를 USERSP쪽으로 보내봤자 세그멘테이션 폴트가 발생할 수밖에 없지요. (이 내용은 google신의 도움을 빌어서 embeded관련 사이트를 찾아 보시면 무릎을 치실테고..)
위의 분이 말씀하신 커널에서 할당한 메모리를 UserSP에서 mmap()으로 연결하여 동시에 사용하는 방법도 있습니다. 그러나 간단한 자료의 입출력이라면 커널에서 자료구조를 만드신 후, ioctl()을 이용하여 UserSP에서 관리할 수 있도록 하시면 됩니다. 커널에 ioctl 대응함수들을 등록 하실때 insert, select, delete, update, change등을 등록 하시고서 작성하시면 됩니다.
google keyword1: "mmap(" nopage -error
google keyword2: "struct file_operations"
---------------------- 절취선 -----------------------------
[여담] 저도 iptables가 넘 불편해서리 올해 여름부터 2.6에서 커널모듈과 유저어플을 만들어서 일종의 개인 방화벽을 만들어서 쓰고 있는데요, 성능 쥑입니다. 거의 와이어 수준이졈^^. Dynamic filtering, SNAT, DNAT, Gateway까지 구현하여 사용중입니다. 지나고 나니 재미는 있었지만 리눅스에 슬슬 짜증이 나기 시작하네요.. 그래서리 내년에는 프비로 돌아갈 맘을 먹구 있습져^^.
-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----
[quote]Kernel에서 할당한 메모리의 주소와 UserSP에서 사용
완전히 다른것 같지는 않은데요...
물론 유저스페이스에서 커널스페이스의 메모리 영역을 알 수 없지만 특정 주소값을 알려주면 되지 않나요 ? 그리고 위 질문에서도 말씀 드렸지만 링크드 리스트의 첫번째 element 주소를 넘기면 그 해당 element값은 user space에서 마음대로 확인할 수 있습니다.
문제는 가져온 element의 next 값을 참조해서 즉, 다음 element값을 참조하려 하면 segment fault가 나니까요... 제가 잘못 알고 있는 부분이 있다면 지적해 주시면 고맙겠습니다.
그래서 일단 커널 영역에 메모리 할당이 linear 하게 할당되어 있다면 어차피 첫번째 element의 주소는 알고 있으니깐(접근 가능하니깐) 그 다음 엘리먼트로도 next 필드를 통해서 접근 가능 할 것이라고 생각했는데..그게 안되더라구요...
한가지 더 여쭙겠습니다.
ioctl을 통해서 하라고 말씀 하셨는데요...
ioctl을 사용해도 커널 영역의 자료구조를 유저영역에서 참조하거나 유저영역으로 통째로 넘기거나 지는 못하지 않나요 ? 물론 유저 영역에서의 값들을 insert,delete, update, change할 수 있지만요...
제가 원하는 것은 커널 영역내의 자료구조 내에 어떤 값들이 들어 있는 지를 유저영역에서 확인하려고 합니다.
잘 몰라서 그러는데 프비를 사용하면 리눅스를 사용하는 것보다 향상되는 점들이 있나요 ?
그럼 답변 부탁드립니다.
ioctl()로 하세요.쓰신 글을 보다가 보니, VM(Virtual
ioctl()로 하세요.
쓰신 글을 보다가 보니, VM(Virtual memory)에 대해 공부하시고, mmap에 대해서도 공부하셔야 겠습니다.
옙. :shock:
옙. :shock:
[quote]완전히 다른것 같지는 않은데요... 물론 유저스페이스에서
일례를 들어서 kernel에서 vmalloc(with nopage)으로 할당한 주소를 usersp에서 mmap()을 통해 연결하면 잘 사용할 수 있습니다. 그런데 kernel에서의 할당한 주소와 usersp에서 mmap()한 주소를 프린트하면 전혀 다른 주소가 나오죠. 위의 인용구처럼만 된다면야 커널과 어플 연동하는 개발자들중 다수는 한숨 놓겠네요^^. 결론은 잘못 테스트 하셨다는 겁니다. VM에 대해서는 구글신의 자세한 상담을 받아보세요.
kernel이 가지고 있는 자료구조 전체를 usersp에 넘길 필요는 없습니다. 한개의 작업을 수행하여 결과물만 넘기면 되니까요. 위의 {insert|..|change}는 그 작업들을 위한 IOCTL명령들입니다.
개인의 기호에 따른 것일 뿐입니다. 유지와 개발등의 작업이 용이한 모태일뿐이구요.^^ 리눅스 진영에서는 젠투 리눅스가 많이 비슷하죠.
-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----
댓글 달기