x86 환경에서 Kernel Mode -> User Mode 전환시

awdxawdx101의 이미지

x86 환경에서 Kernel Mode -> User Mode 전환시 Kernel stack이 모두 초기화 되어서 문제가 생기고, 이 문제를 해결하기 위해 setup_frame(), sigreturn() 함수를 사용한다고 합니다.

초기화 때문에 문제가 발생하는 거라면, 초기화하지 않으면 되는거 아닌가요?

왜 굳이 초기화를 해서 문제를 만드는지 궁금합니다.

또 초기화하지 않으면 생기는 문제가 있는건가요?

AustinKim의 이미지

> Kernel stack이 모두 초기화 되어서 문제가 생기고

Kernel stack은 커널 공간의 프로세스의 스택을 말씀하시는 것 같은데요.
문제가 생겼다(문제가 생기고)고 하셨는데 구체적으로 어떤 문제인지 알려주셔야 적절한 답을 드릴 수 있을 것 같아요.

(개인블로그)
http://rousalome.egloos.com

awdxawdx101의 이미지

저도 그걸 몰라서 질문드렸습니다 ㅎㅎ.. signal handler 설명에 이렇게 적혀있는걸 봤습니다.

User Mode에서 Kernel Mode로 진입시 User Mode에서 사용중이던 context를 Kernel stack에 저장합니다.
Kernel Mode에서 User Mode로 진입시 Kernel stack은 모두 초기화됩니다.
이러한 문제를 해결하기 위해 setup_frame(), sigreturn() 함수를 사용합니다.
setup_frame() : User Mode의 stack을 설정
sigreturn() : Kernel Mode stack에 hardware context를 복사하고, User Mode stack의 원래의 content를 저장한다.

아니면 발생할 수 있는 문제가 여러가지인가요?

원문 : https://www.lazenca.net/display/TEC/01.SROP%28Sigreturn-oriented+programming%29+-+x86

AustinKim의 이미지

위에서 언급하신 내용을 조금 더 부연해 설명을 드립니다.

>User Mode에서 Kernel Mode로 진입시 User Mode에서 사용중이던 context를 Kernel stack에 저장합니다.

유저 모드에서 커널 모드로 바뀔 때 유저 공간에서 실행 중인 레지스터 세트는 (커널 공간에 있는) 프로세서의 스택 공간에 저장합니다.

>Kernel Mode에서 User Mode로 진입시 Kernel stack은 모두 초기화됩니다.

커널 모드에서 유저 모드로 진입을 할 때 (커널 공간에 있는) 프로세서의 스택 공간에 저장된 유저 공간에서 실행 중인 레지스터 세트를 다시 로딩합니다.
이때 (커널 공간에 있는) 프로세서의 스택 공간에 저장된 유저 공간에서 실행 중인 레지스터 세트는 초기화됩니다.

>이러한 문제를 해결하기 위해 setup_frame(), sigreturn() 함수를 사용합니다.

위에서 설명한, 시그널을 처리할 때 예전에 유저 모드에서 커널 모드로 바뀔 때 유저 공간에서 실행 중인 레지스터 세트를 유저 모드의 스택 공간에 다시 저장합니다.
이 이유는 시그널 핸들러를 호출하고 난 후 유저 모드에서 커널 모드로 바뀔 때 유저 공간에서 실행 중인 레지스터 세트를 다시 백업하기 위해서입니다.

(개인블로그)
http://rousalome.egloos.com

awdxawdx101의 이미지

답변 감사합니다.

여기서 제가 궁금한건, 초기화를 해서 생기는 "문제"라는게 어떤 문제인지, 또 이게 초기화가 원인이라면 초기화를 안하면 되는것 아닌지, 초기화를 안했을 때 생기는 문제가 무엇인지 궁금합니다.

혹시 이 궁금증에 대한 힌트를 얻을만한 도움이되는 사이트나 필요한 공부가 있나요?

AustinKim의 이미지

시그널에 대한 전반적인 실행 흐름은 아래 블로그에 잘 정리돼 있고;
http://studyfoss.egloos.com/5182475

세부 커널 동작에 대해서는 제 블로그에 포스팅된 글을 보셔도 좋습니다.
http://rousalome.egloos.com/10002469

(개인블로그)
http://rousalome.egloos.com

댓글 달기

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