월별 글 목록: 2004년 11월월

갈길이 멀다

흐.. 쉬운게 없구나..

어제 드디어 dpslink를 돌려 볼려고 했다..

근데… 덴장… 이놈의 모듈들은 올라가지도 않고… loadandrun 이라는 DSP 쪽 로더로 보이는

넘은 실행도 안된다.(분명 파일이 있는데 자꾸 그런거 없단다.)

2.4 커널로 부팅해서 해보니, 여전히 loadandrun은 안되는데 모듈은 로드가 된다. 약간의

메시지가 출력되긴하지만..

아무래도 2.4대와 2.6대의 커널 모듈이 좀 다른듯 하다.. 단순히 확장자만 다른게 아니었단 말인가;;

(2.6에서 올릴려고 해보면 올바른 포맷이 아니라고 나온다)

일단은 모듈을 2.6에 올리는 작업부터 하기로 했다. 리눅스 커널 모듈 프로그래밍을 해 본적이

없는 나로써는 그야말로 앞이 깜깜했다.. 그래도 어쩌겠는가.. kldp로 가서 열심히 찾아보았다.

그래서 발견한 곳이

역시나 2.4에서 2.6으로 바뀌면서 변경된 부분이 많덴다..

일단 문서에 나왔있는 hello, world 모듈을 만들어서 PC에 올려보고…

OMAP에도 올려봤다.. 그런 대로 동작하는 듯 하다.

(이때, makefile은 커널 소스에 있는걸 땡겨 쓰는것 같은데 좀 어려워 보여서 그냥 썼다.)

이제 모듈 두 개를 2.6용으로 새로 만들어야 하는데… 이것참 막막하다-_-;;

dsplinkk.o 를 만드는 소스 쪽에서 모듈 초기화 등등의 인터페이스가 구현된 부분을 찾으려고 했는데..

도저히 못찾겠다. makefile도 분산되어서 여기저기서 include하기 땜에 복잡고 @_@

그래서 일단 pmr_drv.o 라는 넘을 바꿔보기로했다.

이넘은 미리 컴파일 되서 제공되는데… 다행히 소스가 rta_sdk_5_00/ti/bios/rta/sdk/src/pmrdrv에

있었다.

일단 모듈 인터페이스 부분을 고칠려고 봤더니.. 2.6 에서의 형식으로 되어있었다…

흠.. 전에도 썼던 방식인가… 그럼 컴파일만 새로 해보자…

음.. 근데 어떻게 해야 될지 잘몰라서… 일전의 예제에서 썼던 makefile을 복사해다가 수정해서 썼다.

그리고 make…

오호.. 일단은 pmr_drv.ko 라는 파일이 생겼다.

이걸 OMAP에 올려서 insmod를 하니까 문제 없이 올라간다.

흐흐.. 좋았어.. 다음은 다시 dsplinkk.

흠.. 근데 이게 좀 곤란하다.. 도저히 못찾겠다.

그때, 문득 꽁수가 떠올랐다. pmr_drv도 모듈인터페이스는 2.6방식이었으니까, 이놈도 그럴꺼다.

그리고, 앞의 두 경우를 봤을때, .ko 파일은 .o 파일을 바탕으로 만들어지는 듯 하다…

그렇다는 것은…..

커널의 makefile을 잘 이용하면 현재 만들어진 .o 파일을 .ko로 바꿀수 있지 않을까…

그래서 일전의 makefile을 복사하고, 더미로 dsplinkk.c 라는 파일을 만들고,

아무것도 안하는 dsplinkk.c 타겟을 makefile에 추가하고.. make!

오호.. 그 결과 dsplinkk.ko가 생겼다. 이걸 OMAP에 올려보니 잘 올라가는군 :)

근데 이게 진짜 제대로 만들어진 건지는 알수 없다. ;;;

방법은 예제를 돌려보는 것…

그러려면 일단 loadandrun 이 돌아가야 하는데…

아무래도 이게 실행이 안된다.. 그래서 고민하다가 OMAP의 파일 시스템을 둘러보던중…

웃…. 모든 명령이 busybox에 심볼릭 링크로 걸려있다.

이게 도대체 먼가;;;

이런저런 실험을 해본결과… 내가 얻은 결론은 이렇다.

이 루트 파일시스템에서 실제로 실행이 되는 파일은 busybox 밖에 없다.

(아.. busybox라는 넘은 유닉스계열에서 쓰는 웬만한 명령은 모두 내부 명령으로 포함하고 있는

작은 크기의 유용한 프로그램이다.)

그리고 나머지 명령들은 모두 busybox에 심볼릭 링크로 걸려있다. 그래서 각 명령을

실행하면 실제로는 busybox가 실행되면서 해당 명령을 수행한다.

예를 들어 ls를 실행하면,

실제로는 busybox가 실행되고, 이때 main()의 아규먼트 중 첫번째인 실행파일명은 ls가 된다.

busybox는 이를 이용해 ls 기능을 수행하고 결과를 보여준다.

아아.. 놀랍지 않은가… 쉘 내부 명령으로 처리한다기 보다는

실제로 busybox를 하나 더 실행하면서 파라메터로 수행해야되는 기능명을 넘겨서

해당 기능을 수행하는 것이다.

그건그렇고.. 그래서 도대체 왜… 그외의 외부 파일은 실행이 안되느냔 말이다-_-;

busybox의 소스를 뜯어고칠까도 생각했지만… 일단 기본 쉘을 bash로 바꾸면 간단할 거 같았다.

애당초 쉘로 busybox가 실행되기 때문이니까…

그래서 bash의 소스를 구해서 컴파일하고, 올려보았다.. 어라.. 근데 이게 잘 안된다..

그래서 요리조리 해보던중… 두둥…. init 마저도 busybox의 심볼릭 링크 였다-_-;

이렇게 되면 init도 새로 설치하고 만다~

그래서 이리 저리 해서 컴파일하고, 설정하고, 올렸는데…

이런이런… 부팅이 안된다-_-;

아씨.. 수련이 부족하다… 좀더 수련을 쌓아서 다시 도전해야겠다;;;