리눅스 커널에 대한 이해도 없이 매주 목요일마다 리눅스 디바이스 드라이버 세미나에 참여하고 있습니다.
리눅스 디바이스 드라이버는 디바이스 드라이버와 관련된 리눅스 커널에 대한 내용을 다루고 있는 책입니다. 어느 정도의 리눅스 커널에 대한 이해가 필요함에도 불구하고 아무것도 모르는 상태에서 무작정 소스를 들여다보고 있으니 매번 낭떠러지로 추락하는 기분이네요. ^^
그래도 부지런히 다시 기어올라오려고 버둥거리고 있습니다.
사실 책의 내용은 소스를 이해하는데 참고만 하고 있는 정도고, 실제로는 책의 예제 소스를 분석하는걸 중심으로 공부 중입니다. 현재 책 앞부분을 보고 있기 때문에 scull 소스만 보고 있고요..
그 다음이 문제인데.. scull_load를 이용해서 insmod로 드라이버를 커널에 올리고 mknod를 이용해 드라이버 파일을 생성하는 부분인데 insmod와 mknod의 소스를 구해서 분석하다보니 유저 app에서 커널 쪽 함수로 넘어가는 부분에서 떡하니 막혀버리고 말았습니다. grep을 이용해서 소스를 아무리 뒤져봐도, init_module()와 sys_init_module(), mknod()와 sys_mknod()의 연결이 보이지 않는다는 이야기죠..
구글을 부지런히 뒤지다보니 시스템 콜이라는 단어가 보이네요.. 사실 세미나 시간에 시스템 콜에 대한 간략한 설명이 있었고 프린트한 자료에도 시스템 콜에 대한 설명이 나온걸 가지고 있었는데 완벽한 이해가 없다보니 몇 일을 구글과 친구하며 지냈었네요.. ^^; 덕분에 대략적인 시스템 콜의 구현은 알게되었지만, 인터넷에 나왔는 자료들과 지금 보고 있는 커널 2.6 소스의 시스템 콜이 완전히 매치가 되지 않아서 좀 더 시간을 들여서 시스템 콜에 대해서 분석을 해봐야 할 것 같습니다.
시스템 콜에 대해 대충이나마 이해하고 이제 init_module()의 커널 함수인 sys_init_module()을 분석하고 있습니다. sys_init_module()에서는 커널 메모리에 올라온 scull.ko 파일을 load_module() 함수로 넘겨서 ELF 스펙에 따라 자료 구조를 만들고 있는데 ELF에 대해 먼저 알아야 할 것 같아서 또 헤매고 있네요..;;
단순한 디바이스 드라이버 예제 소스를 하나 보는데도 커널 레벨로 들어가보니 이건 소스 분석 전에 먼저 알아야 할 것들이 산더미 같네요. 스터디 시간에는 대체적으로 구조체끼리 자료가 어떤 식으로 연결되는지에 대해서 반복적으로 설명하고 있는데, 저는 아직도 함수 레벨에서 헤매고 있으니 데이터가 움직이는 전체 구조가 한눈에 싹 들어오지는 않고 있습니다. ㅠㅠ
그래도 이런식으로 커널 소스를 들여다보고 있으니 끝도 없이 공부해야 할 목록들이 늘어나는데, 이렇게라도 리눅스 커널 소스를 들여다볼 기회가 생겼다는 사실만으로 즐기고 있습니다. ;)
리눅스 디바이스 드라이버는 디바이스 드라이버와 관련된 리눅스 커널에 대한 내용을 다루고 있는 책입니다. 어느 정도의 리눅스 커널에 대한 이해가 필요함에도 불구하고 아무것도 모르는 상태에서 무작정 소스를 들여다보고 있으니 매번 낭떠러지로 추락하는 기분이네요. ^^
그래도 부지런히 다시 기어올라오려고 버둥거리고 있습니다.
사실 책의 내용은 소스를 이해하는데 참고만 하고 있는 정도고, 실제로는 책의 예제 소스를 분석하는걸 중심으로 공부 중입니다. 현재 책 앞부분을 보고 있기 때문에 scull 소스만 보고 있고요..
scull 디렉토리 아래 소스 파일들을 Makefile을 이용해 컴파일 해서 scull.ko 파일을 만드는 것인데 Makefile은 매일 들여다 보는거라 awk나 sed 유틸을 사용하는 부분 외에는 쉽게 이해하고 넘어갔습니다.
그 다음이 문제인데.. scull_load를 이용해서 insmod로 드라이버를 커널에 올리고 mknod를 이용해 드라이버 파일을 생성하는 부분인데 insmod와 mknod의 소스를 구해서 분석하다보니 유저 app에서 커널 쪽 함수로 넘어가는 부분에서 떡하니 막혀버리고 말았습니다. grep을 이용해서 소스를 아무리 뒤져봐도, init_module()와 sys_init_module(), mknod()와 sys_mknod()의 연결이 보이지 않는다는 이야기죠..
구글을 부지런히 뒤지다보니 시스템 콜이라는 단어가 보이네요.. 사실 세미나 시간에 시스템 콜에 대한 간략한 설명이 있었고 프린트한 자료에도 시스템 콜에 대한 설명이 나온걸 가지고 있었는데 완벽한 이해가 없다보니 몇 일을 구글과 친구하며 지냈었네요.. ^^; 덕분에 대략적인 시스템 콜의 구현은 알게되었지만, 인터넷에 나왔는 자료들과 지금 보고 있는 커널 2.6 소스의 시스템 콜이 완전히 매치가 되지 않아서 좀 더 시간을 들여서 시스템 콜에 대해서 분석을 해봐야 할 것 같습니다.
시스템 콜에 대해 대충이나마 이해하고 이제 init_module()의 커널 함수인 sys_init_module()을 분석하고 있습니다. sys_init_module()에서는 커널 메모리에 올라온 scull.ko 파일을 load_module() 함수로 넘겨서 ELF 스펙에 따라 자료 구조를 만들고 있는데 ELF에 대해 먼저 알아야 할 것 같아서 또 헤매고 있네요..;;
단순한 디바이스 드라이버 예제 소스를 하나 보는데도 커널 레벨로 들어가보니 이건 소스 분석 전에 먼저 알아야 할 것들이 산더미 같네요. 스터디 시간에는 대체적으로 구조체끼리 자료가 어떤 식으로 연결되는지에 대해서 반복적으로 설명하고 있는데, 저는 아직도 함수 레벨에서 헤매고 있으니 데이터가 움직이는 전체 구조가 한눈에 싹 들어오지는 않고 있습니다. ㅠㅠ
그래도 이런식으로 커널 소스를 들여다보고 있으니 끝도 없이 공부해야 할 목록들이 늘어나는데, 이렇게라도 리눅스 커널 소스를 들여다볼 기회가 생겼다는 사실만으로 즐기고 있습니다. ;)


덧글