char device driver 질문.
글쓴이: zasxer / 작성시간: 화, 2020/01/21 - 11:09오전
안녕하세요.
디바이스 드라이버를 공부하고 있는 직장인입니다.
리눅스 디바이스 드라이버 책을 따라해보고 있는데, 이해가 안되는 부분이 있어 질문을 올립니다.
dev = open(DEVICE_FILENAME, O_RDWR|O_NDELAY);
wirte(dev, 0x40, 0x41);
응용 프로그램에서 DEVICE_FILENAME에 해당하는 inode와 file 구조체를 찾고 write를 하는 구조로 이해를 햇는데요. 쓰는 거는 쓰는건데 dev의 0x40의 주소에 0x41을 쓰는 거라는 설명으로 되어 있습니다.
여기서 궁금한게 두가지 인데요.
1. 0x40은 물리주소인가? 가상 주소인가?
2. 0x40말고 엄청 큰 수를 입력을 해도 해당 영역에 write가 되는가?(가상주소에 한에서)
3. module을 등록하는데 module의 크기나 위치는 도대체 어디에 등록되는 걸까요?
단순히 register(CALL_DEV_MAJOR, CALL_DEV_NAME, &call_fops); 로 등록만 하는데요...
Forums:
여기(https://temp123.tistory
여기(https://temp123.tistory.com/16)에 잘 설명되어 있네요. 뭐가 다른지 비교해 보세요.
1. write 함수를 ssize_t write(int fd, const void *buf, size_t count) 라고 본다면 (http://man7.org/linux/man-pages/man2/write.2.html 참조), buf 가 들어가야 할 자리입니다. 이는 당연히 가상주소입니다. 리눅스에서 커널 함수를 제외하고 물리주소를 접근할 수 있는 함수는 없습니다.
2. 그 주소는 가상함수가 표현할 수 있는 주소값 범위 내에 있어야 합니다. 물론 그 주소는 malloc() 등으로 할당된 것일테니 잘못된 값을 줄수 있지도 않고요.
3. 유저 모듈은 커널 디바이스 드라이버에 붙어서(?) 동작합니다. 그러니까 커널 영역에 있다고 봐야 겠죠.
CPU 의 MMU 가 켜진 이후로 물리주소에 직접
CPU 의 MMU 가 켜진 이후로 물리주소에 직접 접근할 수 있는 s/w 는 없습니다.
커널도 예외는 아닙니다.
MMU 에 물리주소와 가상주소가 1:1 identical 매핑이라도 되어 있어야 물리주소로 접근하는 흉내라도 낼 수 있습니다.
예로 드신 코드는 일반적인 write() 함수 사용방법과는 매우 다릅니다.
하지만 장치 드라이버를 그에 맞게 작성한다면 불가능하지는 않습니다.
따라서 장치 드라이버 코드를 보기 전엔 1번,2번 질문에 대한 답이 불가능합니다.
댓글 달기