User space에서 Kernel space로 데이터 Push

mandugukbap의 이미지

리눅스 환경에서 User space의 데이터를 Kernel space로 푸쉬하려고 합니다. 좀 더 정확히 설명 드리자면, glibc에서 여러 정보를 Kernel space로 보내고, Kernel space에서는 이 정보를 임시로 저장하고 있다가 TCP connection을 생성할 때 옵션등의 목적으로 사용하도록 하려고 합니다.

우선 User space에서 Kernel space로 데이터를 Push하는 방법과 TCP 스택에서 이 정보를 사용하는 방법을 알고 싶습니다.

인터넷 어딘가에 사용예가 있을 법도 한데, 제가 원하는 것과 같은 사례는 찾기가 쉽지 않네요. 아시는 분이 계시면 좀 알려 주셨으면 좋겠습니다.

감사합니다.

mandugukbap의 이미지

refresh

익명 사용자의 이미지

사용자영역에서 커널영역으로 데이타푸시라...의도가 잘 짐작되지 않습니다만
어떤 응용이 커널로 데이타를 보내고자 할 때
그 프로세서의 데이타는 사용자영역 메모리영역에 있습니다.
이걸 write 따위의 함수호출하면 커널의 시스템함수 호출이 일어나고 커널이 사용자메모리에 있던 데이타를 커널영역으로 복사해 가는 것이지요.즉 사용자 프로세서가 푸시하는게 아니라 커널함수가 복사해 가는 것입니다.
설명이 좀 그런데 다른말로 하면
예를들어 1기가 커널 + 3기가 사용자 영역으로 부팅된 시스템이라면 정상적인 방법으로 사용자 프로세서는 1기가 영역안에 데이타 쓰기를 할 수 없습니다.단지 커널이 긁어가도록 요청만 할 수 있을 뿐이지요.
그런 요청(시스템호출 :socket 나 open 후 쓰기)이 발생하면 커널은 여러 조건검사를 하고 버퍼할당을 하고 사용자영역에 있는 데이타를 미리 정해진 크기단위로 메모리:메모리 로 복사해 갑니다.여기에 사용자가 끼어들면 커널 메모리가 오염되겠죠.

"~~ glibc에서 여러 정보를 Kernel space 로 보내고, Kernel space에서는 이 정보를 임시로 저장하고 있다가 TCP connection을 생성할 때 옵션등의 목적으로 사용하도록 하려고 합니다."

이 문구는
응용이 라이브러리 함수를 호출해서 결국 커널의 시스템 함수 호출이 일어나기 시작할 때부터의 여러 옵션사항을 직접 제어하겠다는 말로 들립니다.
그게 맞다면 이는
커널의 (ipv4의 경우) TCP/IP 루틴을 직접 조작해서 재컴파일 하는 방법을 말하는 겁니다.
단지 ipv4 루틴(사실 이코드를 자유자재로 만지는 것도 엄청나지만)만 알아서 되는 것도 아니고 task,메모리 관련 커널 코드를 전부 알아야 합니다.

mandugukbap의 이미지

답변 감사 드립니다.

제가 TCP/IP 스택을 직접 조작하려는 것은 맞습니다만 비슷한 규모의 다른 프로젝트들을 보건데 지레 겁을 먹을 정도는 아닌 것으로 판단됩니다.

제가 적당한 단어를 몰라 일반적인 표현으로 Push라고 표현 했지만, 커널 스페이스에서 긁어 가던 유저스페이스에서 밀어 넣던 결과만 같으면 상관 없을 것 같습니다. 대충 새로운 시스템콜 작성만으로도 간단한 정보를 커널스페이스로 내려 보내는 것은 가능하더군요.

유저 스페이스에서 내려 보낸 정보를 커널 스페이스에 저장했을 때, 님 말씀대로 커널 영역의 메모리가 오염되는지 안 되는지는 한 번 테스트를 해 봐야 할 것 같습니다. 이 부분에 대한 궁금증이 있는데 다른 쓰레드로 질문을 올리도록 하겠습니다.

아무튼 많은 지식을 전해 주셔서 감사합니다.

freemckang의 이미지

Netfilter등을 사용해서 packet을 hooking을 하는 방법부터 찾아보시는게 좋지 않을까 싶은데요...

GLIBC를 사용한다는게 무슨 의미인지 잘 이해가 안가는데요. 일반적인 open() / read() / write() 를 사용하시겠다는 의미이신지..?

만약 그렇다면 packet을 hooking하는 device driver를 하나 만들고, 해당 device driver에 write를 해서 data를 넘겨주면 data를 가지고 있다가 원하는 packet이 나왔을 때 사용하면 되지 않을까 싶은데요..

句日新, 日新 日新 又日新.

mandugukbap의 이미지

답변 감사 드립니다.

GLIBC를 이용하는 이유는 URL에서 IP로 해석하는 dns resolver 부분을 수정해서 일반적인 resolver가 반환하는 정보보다 더 많은 정보를 얻어낸 후, 그 정보 중 일정 부분을 커널 스페이스에 밀어 넣어 (push 혹은 뭐라고 부르던 간에) 커널 스페이스의 메모리 공간에 임시적으로 보관하는 방법을 찾기 위해서 입니다.

디바이스 드라이버를 쓸 예정이었는데, 간단한 시스템콜 하나를 만들어서 유저 스페이스에서 Hello라는 문자열을 파라미터로 넣어서 호출을 했더니 커널 영역에서 출력이 되더군요 (dmesg로 확인 했을 때).

그래서, 그냥 그런식으로만 보내고 커널영역의 전역 변수를 이용해 해당 메세지를 잠시 저장하면 간단하지 않을까 생각하고 있습니다. 이게 혹시 커널 영역을 오염시킬까요?

freemckang의 이미지

Memory가 깨지느냐? 라고 말씀하신 것으로 이해하겠습니다.

답부터 말씀드리면, 아닙니다. 정상적인 동작을 거쳐서 (kmalloc이던 다른 방법이던) memory를 사용하신다면 문제가 없을 것으로 보입니다. 잘 알고 계신 것처럼 kernel도 program의 하나이기 때문에...

해당 전역변수를 kernel binary안에서만 사용한다거나 module에서 사용하여도 하나의 module에서만 사용하신다면 그냥 써도 문제는 없겠지만 binary에서 정의하고 module에서 사용하시려면 EXPORT_SYMBOL()이 필요합니다. 알고 계시겠지만.. 혹시나해서 써봅니다.

그럼, 하시는 일이 잘 되시길 바라겠습니다.

句日新, 日新 日新 又日新.

mandugukbap의 이미지

상세하고도 건설적인 답변 감사드립니다.

커널은 TCP 윈도우 사이즈 값 변경같은 자잘한 일 이외에는 손을 대 본 적이 없어서 freemckang님께서 전해주시는 단어 하나 하나가 저에겐 꿀같은 정보입니다.

특히, 커널 전역 변수 사용 관련해서 알아야 할 것이 있나 궁금하던 참이었는데 EXPORT_SYMBOL()에 대해 알아봐야 겠습니다.

익명 사용자의 이미지

커널에서 미리 정의된 변수를 혼용하지 않게 프로그램을 작성하신다면 결코 오염될 일은 없겠습니다.
단지, 커널영역에 무언가를 저장하고자 하시는 것으로 보이는데요, 커널 스페이스 메모리 영역도 한계가 있음은 아시겠지요. 이에 대한(오버플로우) 대응 전략은 미리 가지셔야겠습니다.
프로토타입(데모용?)을 만드시는게 아니라면, 가급적 디바이스 드라이버/커널모듈로 작성할 것을 권고합니다.
"리눅스 디바이스 드라이버" 라는 책을 권합니다.

mandugukbap의 이미지

답변 감사 드립니다.

요즘엔 책은 사 놓고도 읽질 않아서 점점 손이 가질 않네요. 가급적 인터넷 검색으로 문제들을 해결할려고 노력 중입니다.

커널 영역에 저장할 정보는 4 Bytes 에서 400 Bytes 정도일꺼고 한 번 사용 후에는 지워지는 내용이기 때문에 오버플로우 걱정은 없을 것으로 생각 됩니다.

디바이스 드라이버로 작성을 하는게 권장되는 방식이란 것을 알게 되어서 다행입니다. 하마터면 발 프로그래밍을 할 뻔 했습니다. 이런 충고가 참 값진 것 같습니다.

댓글 달기

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