하드웨어 제어에 대해...?

kkojiband의 이미지

지금까지 답변해주신 것들에 대해 학교와서 책 좀 찾아보다가 다시 질문 드립니다...^^;

메모리 맵 방식은 알고보니 칩셋에서 그 주소에 대해 맵핑이 되어 있는 주변기기의 메모리로 연결을 시켜주는거더군요...

pio 는 일반적으로 사용하는 i/o 포트 제어하는거 맞나요??

제 생각엔 메모리 맵은 주변기기가 가지고 있는 메모리를 연결하는거고, pio 는 주변기기의 레지스터를 직접 제어하는거같은데...맞는건가요...--;;;

bios가 부팅시에 0fff0h로 구동을 하는것도 메모리 맵 방식의 한가지겠군요...

근데 또 해결못한게 있습니다...--;

메모리 맵은 시스템 설계 때부터 고정되어있는건가요? 아님 os 수준에서 변경이 가능한가요??

변경이 가능하다면 칩셋에 대한 프로그래밍이 가능하다는 얘긴데...그에 대해선 들어본적이 없는거같은데...-_-;

아시는 분 좀 도와주세요~

디바이스 드라이버나 pc 내부에 대해 자세히 설명되어 있는 책좀 추천해주세요...

원서말구 한글로 된 책 좀 추천해주세요...T.T

큰괭이의 이미지

저도 잘 모르지만 제가 알고 있는 지식을 따르면..

메모리 맵 방식은 알고보니 칩셋에서 그 주소에 대해 맵핑이 되어 있는 주변기기의 메모리로 연결을 시켜주는거더군요...
-> 이것.. 예를 들면 그 칩셋에서 가는한 memory adress를..
0x0000000 은 bios..
0x4444444 는 ram
0x8888888 은 flash
0xf232343 은 eeprom
등등.. 이렇게 mapping시키는 것 아닌가요?
따라서 memory map은 별게 아니라 어떤 "것"을 접근하기 위한 시작포인트와 그 영역을 정하는 S/W와 H/W간의 약속을 정하는 것이라는 게 더 정확한 말이 아닐까요?

pio 는 일반적으로 사용하는 i/o 포트 제어하는거 맞나요??
-> 글쳐 H/W에서 Main Core의 PIO port랑 다른 Chip이랑 연결시켜 주면..
그 port를 통해서 다른 chip이 control가능한 구멍이져 ^.^

메모리 맵은 시스템 설계 때부터 고정되어있는건가요? 아님 os 수준에서 변경이 가능한가요??
-> 당연히 Link할때 memory map을 가지고 link를 하고 memory map은 수정가능한 영역이 있고 수정 불가능한 영역이 있죠..
bios가 쓰는 영역을 ram영역으로 할라고 함.. 안된다고 하겠져 ^.^
아님 bios memory 영역을 바꿔서 firmware를 바꿔주던가 키키.

변경이 가능하다면 칩셋에 대한 프로그래밍이 가능하다는 얘긴데...그에 대해선 들어본적이 없는거같은데...-_-;
-> 어떤 이야기인지 이해가 안가네요.

디바이스 드라이버나 pc 내부에 대해 자세히 설명되어 있는 책좀 추천해주세요...
원서말구 한글로 된 책 좀 추천해주세요...T.T
-> 저도 이 바닥에서 기어가면서 귀동냥과 눈동냥으로 배운것이라 어떤 책을 봐야할지.. ㅠ.ㅠ.

?

mach의 이미지

Quote:
pio 는 일반적으로 사용하는 i/o 포트 제어하는거 맞나요??

예 맞습니다. 인텔계열CPU는 그러합니다.

Quote:
bios가 부팅시에 0fff0h로 구동을 하는것도 메모리 맵 방식의 한가지겠군요...

이것은 아닙니다. 주기억장치영역에 해당하는 것은 RAM과 ROM이 있습니다.
부트스트랩로더가 위치한 해당메모리는 주기억장치에 해당하는 영역으로 제시하신 메모리영역은 IO영역이라고 할 수 없습니다.즉, 그 메모리 영역은 IO영역이 아닙니다. 참고로, x86마이크로프로세서는 리셋이 걸리면(CPU pin중 reset핀에 시그널발생하면;전원이 들어옴; 리셋버튼이 눌림등의 사유) CPU의 모드를(인텔계열은 286이상부터는 real mode와 protected mode를 지님) real mode로 놓고, CS:IP레지스터를 님이 제시하신 주소로 매핑합니다. CPU는 눈이 없으니 해당위치에서 명령어를 가져다가 수행할테고, 그 부분에 있는 명령어는 롬영역이니 항상 고정되어 있는 명령이고, 실제로 부팅을 수행하는 명령어이지요.( 램테스트로 부터, ~ 부팅까지.....)해당 롬코드를 보면 각종 IO장치를 검사하는 부분도 있습니다.

* 참고
BIOS (Basic Input Output System) : 말 그대로 아주 기본적인 IO를 수행하는 코드가 들어있는 영역으로, 보통 롬(ROM)으로 제작되고, 부팅시 고정주소를 가지게 된다. BIOS를 제작하는 사람은 컴퓨터 보드를 제작한 사람이며, 보드 제작자별로 상이한 BIOS루틴을 만들게 된다. 운영체제가 약소(허접?)한 경우에는 BIOS의 루틴을 부팅후에도 그냥 사용하기도 한다(예를들어 도스등). 그러나, 고수준의 운영체제들은 BIOS루틴을 사용하지 않고, BIOS와 같은 역할을 수행하는 디바이스 드라이버 자체를 제작한다. 이 경우에 BIOS에서 사용하는 부분은 부팅에 관련된 내용만을 사용한다. 즉, 부팅하면 바이오스를 더이상 사용하지 않고, 해당주소를 손수(?)만든 영역으로 매핑하여 사용하게 한다. 이유는 바이오스들은 대체로 재진입성(reentrancy)를 가지지 못하여 멀티태스킹을 지원할 수 없기 때문이다. 또한, 고수준의 소프트웨어 엔지니어가 제작한 디바이스드라이버는 보드제작자가 만든 바이오스보다는 월등한 성능을 제시하기도 하기때문이다. 결론적으로 현시점에서(2003) 바이오스는 부팅시 한번 사용되는게 통상적이며 부트스트랩로더나 OS제작을 시도하는 사람은 한번쯤 볼만하지만, 그 외의 다수는 볼 이유가 없는 영역이기도 하다. 공부를 원하는 사람이라면 얼마던지 봐도 된다.
BIOS루틴의 소스코드는 IBM PC Technical Reference라는 책에서 어셈블리 루틴으로 볼수있다. (공개된지는 20여년정도 된것으로 안다)이 코드는 IBM의 Open Architecture정책에 의해 공개된 것이며, 이로 인하여 대만산, 조립PC등이 널리 사용되게 되었음은 두말할 필요도 없다. 물론 현존하는 각 보드별 바이오스루틴은 이와는 차이가 있으며, 해당 보드의 BIOS루틴은 차이가 있을 수 있다. 그러나, 해당 바이오스 루틴을 호출하는 방식(파라메터세팅)은 표준을 따르게 되어있다. 특정 하드웨어는 비워진(사용자 정의영역) 곳을 사용하여 바이오스루틴을 제공한다. 그러나, BIOS에서는 대체로 표준적인 장치들에 대해서만 IO루틴을 제공하며, 그외 다수 장치는 별도의 디바이스 드라이버를 제작하여(보통 하드웨어 제작자나, 운영체제제작자가 제공) 사용할 수 있다. 바이오스에서는 특수한 하드웨어의 장치드라이버는 제공하지 않는다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

pill의 이미지

1. PIO : Programmed Input Output

i/o 포트 제어뿐만 아니라 프로그램 코드에 의한 I/O를 의미합니다.
상대적인 개념으로 DMA가 있죠. 데이터가 CPU를 거쳐가느냐 아니면 외부장치끼리 직접 데이터를 교환하느냐를 두고 구분하던걸로 기억합니다.

2. 메모리 맵 방식은 특정한 통신채널을 두지않고 메모리맵에 외부 장치를 연결하는 것을 의미합니다. 제가 예전에 종종 썼던 80196kc(x86은 프로세서, x96은 콘트롤러시리즈입니다.) 라는 콘트롤러의 경우 A/D 컨버터나 RS-232 등등 프로세서에 내장된 주변장치를 위한 특수한 포트가 있는데 이들은 특수레지스터를 통해 제어가 됩니다. 그리고 이 특수 레지스터들은 모두 메모리맵에 매핑이 되어있습니다. 0~7Fh 번지까지 이러한 장치들을 위한 특수레지스터들이 매핑되어 있는 영역인데 이러한 I/O 인터페이스 방법을 메모리맵 방식이라고 합니다.
그리고 지금 여기에서 I/O 라는건 어쨌거나 CPU에 대한 입출력이라고 보는데 그렇다면 kkojiband 님이 예로드신 롬바이오스의 경우도 memory-mapped i/o의 예라고 볼 수도 있을듯 한데 mach 님은 다르게 생각하시는듯 하군요. :lol:

3. 참고하실 책이라면 컴퓨터 구조책을 읽어보시길 권합니다.

즐거운 하루되세요. ^^

mach의 이미지

Quote:
그리고 지금 여기에서 I/O 라는건 어쨌거나 CPU에 대한 입출력이라고 보는데 그렇다면 kkojiband 님이 예로드신 롬바이오스의 경우도 memory-mapped i/o의 예라고 볼 수도 있을듯 한데 mach 님은 다르게 생각하시는듯 하군요.

CPU를 정의한다면 다음과 같습니다.
1)ALU( Arithmetic logic unit)
2)CU(Control Unit)
3)MU(Memory Unit)
이 세가지를 CPU라고 부르며 근래의 마이크로프로세서(microprocessor)는 1),2)를 한칩에 구현하며 3)의 일부를 자체에 내장시키나, 대체로 3)은 별도로 분리하려 장착하지요. 이 세가지를 제외한 다른 곳과의 통신을 IO라고 합니다. 즉, 주기억장치 영역이외와의 데이터 전송이 IO가 됩니다.
이때, 주변장치와 통신할때, 메모리맵IO라면 심지어 키보드에서 데이터를 읽어도 mov(x86인 경우)로 입력이 가능해야 합니다만, 인텔계열은 이렇게 할수없습니다. port에 In, out을 사용해서 하거나, 인터럽트루틴(int사용;바이오스콜; 바이오스내에는 in,out으로 구현되어있음)을 호출해야합니다.
롬바이오스호출을 메모리맵io로 인식하는것은 아주 곤란한 곡해라 하겠습니다.
* 롬바이오스는 in, out등 명령을 장치별로 쓰기좋게(IO장치와의 타이밍등계산루틴포함) 서브루틴으로 만들어놓고, 이를 인터럽트라는 저수준 호출로 사용하게 해놓은 것이라고 보는게 옳습니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

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