Window 운영체제 질문있습니다.

kyj_kr의 이미지

안녕하세요.
리버싱을 공부하다가 운영체제나 컴퓨터구조에 조금만 깊게 들어가면 헷갈려서 질문 드립니다.

1. 커널이 메모리, 프로세스, 입출력을 관리할때에 본질적으로는 CPU가 커널의 특정명령어(메모리를 할당하라, 이제 다른 프로세스로 넘어가서 작업하라 등등)를 실행함으로써 추상적으로 커널이 관리한다! 라고 정의내린건가요?

2. 운영체제의 커널 또한 하나의 소프트웨어이지요. 헌데, 어떻게 이 소프트웨어가 CPU를 제어하여 메모리를 관리하고, 프로세스를 관리하고, 입출력을 관리할 수 있게 되는거지요?? (커널 내 코드의 예시를 들어주시면 더 감사합니다!)

3. 가상메모리를 공부하면서 커널영역에 대해 듣게되었습니다. 32비트 기준으로 각 프로세스마다 4GB의 메모리가 할당이 되고, 그 중 2GB가 커널영역으로 할당이 된다고 알고 있습니다. 그럼 실제 메모리에 로딩되어있는 커널 프로세스는, 커널 프로그램 전체가 로딩이 되어있는 상태이고 가상메모리에 있는 부분은 전체 커널 프로세스 중 일부분만 저장되어있는건가요?

알려주십쇼,,

익명 사용자의 이미지

운영체제 책보면 나오는데... 질문하는 거는 넷상에서 수십줄~수백줄로 답변할 수 있는 부분이 아닙니다.
컴퓨터 말고, 리눅스 펌웨어가 들어있는 공유기를 생각해보자고요.

1번 질문의 경우, 반대로 생각하면 CPU 주제에, 랜선을 타고 들어오는 데이터를 지가 어떻게 알까요?
랜선을 타고 들어오는 데이터가 패킷인지.. 쓰레기인지 CPU 주제에 알길이 있을까요?

2번 질문의 경우, 운영체제 모든 걸 하지는 않습니다. 메인보드 펌웨어에서 하는 게 있고, CPU 에서 하는게 있고 그렇죠. 제가 아는게 없으므로 패스합니다. 꼭 커널만을 생각하실게 아니라, 커널하면 드라이버도 포함되어 있으니까, 장치 드라이버(device driver)가 왜 장치를 관리를 할 수 없는지... CPU 도 드라이버라는게 있고, 펌웨어가 있는데...

3번의 경우, 구현마다 다를 거 같고, 운영체제 보면 가상 페이징 챕터가 있을 겁니다. 그걸 보시기 바랍니다.
님 의문은 넷상에서 수십~수백줄의 답변으로 풀리지는 않을 것이라 봅니다.

익명 사용자의 이미지

위 익명이란 동일인입니다. 아.. 맞다...
마이컴(마이크로 컨트롤러) 실습을 하시면 의문이 풀리지 않을까요.

라스코니의 이미지

2. 그 소프트웨어(커널)가 CPU를 독점하고 있다고 생각하시면?
3. case-by-case 로 다르겠지만 커널마저 전체 메모리에 올라가지 못한다면 너무 성능 저하가 심할 것 같은 생각이 드네요.

익명 사용자의 이미지

Quote:
1. 커널이 메모리, 프로세스, 입출력을 관리할때에 본질적으로는 CPU가 커널의 특정명령어(메모리를 할당하라, 이제 다른 프로세스로 넘어가서 작업하라 등등)를 실행함으로써 추상적으로 커널이 관리한다! 라고 정의내린건가요?

2. 운영체제의 커널 또한 하나의 소프트웨어이지요. 헌데, 어떻게 이 소프트웨어가 CPU를 제어하여 메모리를 관리하고, 프로세스를 관리하고, 입출력을 관리할 수 있게 되는거지요?? (커널 내 코드의 예시를 들어주시면 더 감사합니다!)

다소 흥미로운 관점이군요.

제가 컴퓨터에다가 계산기 어플리케이션을 실행시켰다고 합시다. 하드웨어와 소프트웨어 중 제가 하고 싶은 계산을 하고 있는 것은 무엇일까요?

물론 계산에 필요한 하드웨어는 CPU에 처음부터 내장되어 있었죠. 그렇다고 소프트웨어의 역할이 없었다고 할 수 있을까요?

물론 우리는 소프트웨어를 끄거나, 지우거나, 다른 것으로 대체하는 식으로 하드웨어로부터 분리해 낼 수 있습니다. 하지만 소프트웨어가 실행 중인 한, 우리는 소프트웨어와 하드웨어가 결합하여 어떤 기능을 구현했다고 말할 수 있습니다. 둘 중 어느 한 쪽에만 크레딧을 주는 건 다소 이상한 해석이죠.

윈도우즈를 비롯한 운영체제가 컴퓨터를 제어하기 위한 메커니즘은 하드웨어에 이미 다 갖추어져 있어요. 운영체제는 그걸 적절히 활용하는 겁니다. 애초에 그러기 위해 만들어진 소프트웨어이기도 하고요.

kyj_kr의 이미지

감사합니다!

윈도우즈를 비롯한 운영체제가 컴퓨터를 제어하기 위한 메커니즘은 하드웨어에 이미 다 갖추어져 있어요. -> 이 말씀에선 컴퓨터를 제어하기 위한 메커니즘을 CPU가 메모리와 주변장치들과 통신할 수 있는 하드웨어적 구현이 되어있고, 그 하드웨어 구현을 소프트웨어적 절차로 이용할 수 있는게 운영체제라는건가요?

익명 사용자의 이미지

리모컨으로 TV 를 껐다 켰다 그거를 생각해보세요.
TV 를 껐다 켰다 하는 기능은 하드웨어/펌웨어적으로 TV 안에 모두 갖춰져 있어요.
리모컨으로 신호를 보내면 TV 가 꺼졌다 켜졌다 하죠.

그러면, TV = 컴퓨터,
리모컨 = 운영체제.

이렇게 바꿔서 생각해보세요. 당연한거에 대한 의문을 가지시니까 설명 드리기도 뭐하네요.
간단한 8088 같은 마이컴 실습을 해보시던가.. 아니면,
DAC 칩 같은거 스펙 문서라도 좀 읽어보시던가 그러면 어떻게 펌웨어로 전자 스위치를 껐다 켰다 하는지,
스위치를 껐다 켰다 하려면 어느 핀에 무슨 신호를 보내야 하는지 설명이 나와요.
그리고 어느 메모리 주소에 뭘 쓰면 어떤 기능이 활성화/비활성화 되고 그렇거든요.
이미 그런 기능이 하드웨어적으로 있는거고,
그걸 제어하는 소프트웨어로 구현해서 펌웨어로 만들어서 칩 안에다 넣는거죠. 그러면 칩 안에서 논리회로가 작동되는 거랍니다. 컴퓨터도 그런 식으로 돌아가는 겁니다.

kyj_kr의 이미지

댓 상세히 달아주셔서 감사합니다!
혹시 3번 질문 내용도 알고계시면 설명 부탁드려도 될까요?

Stephen Kyoungwon Kim@Google의 이미지

cpu는 가급적 최소한의 연산만 제공합니다. 어떤 소프트웨어는 그 연산들을 엮어서 추상 수준이 더 높은 연산을 구현합니다. 그리고, 다른 소프트웨어는 그걸 엮어서 한 단계 더 추상 수준이 높은 연산을 구현하고요.

예컨대, strcpy 같은 함수만 해도, CPU가 이런 인스트럭션을 지원하는 경우는 별로 없을 겁니다. CPU는 아마도 메모리의 어디서부터 어느 정도 크기를 어디로 카피하라는 정도밖에 안 해줍니다. 소프트웨어는 그런 연산들을 엮어서 strcpy를 구현하는 거죠. 그리고 strcpy도 사실 쓰기 편하지 않습니다. 그래서 strcpy 같은 상대적으로 저수준 함수를 엮어다가 더욱 고수준의 함수를 구현하고요.

커널도 마찬가지입니다. 하드웨어가 process나 메모리를 관리한다고 하기에는 하드웨어는 현재 소프트웨어가 필요로 하는 상대적으로 최소한의 연산만을 제공합니다. 더 많이 제공할수록 더 비싸지구요. 더 복잡한 연산을 제공할수록 범용성이 떨어지고 따라서 가성비도 대체로 떨어질 위험성이 있습니다.

하드웨어가 어디까지 해줄 거고 소프트웨어가 어디서부터 맡을 거냐는 오랜 트레이드 오프 문제 같습니다.

"process"나 메모리 관리를 하드웨어가 한다고 하기에는 그 둘의 추상 수준이 매우 높습니다. 하드웨어는 프로세스나 메모리 관리를 위한 원초적인 연산만 제공하고, 나머지는 소프트웨어가 그걸 묶어서 프로세스니 메모리 관리니 하는 추상을 만듭니다. 그게 커널 코드가 하는 일이고요.

2번에 대해 대답하자면, 커널 코드는 사용할 수 있는 명령어 집합도 유저 코드보다 많고 (특히 자기 자신의 프로세스에 속한 것 말고 남의 것 혹은 시스템에 공유되는 것을 건드리기 위한 명령어는 대충 말해서 커널 코드가 수행할 수 있습니다), 커널 코드가 수행되기 시작하는 방식, 그러니까 컨트롤을 확보하는 방식도 유저 코드와 다릅니다. 예컨대 10ms마다 라운드 로빈 방식으로 스케쥴링을 하는 시스템이라면, 보통 하드웨어 상에서 타이머와 인터럽트가 있습니다. 10ms가 되면 클락을 리셋하고, 메모리 특정 위치에 가서 핸들러의 주소를 읽은 다음 그걸 수행합니다. 거기 커널 코드가 적히지 유저 코드가 적히지 않는 것도 이를테면 커널이 스케쥴링을 할 수 있고 유저 코드는 못하는 이유 중 하나입니다.

kyj_kr의 이미지

감사합니다!

"process"나 메모리 관리를 하드웨어가 한다고 하기에는 그 둘의 추상 수준이 매우 높습니다. 하드웨어는 프로세스나 메모리 관리를 위한 원초적인 연산만 제공하고, 나머지는 소프트웨어가 그걸 묶어서 프로세스니 메모리 관리니 하는 추상을 만듭니다. 그게 커널 코드가 하는 일이고요. -> 이 말씀 듣고 느낌이 확 오네요!

보통 하드웨어 상에서 타이머와 인터럽트가 있습니다. 10ms가 되면 클락을 리셋하고, 메모리 특정 위치에 가서 핸들러의 주소를 읽은 다음 그걸 수행합니다. -> 여기서 말씀하신 타이머는 10ms가 되면 스스로 클락을 리셋하고, CPU에 인터럽트를 걸어 커널 메모리 영역에 적힌 타이머 핸들러 코드들을 CPU가 실행한다! 맞나요??

그리고 프로그램 수행 중에 인터럽트가 발생하게 되면, 그 프로그램 수행상태가 running->ready로 전환되게 되죠. 그리고 CPU는 인터럽트의 정보를 읽어 인터럽트 핸들러 코드의 시작주소를 알게되고 그 주소로 가서 코드를 실행한뒤 작업이 완료되면, 다시 주 프로그램 스케줄링으로서 프로그램이 재개되는건가요?

익명 사용자의 이미지

그거는 항상 그렇지는 않아요. 선점형, 비선점형 이런 얘기 들어보셨을텐데...
운영체제 책을 보시지...

x3cdd의 이미지

#운영체제
윈도우는 사실 응용 프로그램에 가깝습니다.
리버싱을 하려면 모든 코드를 다읽어 봐야 하는데
도대체 뇌는 어디에 있는지 보이지 않습니다.
제 추측에는 메모리에 임시로 저장후 바이오스가 어떤역할을 한다고 봅니다.

#컴퓨터 구조
CPU 가 싱글 시스템이 있습니다.
X86 계열의 몸구조가 윈도우즈를 수용할수 있습니다.

리버싱 이란게 몸구조는 분해를 해보면 모든것을 알수 있어요
리버싱을 다른말로 하면 해킹입니다.
소프트웨어는 분해하기가 어려우므로 해킹 기법으로 파일이나 코드의 봉인을
열어보는게 좋을듯 합니다.

댓글 달기

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