[완료]커널 2.6.32 버전의 parse_mtd_partitions( ) 함수를 3.3.3 버전에 맞게 다시 작성하고 싶습니다.
글쓴이: jachin / 작성시간: 수, 2012/04/25 - 3:01오전
2.6.32 버전의 커널 소스에서 drivers/mtd/devices/m25p80.c 를 수정하여 사용했었습니다.
내부에서 m25p_probe( ) 함수에 추가적인 조건을 더 하여 특정 장치를 인식하도록 만들었는데,
커널 3.3.3 버전을 쓰려하면서, 관련 소스코드의 체계가 확 달라진 것을 느꼈습니다.
그 중에서 parse_mtd_partitions( ) 함수를 사용했었는데,
3.3.3 버전에서는 비슷하게 보이는 함수로 mtd_part_parser 를 인자로 갖는
register_mtd_parser 함수가 같은 역할을 하지 않을까 추측해보고 있습니다.
아래 코드 내용은 3.3.3 버전의 커널 소스 include/linux/mtd/partitions.h 내용 중 일부입니다.
struct mtd_part_parser { struct list_head list; struct module *owner; const char *name; int (*parse_fn)(struct mtd_info *, struct mtd_partition **, struct mtd_part_parser_data *); }; extern int register_mtd_parser(struct mtd_part_parser *parser); extern int deregister_mtd_parser(struct mtd_part_parser *parser);
본래 2.6.32 버전 코드에서 같은 partitions.h 파일의 함수 선언 부분은 다음과 같습니다.
struct mtd_part_parser { struct list_head list; struct module *owner; const char *name; int (*parse_fn)(struct mtd_info *, struct mtd_partition **, unsigned long); }; extern int register_mtd_parser(struct mtd_part_parser *parser); extern int deregister_mtd_parser(struct mtd_part_parser *parser); extern int parse_mtd_partitions(struct mtd_info *master, const char **types, struct mtd_partition **pparts, unsigned long origin);
mtd_part_parser 에 대한 정의도 변경되었지만, 기존에 사용하던 함수 대신, 다른 형태로 함수의 역할을 대체하는 것 같은데, 소스코드를 계속 보다가 시간만 흘러서 질문으로 남겨봅니다.
커널 3.x 버전 대의 MTD 관련 장치 드라이버 경험이 있으시다면, 관련 함수 사용법을 알려주셔도 좋을 것 같습니다.
아직 소스코드에 익숙하지 않은 편이라 시간이 좀 걸릴 것 같지만, 답글 달아주시면 감사히 읽도록 하겠습니다.
Forums:
저도 요즘 리눅스 커널소스와 디바이스 드라이버를
저도 요즘 리눅스 커널소스와 디바이스 드라이버를 분석해 보고 있는 상황이라 댓글 달아 봅니다.
커널3.x 버전에서는 parse_mtd_partitions() 함수를
linux/drivers/mtd/mtdcore.h에서 선언하고 있습니다.
커널2.6.x에서는 include/linux/mtd/partitions.h에서 선언하고 있습니다.
이 함수의 원형은 커널3.x나 커널2.6.x 모두 동일하게 /drivers/mtd/mtdpart.c에 정의되어 있습니다.
단지, 달라지는 점은 이함수로 전달되는 세번째 파라미터 입니다.
커널2.6.x는 unsigned long origin이고, 커널3.x는 struct mtd_part_parser_data *data입니다.
저도 이 소스를 모두 보지는 못했지만,
커널3.x에서 구조체로 데이터를 좀더 많이 받아서 처리하는듯 합니다.
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
오옷, 답변 감사합니다.
답변글 덕분에 생각할 수 있는 가능성이 더 많아졌네요.
저도 세번째 파라메터의 역할이 맘에 걸립니다.
아직까지 리눅스의 '리'자도 파악하지 못해서,
매번 채이고 있다보니, 맘의 여유가 없어지는 건 아닌가 모르겠습니다.
리눅스의 '리'자도 파악하지 못한게 문제가 아니고...
프로그래밍의 '프'자도 파악못한게 문제인거같은데...
보니까 2.6.32에 unsigned long origin가 3.3.3에서 struct mtd_part_parser_data 안으로 들어간 차이뿐이던데...
mtd가 먼지도 모르는 나도 소스 보니까 금방 알겠던데...
프로그래머가 자기 힘으로 이정도 소스 읽을줄 모르면 심각한거 아닌가...
근데 세번째 파라메터의 역할이 맘에 걸린다는 개솔은 머하러 했지...
거기 커멘트 보면 세번째 파라메터 역할이 자세히 나와있는데 어디가 맘에 걸린다는거지 대체...
궁금하면 더 물어보기 바람...
오오~ 고맙다.
제대로 된 답글을 딴데서 읽게 될 줄은 몰랐는걸.
MTD가 플래시 메모리 관련 장치라는 걸 몰랐다는 건,
네가 하드웨어는 잘 모른다는 얘기구나?
사실 말야, 내가 프로그래밍은 잘 몰라.
그리고 파라메터의 역할이 맘에 걸린다는 것은 개소리가 아니라,
그 인자부분이 장치에 어떻게 쓰일지 모른다는 이야기야.
그리고, 너 자꾸 익명으로 '개솔'이니 뭐니 그런 얘기하면,
내 글 들어간 KLDP 글을 읽기 두렵게 만들어줄꺼야.
대부분 네트워크 하시거나 보안하시는 분들은
인터넷 상에서 나쁜짓 하면 안된다는 걸 잘 아시거든?
욕하지 말고 답글쓰도록 해.
어투에 네 가지가 없는건 용서해줄께.
....
病身은 무시하는게 답입니다.
DO NOT FEED THIS TROLL!
git log 로
git log 로 drivers/mtd/devices/m25p80.c 파일 history를 보시길..
작년말 정도에 변경된 부분으로 보이는데, 기존에 얼마만큼 수정해서 썼는지는 모르겠지만 어려워보이진 않네요.
앗, 감사합니다. :)
사용했던 부분은 probe 부분뿐이라서, 크게 문제되지는 않을 것 같습니다.
생각해보니, git 으로 history 보는 법도 익숙하지 않네요. ^^;
공부할 게 많은 것 같습니다. ㅠㅠ
아하... 이제 방향이 좀 잡혔습니다.
2.6.32 버전에서는 parse_mtd_partitions(struct mtd_info*, const char**, struct mtd_partition**, unsigned long origin) 함수 내에서
파티션을 분석하는 파서의 종류를 두번째 인자 const char** 값을 get_partition_parser( ) 함수를 통해 결정하였는데,
그것을 3.3.3 버전에서는 같은 드라이버 내에서도 2개 이상의 파티션 종류를 갖고 있을 수 있는 것을 가정하여,
네 번째 인자를 unsigned long 값에서 struct mtd_part_parser_data* 으로 바꾸고, 드라이버 내의 파티션 파서를 결정하게 되어있네요.
즉, mtd_part_parser 구조체 내의 parse_fn 에 대한 세번째 파라메터는 드라이버 내의 파티션에 대한 파서를 결정하는 인자였습니다.
기존의 드라이버에서는 파서가 하나 뿐이라 기존 값대로 전달하여서 해결하였습니다.
고민해주신 분들께 감사드립니다. :)
댓글 달기