왜 커널 레벨에서는 유저레벨 함수가 사용안되나요~~~~???

jjangiya의 이미지

정말 미쳐버리겠에요~!

커널 2.4에서는 되고요, 2.6에서는 안되는데요~

가령 커널 모듈 소스라고 가정할때

printf(), open(), 등등 이런 유저레벨의 함수들은 사용이 안되네요!

커널레벨 함수만 사용가능한데~ 정말...왜그래요?

누가좀 아시면 좀 도와 주세요!
3일째 컴퓨터 앞에만 앉아서 머리 싸메고 있습니다.

익명 사용자의 이미지

> 왜 커널 레벨에서는 유저레벨 함수가 사용안되나요~~~~???
리눅스 커널은 glibc와 같은 standard c 라이브러리를 사용하지 않습니다.
그러므로 당연히 printf, open등의 함수를 사용할 수가 없죠.
대신, 리눅스 커널은 그러한 기능들을 하는 함수를 일일이 만들어서 사용하고
있습니다(예를들어, printf와 같은 기능은 printk 함수가 대신합니다.).

익명 사용자의 이미지

예금자 -> 창구 언니 -> 은행금고 직원 -> 은행금고

예금자 입장에서 창구언니는 시스템 콜 인터페이스 입니다.
open(), close()등은 API에서 창구언니가 제공하는 서비스를 호출해서 구현되지요..

창구언니는 역시 은행금고직원이 제공하는 서비스를 이용해서 예금자의 요청을 적절히 처리합니다.

질문 올리신 분은 위의 조건중 은행금고직원이 하는 일을 프로그래밍 하고 계시다고 볼수 있습니다.
따라서 은행금고직원이 은행금고에 돈을 넣는 일을 창구언니에게 부탁할 수는 없는거죠..

OS 책들이 많이 있습니다. 그런 것들을 꼼꼼히 살펴보시면.. 도움이 많이 되실것 같네요.

익명 사용자의 이미지

2.4에서는 커널레벨에서 작업하다가 open함수도 쓰고
printf 함수도 쓸수 있거든요...하긴 중요한건 이게 아니고요~

그럼 2.6에서 유저레벨의 open 함수대신 사용할수 있는건 뭐예요? printf가 printk이듯이.... 파일 오퍼레이션 구조체에 있는 함수 포인터 그 ...open 말고요...고거는 유저레벨에서 불러줘야지만이 되니까요...가령 커널 레벨에서 /dev/tty1을 오픈하려고 할 경우... 그럴때 파일 디스크립터를 리턴 받아야 되는데요... 그 open 함수를 대신하는 건 무엇인가요..?

cronex의 이미지

리눅스 커널에 올라가는 모듈은 그 자체로 OS의 일부입니다.
OS는 그 자체로 존재하면서 말씀하신 printf등의 함수들에게
서비스를 제공해야 하는 입장인데 OS의 일부인 모듈이
그런 함수를 사용해서 만들어질 수 있다면 말도 안되는거죠.

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

linuxs의 이미지

오래된 남자 wrote:
2.4에서는 커널레벨에서 작업하다가 가령 커널 레벨에서 /dev/tty1을 오픈하려고 할 경우... 그럴때 파일 디스크립터를 리턴 받아야 되는데요... 그 open 함수를 대신하는 건 무엇인가요..?

/dev/tty1는 커널레벨과 유저레벨간의 시리얼 데이타를 교환하기 위한 하나게 게이트입니다. 그러므로 유저레벨에서 데이타를 사용하기 위해서 open을 콜하고 커널레벨에서는 시리얼 데이타를 인터럽트처리 루틴에서 가져올 수 있지 않나 싶습니다.

꿈은 이루어진다.

charsyam의 이미지

jang2000act wrote:
정말 미쳐버리겠에요~!

커널 2.4에서는 되고요, 2.6에서는 안되는데요~

가령 커널 모듈 소스라고 가정할때

printf(), open(), 등등 이런 유저레벨의 함수들은 사용이 안되네요!

커널레벨 함수만 사용가능한데~ 정말...왜그래요?

누가좀 아시면 좀 도와 주세요!
3일째 컴퓨터 앞에만 앉아서 머리 싸메고 있습니다.

Sys_Open 이 어떻게 동작하시는지 보시면 파일을 열 수
있습니다. 고운 하루되시길...

=========================
CharSyam ^^ --- 고운 하루
=========================

익명 사용자의 이미지

디바이스 드라이버에 디바이스를 등록할때 필요한 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"을 열어서 디스크립터 번호를 얻을수 있는 다른 방법은 없나요? 꼭 오픈 함수를 쓰지 않더라도 말이죠... 어떤한 방법으로든.... 실력이 딸려서 응용이 도무지 되지 않습니다. 솔직히 노력할만큼 노력했구요.. 감사합니다.

a287848의 이미지

Kernel v2.4.30 을기준으로 말씀드리겠습니다.
/usr/src/linux-2-4-30/drivers/char 에 가시면
tty_io.c 파일이 있습니다.

static struct file_operations tty_fops={
llseek: no_llseek;
...
...
open: tty_open;
};


위에 해당하는 라인을 찾으실수 있을겁니다.
결과적으로 tty_open 을 호출 하시면 원하시는 결과를 얻을 수 있습니다. 이 함수를 호출하시기 위해서는
함수 정의가 끝나는 부분에 EXPORT_SYMBOL(tty_open); 을 추가하시고 (해당 함수가 Symbol Table 에 추가됩니다.) 커널안에서 사용하시면 됩니다.

Dig it.

jjangiya의 이미지

비록 디스크립터 번호는 얻지 못하지만...

struct file을 리턴해주기 때문에 ... 사용해보세요~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.