커널과 인터럽트에 대해서 몇몇 질문들

declspec의 이미지

1. 커널 모듈이나 윈도우 디바이스드라이버처럼 커널메모리상에서 작동하는 프로그램의 코드를 짤때에
cli(clear inturrupt?)
sti(store inturrupt?)
이런식으로 뭔가 중요한걸 하기전에 인터럽트를 막아놓고
작업을 끝내고 다시 복원을 하는 경우가 많은것 같던데
이게 구체적으로 어떤 의미가 있을까요?
x86 어셈블리 명령 cli 로 CPU 인터럽트를 막는다는 행위는
CPU 에게 전달되는 모든종류의 인터럽트를(하드웨어 신호나, 시스템콜 호출등)
무시한다는 의미인가요?
이것을 하는 이유가 뭔가요?

2. 유저 프로그램들은 특정 쓰레드의 명령들이 수행되고있다가 CPU 타이머 인터럽트가 걸리면
자동으로 Context Switching 이 일어나서 해당 쓰레드의 상태는 임시저장되고 다른 쓰레드의 명령이
스케줄링에 의해 살아나서 돌아가는것으로 알고 있는데요... 커널 디바이스드라이버의 코드가 수행될때는
이러한 마찬가지로 발생하나요? 아니면 이건 코드수행이 종료될때까지 Context Switching 이 안일어나나요?
제가알기로 디바이스드라이버 코드에서 무한루프 돌리면 시스템 전체가 다운되던데 이게 커널코드 수행중일때는
Context Switching 이 일어나지 않아서 그런걸까요?

3. 디바이스 드라이버는 메모리에 올라가면 초기화 루틴 한번 수행해주고 나머지는
일단 가만히 있다가 뭔가 이벤트가 발생했을때 관련 코드가 수행된다고 하는게 맞는말인가요?
마치 윈도우 어플리케이션이 이벤트 드리븐 이듯이... 디바이스 드라이버의 read, iotcl 등 구현된
major function 들을, 콜백함수나 이벤트 핸들러라고 부를수 있을까요?

4. 윈도우의 sys 파일이나 리눅스의 ko 파일처럼 디바이스 드라이버 모듈도 나름대로의
바이너리 포맷이 있겠죠?(PE, ELF 와 같은...) 그 포맷의 이름은 무엇이고 그 구조에 대해서
공부할수 있는 책이나 문서가 있다면 알려주세요

dbdan의 이미지

1번은 (강남역 사랑의교회 담임 오정현 씹예수의 윤난영後皇을 모르겠지만) 인터럽트핸들러가 커널메모리에 있는 구조체를 변경하다가 다른 인터럽트가 걸리면 커널이 오류가 생길수도 있으니까 막는것 같네요 x86에서는 NMI는 막을수 없다더군요
2번은 타이머인터럽트가 걸려도 유저쓰레드의 타임슬라이스가 남아있고 sleep();같은 함수를 호출하지 않는이상 다른 유저쓰레드로 컨텍스트전환이 일어나는지는 모르겠구요
타이머인터럽트핸들러가 인터럽트컨트롤러나 타이머장치에 접근하고 나서는 커널쓰레드 등을 실핼할지 결정하겠죠. 리눅스 2.6부터인가 디바이스드라이버가 커널 선점이라는 것을 지원해서 디바이스드라이버도 선점될 가능성이 있다더군요
3번은 디바이스드라이버가 커널쓰레드를 만드는 경우가 있으니까 완전히 이벤트드리븐이라고 할 수 있는지는 모르겠네요
4번은 PE랑 ELF가 맞을것 같군요. PE는 어떤 한국분이 책도 만드셨던데 http://kangcom.com/sub/view.asp?sku=200505130005&mcd=571
whql.microsoft.com이나 microsoft.com에서 PE32+로 검색하시면 PE파일은 분석하실수 있으실거고
ELF는 위키를 보시면 되겠군요 http://en.wikipedia.org/wiki/Executable_and_Linkable_Format#Specifications

익명 사용자의 이미지

1. atomic operation을 구현하는 가장 손쉬운 방법입니다.

2. case-by-case입니다. context switching을 할 수 있는 context에서는 context switching을 할 수 있으나 그렇지 않을 경우에는 못합니다. context switching을 할 수 없는 경우에는 강제로 context switching을 시도하면 BSOD나 kernel panic을 맛볼 수 있습니다.

3. 이해의 문제라면 major function 등을 이벤트 핸들러처럼 이해해도 관계는 없습니다.

4. ko는 ELF입니다. 마찬가지로 sys는 PE입니다.

declspec의 이미지

많이 도움 되었습니다~~
1 의 경우 어떨때는 작업 앞뒤에 cli, sti 를 안쓰고 어떨때는 쓰고 하는데 그 차이가 OS 자원에 접근유무인것이겟죠?
2번은 뭔가 공부를 더 해야할듯하고
4번은 ko, sys 가 ELF, PE 인것이 의외네요

자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.

댓글 달기

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