커널 모듈 프로그래밍 관련.
글쓴이: yabaman / 작성시간: 수, 2003/07/23 - 4:40오후
어떤 하드웨어가 있는데요, 이 하드웨어 드라이버 모듈을 올리면 /dev/ 아래에 장치가 생성되고,
이 하드웨어를 사용할때는 장치에 대해서, open() system call 을 통해서, fd 를 얻고, ioctl / read / write 등을 통해서, 컨트롤을 하는데요,
user mode 에서는 기냥 open / ioctl / read / write / close 등을 통해서 제어를 하면 되는데, 이를 커널 모듈에서 사용 해야 할 일이 생겼습니다.
커널 모듈에서는 어떠한 방식으로 저것 들을 사용 할 수 있을까요?
kmalloc 이 있고, printk 등을 쓰고 하는 것으로 봐서는,
비슷한 방법으로 대체된 function 이 있을것도 같은데, 제가 이쪽 분야에 대해서 문외한이라서..
잘 아시는 분들의 도움 부탁드립니다. ^^;
Forums:
만약 user mode로 coding된 program을 kernel mo
만약 user mode로 coding된 program을 kernel mode로 바꾸시는거라면
1. makefile에서 library를 제거하고 kernel의 최종 binary에 link되도록 object를 추가해주셔야하며
2. 각 file들에서 include file을 kernel source에 있는 include file들로 바꿔주셔야 합니다
3. 그리고 code중 open(), ioctl() 등을 driver에서 제공하는 function과 이름 및 parameter를 맞춰주셔야 합니다 ( system call 없이 바로 call하기 위함)
위 3가지를 하신다음에 compile하시고 compile 및 link error를 제거해나가시면 됩니다
그리 쉽지는 않지만 그렇다고 어려운 작업이 아니니 한번 해보세요
[quote]3. 그리고 code중 open(), ioctl() 등을 d
이 부분에 대해서 잘 모르겠습니다.
int 모듈명_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
int 모듈명_close(struct inode *inode, struct file *filp);
int 모듈명_open (struct inode *inode, struct file *filp);
이러한 함수들이 그쪽 드라이버 안에 존재 하긴 합니다만,
이것들을 어떻게 open() / close() / ioctl() 과 매칭 시킬 수 있을까요?
int 모듈명_ioctl(struct inode *inode, struc
int 모듈명_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
int 모듈명_close(struct inode *inode, struct file *filp);
int 모듈명_open (struct inode *inode, struct file *filp);
=>
int 모듈명_ioctl(unsigned int cmd, unsigned long arg);
int 모듈명_close();
int 모듈명_open ();
driver에서 위와같이 바꾸시고 kernel mode로 바꿀 code에서 함수를 call하는 방식을 사용하시면 됩니다
inode 및 flip은 어차피 file system에서 사용할 driver file 등을 나타내는것이고 user mode에서 system call을 이용하여 call할때 필요한 parameter입니다
말씀하신대로, 모듈명_open, 모듈명_close 부분은 filp 를 사
말씀하신대로, 모듈명_open, 모듈명_close 부분은 filp 를 사용 하는 부분이 없어서 고쳐도 될 것 같습니다.
하지만, 모듈명_ioctl() 에서는,
이런식으로 filp 에서 무엇인가 가져오고, 뒷 부분에 이를, 사용을 하는 부분이 있어서, 그렇게 고쳐도 될지 판단이 안서네요.
음, 그래서 검색하다 찾은것이, module 내에서 filp_open 을 통해서 파일을 여는 코드인데요, 드라이버를 사용할 모듈에서 module_init 시, filp_open 을 통해서 filp 를 얻어온 후,
드라이버를 사용할 때, 즉, 모듈명_ioctl 을 부를때 얻어온 filp 를 파라메터로 넘기는 방식으로 코드를 작성해도 될려나요?
그리고 kodol 님 답변 감사합니다. ^^;
저는 사실 embedded 환경에서만 일하고 있고 file system을
저는 사실 embedded 환경에서만 일하고 있고 file system을 다뤄본적이 없어서 yabaman님과 같이 할 경우에 제대로 될 지는 확신이 안서거든요..
해보시고 가능여부를 알려주시겠어요?
안되면 다른 방법을 의논하지요..
댓글 달기