본문 바로가기

프로그래밍./ARM(임베디드)

[s5pc100] 모듈 만들기 기초 (심볼 미공개, 전역 심볼 공개). 그림설명.

[s5pc100] 모듈 만들기 기초 (심볼 미공개, 전역 심볼 공개)
[s5pc100] 모듈 만들기 기초 (심볼 미공개, 전역 심볼 공개)
[s5pc100] 모듈 만들기 기초 (심볼 미공개, 전역 심볼 공개)

모듈의 작성 및 추가 삭제를 모른다면 아래 링크를 참조 하자.
[s5pc100] 모듈 만들기 기초. (hello 출력하기)


모듈에는 심볼을 공개 하는 것과 공개하지 않는 것이 있다.

심볼이란..
c로 비유하자면 함수와 비슷한데 기본적으로 있어야 하는 2개의 시작/종료 함수를
 제외한 사용자가 정의한 함수같은 것.


이해가 안된다면 일단 아래 예제들을 따라가 보자.


심볼을 공개하지 않는 예제이다. 2개의 박스에 들어있는 함수가 기본적으로 있어야 하는 함수.

MODULE_LICENSE("GPL") 은 내가 만든 모듈의 코드를 다른 사람에게도 공개한다는 의미라고 한다.
이를 적용하지 않아도 되지만, 적용하지 않는다면 linux에서 제공하는 라이브러리. 함수들을 사용할 수 없다고 함.
linux소스 공짜로 쓰면서 공개를 안하는 것은 인정하지 않는 듯 하다. - -;

EXPORT_NO_SYMBOLS; 이 심볼을 공개하지 않는다는 의미이다. 음.. 전역함수가 없다고 하는 것과 비슷한 의미랄까?

따라서 모듈을 작성하는 경우 위의 소스가 기본적인 틀이다. 위의 틀에서 소스를 추가해서 사용하는 식이다.




작성한 코드를 모듈로 만들어서 보드에서 테스트 하는 화면.


insmod 모듈을 추가하면 출력화면이 나오고, lsmod로 모듈이 추가 된 것을 확인 할 수 있음.





심볼을 공개하는 예제. [공유할 심볼이 있는 모듈소스]


보라색 박스가 사용자가 정의한 함수이자 심볼이 되는 셈이다.
EXPORT_SYMBOL(사용자 함수명); 이 이 함수를 다른 모듈에서 사용이 가능하도록 하는 코드이다.

C를 비유로 들면. 소드가 한개의 파일에서 있는 것이 아닌, 여려개의 소스파일의 사용시에서
다른 파일에서 생성한 함수를 호출할 수 있도록 하는 것과 유사하다. C 에서는 넘겨주는 쪽은 그냥 있고
받는 쪽에서만 extern 으로 함수를 정의해 주는데. 모듈은 넘겨주는 쪽에서 EXPORT_SYMBOL(사용자 함수명); 해줘야 한다.



[다른 모듈에서 심볼을 끌어다(호출해서) 쓰는 모듈의 소스]


C 처럼 다른 모듈에 있는 심볼(함수)를 사용하는 경우 extern 으로 내가 사용할 함수가 외부에 있다고 미리 선언.



[추가했던 모듈의 제거 모습]


공유할 심볼[symbol_test()] 는 symbol_test1에 있고 sysbol_test2에서 심볼을 불러다 쓴다.

따라서 주의사항이 있다.
내가 불러올 심볼이 test1 에 있기 때문에 모듈을 먼저 추가해줘야 한다. 
그래야 test2를 실행 시켰을 때 외부심볼을 찾을 수 있기 때문.

반대로 지우려면 test2가  test1의 심볼을 쓰고 있기 때문에 2가 1에게 대롱대롱 매달려 있다.
이런 경우 1을 지우지 못한다. 매달려 있는 2를 먼저 지우고 그 다음에 1을 삭제해야 한다.

그래서 2번을 지우고 1번을 삭제한 것이다.