커널 프로그래밍에 관한 질문입니다.

sr97의 이미지

커널 프로그래밍을 하고 있는데 역시 메모리와 파일접근이 문제가 되네요..
커널에서 동적으로 (kmalloc로) 할당받을 수 있는 메모리의 한계가 어디까지인지요?

그리고 커널 모듈의 정보를 기록하기 위해 파일을 접근해야 하는데 커널 API를 봐도 그렇고 자료를 찾아봐도 파일 접근하는 방법을 찾기가 만만치 않네요..

고수님들의 조언 부탁드립니다.

hb_kim의 이미지

sr97 wrote:
커널에서 동적으로 (kmalloc로) 할당받을 수 있는 메모리의 한계가 어디까지인지요?

모듈을 만들기 위해 kmalloc 이 할당할 수 있는 한계를 알아야 한다면 모듈 디자인이 뭔가 잘못된 것입니다. 다른 커널 모듈과, 유저 프로그램이 원활하게 돌아갈수 있도록 모듈에서는 최소한의 메모리를 사용해야죠.

그래도 궁금하시면 밑에 있는 코드를 초기화 부분에 넣고 테스트 해보세요. 참고로 제 1G 시스템에서는 대략 600MB 까지 할당되는군요.

    {
        void **ptrarray;
        int i, j;
        ptrarray = kmalloc(100000, GFP_ATOMIC);
        if (ptrarray == NULL) {
            printk("Error kmalloc(100000)!\n");
        } else {
            for (i = 0; i < 100000; i++) {
                ptrarray[i] = kmalloc(100000, GFP_ATOMIC);
                if (ptrarray[i] == NULL) {
                    break;
                }
            }
            j = i;

            for (i = 0; i < j; i++) {
                kfree(ptrarray[i]);
            }
            printk("Error kmalloc(100000) at %d!\n", j);
        }
        
    }

sr97 wrote:
그리고 커널 모듈의 정보를 기록하기 위해 파일을 접근해야 하는데 커널 API를 봐도 그렇고 자료를 찾아봐도 파일 접근하는 방법을 찾기가 만만치 않네요..

커널 프로그래밍에서는 파일 접근이 되지 않습니다. printk() 를 써서 이벤트를 로그하는 방법을 쓰는 것이 실제로 쓰는 방법입니다. 만약 다른 커널 로그 메시지와 섞이지 않는 독자적인 이벤트 로그가 필요하다면 printk() 와 비슷한 구조로 새로 만드시면 됩니다. 커널에서는 링 버퍼로 이벤트를 큐하고 이를 proc 파일이나 다른 파일로 export 하고, 유저모드 대몬에서는 이를 읽어서 역시 파일에 역시 링 버퍼로 저장하면 됩니다.

ahgod의 이미지

sr97 wrote:
커널 프로그래밍을 하고 있는데 역시 메모리와 파일접근이 문제가 되네요..
커널에서 동적으로 (kmalloc로) 할당받을 수 있는 메모리의 한계가 어디까지인지요?

kmalloc을 얼마나 많이 잡을 수 있느냐는 윗 분이 얘기하신거 같구요, 혹시나 해서 올립니다 kmalloc으로 한번에 잡을 수 있는 동적 메모리의 한계는 128KB까지 입니다. 혹시나 이 부분을 물어보신거면 도움이 되시길...

sr97 wrote:
그리고 커널 모듈의 정보를 기록하기 위해 파일을 접근해야 하는데 커널 API를 봐도 그렇고 자료를 찾아봐도 파일 접근하는 방법을 찾기가 만만치 않네요..

윗 분이 얘기하신 Proc을 쓰는 것이 가장 적당한 방법인거 같구요, 이 부분을 구현하실라면 Proc에 관계된 Handler를 등록하셔야 되요... (create_proc_read_entry, remove_proc_entry, ...) 이렇게 하면 /proc/밑에 지정된 File로 정보를 전달할 수 있습니다. User Level에서는 그 파일을 쓰거나 읽음으로서 정보를 전달할 수 있습니다. 이 외의 방법이라면 proc과 같은 원리로 ioctl을 이용하여 정보를 전달하고 이것을 user영역의 application에서 file로 저장하는 방법도 있습니다. 그럼...

고수님들의 조언 부탁드립니다.

sr97의 이미지

답변 감사합니다.

emptysky의 이미지

보통 sys_call_table 을 extern 시키고
레드헷 커널버젼 2.4.18버젼(가물가물 -_-?) 이상일시엔 sys_call_table을
커널 주소를 강제로 export 시킨후 sys_open등의 시스템콜을 사용하시면 됩니다.
이호님의 (linuxkernel.net) 어드벤스 모듈프로그래밍이란 글에 잘나와있구요

새해 복 많이받으시길~ :D

『 아픔은.. 아픔을 달래줄 약이 무엇인지 알면서도 쓰지 못할 때 비로소 그 아픔의 깊이를 알수가 있음이다. 』
『 for return...』

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.