2012. 7. 26. 17:13 devel/man & example

ioctl

ioctl이 뭐하는 녀석이지? 하는 궁금증이 많았는데 친절하고 구체적으로 나와있는글이 거의 없더라

http://wiki.kldp.org/KoreanDoc/html/EmbeddedKernel-KLDP/device-understanding.html

그러다가 위의 링크를 읽어보니 아하~ 하고 깨닫게 되었다

 

int main()
{
int fd; char buf[256];

fd = open("/dev/hdd_info", O_RDWR);
ioctl(fd, 0, buf);

printf("buf : %s\n", buf);
close(fd);
return 0;
}

 

위의 kldp 링크 중에 나와있는 소스코드이다(살짝 수정을 했다 좀...)

open으로 장치 하나 열어서

ioctl로 장치에게 동작 명령 내리고

출력하고 다시 장치 닫는다

 

 

ioctl은 장치에게 그냥 이미 정의되어있는 명령을 내리는(함수를 호출하는) 놈이라는 것을 알게 되었다

대신 장치를 우선 open으로 열고 인자로 그 file descriptor랑 가운데 request number를 넣어서 어떤 함수를 호출할지를 정하는듯

 

그런데 동일한 ioctl을 사용하는데 어떻게 장치마다 각기 다른 function을 호출 할 수 있지?

예를 들면 A파일을 열어서 ioctl에 0req#을 넣어서 하는 행위랑 B파일을 열어서 ioctl에 0req#을 넣어서 하는 행위가 어떻게 다르게 되는거지? (혹은 같게)

 

 

 

미리 device driver에 그런거 등록해놓는듯

 

 

가장 위의 링크를 보니까 struct file_operations에 미리 여러가지 말 그대로 file operation들을 등록할 수 있는데

struct file_operations Fops = {
NULL,
NULL,
hddinfo_read,
NULL,
NULL,
NULL,
hddinfo_ioctl,
NULL,
hddinfo_open,
NULL,
hddinfo_release
};
이런식으로 자기가 쓰고 싶은 놈들을 function 등록 ㅇㅇ

struct니까 멤버 위치당 역할은 고정

위의 코드를 디바이스 드라이버에 작성하고

(Fops와 Fops structure에 포함 등록 되어있는 function들을 정의)

 

insmod한 다음에 이제 유져 프로그램에서 ioctl 하면 그게 인쟈 잘 된다 이런 내용인듯

그렇다면 dd에는 하드웨어 접근 코드들을 넣으면 되겠구나 하는 생각이 들기도 하고

어느정도 권한까지 있으려나

 

여튼 kldp가 짱!짱!

'devel > man & example' 카테고리의 다른 글

arm assembly byte swap 예제 분석  (0) 2016.04.13
dev file  (0) 2015.08.04
const  (0) 2012.07.21
#define function macro  (0) 2012.07.15
#define 문자열 치환 및 합치기  (0) 2012.07.15
Posted by 쵸코케키

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함