> 왜 커널 레벨에서는 유저레벨 함수가 사용안되나요~~~~???
리눅스 커널은 glibc와 같은 standard c 라이브러리를 사용하지 않습니다.
그러므로 당연히 printf, open등의 함수를 사용할 수가 없죠.
대신, 리눅스 커널은 그러한 기능들을 하는 함수를 일일이 만들어서 사용하고
있습니다(예를들어, printf와 같은 기능은 printk 함수가 대신합니다.).
그럼 2.6에서 유저레벨의 open 함수대신 사용할수 있는건 뭐예요? printf가 printk이듯이.... 파일 오퍼레이션 구조체에 있는 함수 포인터 그 ...open 말고요...고거는 유저레벨에서 불러줘야지만이 되니까요...가령 커널 레벨에서 /dev/tty1을 오픈하려고 할 경우... 그럴때 파일 디스크립터를 리턴 받아야 되는데요... 그 open 함수를 대신하는 건 무엇인가요..?
디바이스 드라이버에 디바이스를 등록할때 필요한 Call 들을 등록합니다.
윗분 말씀대로 sys_open() 를 열면 파일 시스템의 경우는 VFS 를 통해 각각의 파일 시스템 구조에맞는 open call 로 mapping 되고요 (원리는 function pointer 입니다.) device 의 경우도 마찬가지로 device 가 registration 해 놓은 open call 로 mapping 됩니다. 따라서 디바이스에 해당하는 (tty에 해당하는) open 을 사용하면 되고요
질문을 정리하자면 말씀하신 printf , open 은 Kernel 이 지원해주는 Call 이고요 따라서 Kernel 이 이러한 function 의 기능을 구현해주는 녀석쯤이라고 보시면 됩니다. 더불어 printf 는 printk 로 대체 해서 사용하시면 되고요 .
printk 는 printf 와 같은 기능을 한다고 보시면 되지만 Local 로 접속된 Console 창에서만 보실수 있습니다. 다시말해 X 나 telnet 으로는 printk 로 출력되는 것을 보실수 없습니다.
물론 printf라든가..뭐이런 유저레벨의 함수는 커널에서 결과적으로 제공해주는 것이기 때문에...커널레벨에서는 이러한 함수들을 사용할수 없다는 것이죠..그렇죠..? ^^
그럼....커널레벨의 소스에서 open 함수를 쓰려는데...예를 들어서 "/dev/tty1"을 열어서 파일디스크립터 값을 얻고자 합니다. 근데 open은 유저레벨 함수이기 때문에 쓸수가 없고...그럼 "/dev/tty1"을 열어서 디스크립터 번호를 얻을수 있는 다른 방법은 없나요? 꼭 오픈 함수를 쓰지 않더라도 말이죠... 어떤한 방법으로든.... 실력이 딸려서 응용이 도무지 되지 않습니다. 솔직히 노력할만큼 노력했구요.. 감사합니다.
위에 해당하는 라인을 찾으실수 있을겁니다.
결과적으로 tty_open 을 호출 하시면 원하시는 결과를 얻을 수 있습니다. 이 함수를 호출하시기 위해서는
함수 정의가 끝나는 부분에 EXPORT_SYMBOL(tty_open); 을 추가하시고 (해당 함수가 Symbol Table 에 추가됩니다.) 커널안에서 사용하시면 됩니다.
> 왜 커널 레벨에서는 유저레벨 함수가 사용안되나요~~~~???
> 왜 커널 레벨에서는 유저레벨 함수가 사용안되나요~~~~???
리눅스 커널은 glibc와 같은 standard c 라이브러리를 사용하지 않습니다.
그러므로 당연히 printf, open등의 함수를 사용할 수가 없죠.
대신, 리눅스 커널은 그러한 기능들을 하는 함수를 일일이 만들어서 사용하고
있습니다(예를들어, printf와 같은 기능은 printk 함수가 대신합니다.).
OS 개념을 아셔야 될 것 같습니다.
예금자 -> 창구 언니 -> 은행금고 직원 -> 은행금고
예금자 입장에서 창구언니는 시스템 콜 인터페이스 입니다.
open(), close()등은 API에서 창구언니가 제공하는 서비스를 호출해서 구현되지요..
창구언니는 역시 은행금고직원이 제공하는 서비스를 이용해서 예금자의 요청을 적절히 처리합니다.
질문 올리신 분은 위의 조건중 은행금고직원이 하는 일을 프로그래밍 하고 계시다고 볼수 있습니다.
따라서 은행금고직원이 은행금고에 돈을 넣는 일을 창구언니에게 부탁할 수는 없는거죠..
OS 책들이 많이 있습니다. 그런 것들을 꼼꼼히 살펴보시면.. 도움이 많이 되실것 같네요.
그럼 왜 2.4에서는 되고 2.6에서는 안되는거죠?
2.4에서는 커널레벨에서 작업하다가 open함수도 쓰고
printf 함수도 쓸수 있거든요...하긴 중요한건 이게 아니고요~
그럼 2.6에서 유저레벨의 open 함수대신 사용할수 있는건 뭐예요? printf가 printk이듯이.... 파일 오퍼레이션 구조체에 있는 함수 포인터 그 ...open 말고요...고거는 유저레벨에서 불러줘야지만이 되니까요...가령 커널 레벨에서 /dev/tty1을 오픈하려고 할 경우... 그럴때 파일 디스크립터를 리턴 받아야 되는데요... 그 open 함수를 대신하는 건 무엇인가요..?
리눅스 커널에 올라가는 모듈은 그 자체로 OS의 일부입니다.OS는 그
리눅스 커널에 올라가는 모듈은 그 자체로 OS의 일부입니다.
OS는 그 자체로 존재하면서 말씀하신 printf등의 함수들에게
서비스를 제공해야 하는 입장인데 OS의 일부인 모듈이
그런 함수를 사용해서 만들어질 수 있다면 말도 안되는거죠.
------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!
Re: 그럼 왜 2.4에서는 되고 2.6에서는 안되는거죠?
/dev/tty1는 커널레벨과 유저레벨간의 시리얼 데이타를 교환하기 위한 하나게 게이트입니다. 그러므로 유저레벨에서 데이타를 사용하기 위해서 open을 콜하고 커널레벨에서는 시리얼 데이타를 인터럽트처리 루틴에서 가져올 수 있지 않나 싶습니다.
꿈은 이루어진다.
Re: 왜 커널 레벨에서는 유저레벨 함수가 사용안되나요~~~~???
Sys_Open 이 어떻게 동작하시는지 보시면 파일을 열 수
있습니다. 고운 하루되시길...
=========================
CharSyam ^^ --- 고운 하루
=========================
디바이스 드라이버에 디바이스를 등록할때 필요한 Call 들을 등록합니다.
디바이스 드라이버에 디바이스를 등록할때 필요한 Call 들을 등록합니다.
윗분 말씀대로 sys_open() 를 열면 파일 시스템의 경우는 VFS 를 통해 각각의 파일 시스템 구조에맞는 open call 로 mapping 되고요 (원리는 function pointer 입니다.) device 의 경우도 마찬가지로 device 가 registration 해 놓은 open call 로 mapping 됩니다. 따라서 디바이스에 해당하는 (tty에 해당하는) open 을 사용하면 되고요
질문을 정리하자면 말씀하신 printf , open 은 Kernel 이 지원해주는 Call 이고요 따라서 Kernel 이 이러한 function 의 기능을 구현해주는 녀석쯤이라고 보시면 됩니다. 더불어 printf 는 printk 로 대체 해서 사용하시면 되고요 .
printk 는 printf 와 같은 기능을 한다고 보시면 되지만 Local 로 접속된 Console 창에서만 보실수 있습니다. 다시말해 X 나 telnet 으로는 printk 로 출력되는 것을 보실수 없습니다.
open 함수...그러니까..
우선 답변 진심으로 감사합니다...
근데..솔직히 정리가 잘 안되네요....ㅠㅠ
물론 printf라든가..뭐이런 유저레벨의 함수는 커널에서 결과적으로 제공해주는 것이기 때문에...커널레벨에서는 이러한 함수들을 사용할수 없다는 것이죠..그렇죠..? ^^
그럼....커널레벨의 소스에서 open 함수를 쓰려는데...예를 들어서 "/dev/tty1"을 열어서 파일디스크립터 값을 얻고자 합니다. 근데 open은 유저레벨 함수이기 때문에 쓸수가 없고...그럼 "/dev/tty1"을 열어서 디스크립터 번호를 얻을수 있는 다른 방법은 없나요? 꼭 오픈 함수를 쓰지 않더라도 말이죠... 어떤한 방법으로든.... 실력이 딸려서 응용이 도무지 되지 않습니다. 솔직히 노력할만큼 노력했구요.. 감사합니다.
Kernel v2.4.30 을기준으로 말씀드리겠습니다./usr/src
Kernel v2.4.30 을기준으로 말씀드리겠습니다.
/usr/src/linux-2-4-30/drivers/char 에 가시면
tty_io.c 파일이 있습니다.
위에 해당하는 라인을 찾으실수 있을겁니다.
결과적으로 tty_open 을 호출 하시면 원하시는 결과를 얻을 수 있습니다. 이 함수를 호출하시기 위해서는
함수 정의가 끝나는 부분에 EXPORT_SYMBOL(tty_open); 을 추가하시고 (해당 함수가 Symbol Table 에 추가됩니다.) 커널안에서 사용하시면 됩니다.
Dig it.
filp_open() 함수를 쓰면...
비록 디스크립터 번호는 얻지 못하지만...
struct file을 리턴해주기 때문에 ... 사용해보세요~
댓글 달기