[질문] 모듈에서 정의한 함수를 커널에서 이용 가능한가??
글쓴이: skjean / 작성시간: 수, 2004/04/21 - 2:48오후
안녕하세요..
맨날 질문만 올려서 많이 죄송스럽습니다.
처음 커널 코드를 하다보니.. 막히는데가 많아요..
너그럽게 생각해 주시길 바랍니다. ^^;;
이번 질문 내용은
드라이버 모듈에서 정의한 함수를 커널에서 이용 가능한가입니다.
제가 모듈에서 function aaa()를 작성하고
커널 코드에서 aaa()를 호출하기 위해서
/usr/src/linux/kernel/ksyms.c 파일에 EXPORT_SYMBOL(aaa)를
한 다음 컴파일을 했더니.. 다음과 같은 에러 메시지가 나오면서 링킹이
안되었답니다.
도움 부탁드립니다. 감사합니다.
kernel/kernel.o(__ksymtab+0x168): undefined reference to ' aaa' net/network.o(.text+0x17dab): In function `ip_build_xmit': : undefined reference to `aaa'
Forums:
EXPORT_SYMBOL이란 해당 코드에서 특정 함수를 다른곳에서 접근
EXPORT_SYMBOL이란 해당 코드에서 특정 함수를 다른곳에서 접근 할 수 있게 해주는 매크로 입니다.
ksym에 EXPORT_SYMBOL을 했다면 다음과 같이 해석이 되겠죠
"커널내에 구현된 aaa라는 함수를 다른 모듈에서 접근할 수 있게 하자."
https://nicesj.com
https://blog.nicesj.com
그런 방법을 구현하려면...
NULL로 채워진 함수 포인터를 만들면 될 듯싶군요.
void *(void *) fp = NULL;
이와 같은 식으로요. (문법이 맞는지 잘 모르겠군요. 틀릴지도...)
그런 다음에
EXPORT_SYMBOL(fp)
를 해주고module에서
fp = function
으로 실제 사용될 함수 포인터를 넣어주면 되겠지요.커널에서 이 함수를 부를때는
하면 안전하겠지요.
커널서 부르는 함수를 굳이 모듈에 넣으려는 이유가 뭔지 궁금하지만...
아, fp라는 변수보다는 커널 안에서 안쓸것 같은 이름의 변수를 쓰는게 더 좋겠군요.
답변 감사드립니다. 질문의 정확한 요지는 모듈에서 정의한 함수를
답변 감사드립니다.
질문의 정확한 요지는 모듈에서 정의한 함수를 커널에서
불러다 쓰는 요령이었지요... 패킷 송신시에 모듈에서
해 주는 일을 패킷 수신시에 커널에서 동일하게
해 주어야 할 일이 있었거든요...
쉬운 방법은 없는 듯하고.. "valor"님이 말씀하신
function pointer를 사용하는 방법으로 한번 시도해
보았습니다.
물론 실패 ^^;;
잘 안되더군요.. (공력이 아직 많이 딸려서...)
sjpark님, valor님 답변 감사드립니다.
좋은 나날들... 되세요...
댓글 달기