proc/ioports 및 proc/iomem에 표시되는 메모리 주소는 어떤 종류입니까?

proc/ioports 및 proc/iomem에 표시되는 메모리 주소는 어떤 종류입니까?

다음의 출력이 됩니다 cat proc/ioports.

0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-0060 : keyboard
0064-0064 : keyboard
0070-0071 : rtc0
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : 0000:00:0f.1
  0170-0177 : pata_via
01f0-01f7 : 0000:00:0f.1
  01f0-01f7 : pata_via
0290-0297 : pnp 00:07
02f8-02ff : serial
0376-0376 : 0000:00:0f.1
  0376-0376 : pata_via
0378-037a : parport0
037b-037f : parport0
03e0-03e7 : pnp 00:08
03f2-03f2 : floppy
03f4-03f5 : floppy
03f6-03f6 : 0000:00:0f.1
  03f6-03f6 : pata_via
03f7-03f7 : floppy
0400-041f : pnp 00:08
  0400-0407 : vt596_smbus
04d0-04d1 : pnp 00:08
0778-077a : parport0
0800-087f : pnp 00:08
  0800-0803 : ACPI PM1a_EVT_BLK
  0804-0805 : ACPI PM1a_CNT_BLK
  0808-080b : ACPI PM_TMR
  0810-0815 : ACPI CPU throttle
  0820-0823 : ACPI GPE0_BLK
0cf8-0cff : PCI conf1
d000-d0ff : 0000:00:11.5
  d000-d0ff : VIA8237
d400-d41f : 0000:00:10.3
  d400-d41f : uhci_hcd
d480-d49f : 0000:00:10.2
  d480-d49f : uhci_hcd
d800-d81f : 0000:00:10.1
  d800-d81f : uhci_hcd
d880-d89f : 0000:00:10.0

출력은 다음과 같습니다 cat /proc/iomem.

00000000-0000ffff : reserved
00010000-0009fbff : System RAM
0009fc00-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000cf7ff : Video ROM
000e0000-000fffff : reserved
  000f0000-000fffff : System ROM
00100000-bffbffff : System RAM
  01000000-01538f03 : Kernel code
  01538f04-017c217f : Kernel data
  01877000-0194dfff : Kernel bss
bffc0000-bffcdfff : ACPI Tables
bffce000-bffeffff : ACPI Non-volatile Storage
bfff0000-bfffffff : reserved
cff00000-dfefffff : PCI Bus 0000:01
  d0000000-d7ffffff : 0000:01:00.0
e0000000-efffffff : PCI MMCONFIG 0000 [bus 00-ff]
  e0000000-efffffff : pnp 00:0d
f0000000-f7ffffff : 0000:00:00.0
fca00000-feafffff : PCI Bus 0000:01
  fd000000-fdffffff : 0000:01:00.0
  feae0000-feafffff : 0000:01:00.0
febc0000-febdffff : 0000:00:0d.0
  febc0000-febdffff : e1000
febf0000-febf7fff : 0000:00:0a.0
  febf0000-febf7fff : 0000:00:0a.0
febfbc00-febfbcff : 0000:00:10.4
  febfbc00-febfbcff : ehci_hcd
fec00000-fec00fff : reserved
  fec00000-fec003ff : IOAPIC 0
fecc0000-fecc03ff : IOAPIC 1
fee00000-fee00fff : Local APIC
  fee00000-fee00fff : pnp 00:09
ff7c0000-ffffffff : reserved
  fff80000-ffffffff : pnp 00:0e

여기서 어떤 메모리 주소가 참조되는지 이해할 수 없습니다. 가상 메모리인가요? 예를 들어 직렬 포트에 쓰기 위해 사용자 프로그램에서 이러한 메모리 주소에 액세스할 수 있습니까? 아마도 어셈블러를 사용하고 있을까요?

답변1

여기서는 어떤 메모리 주소가 참조되고 있는지입니다. 가상 메모리인가요?

최초의 IBM PC 설계의 일부는 실제 메모리(프로그램 및 데이터에서 사용되는 종류) 이외의 용도로 일부 메모리 주소를 사용하는 것이었습니다.

최초의 IBM PC에서는 최대 640KB의 RAM을 가질 수 있지만 칩은 최대 1024KB의 메모리를 처리할 수 있습니다. 그러나 640보다 높은(및 1024보다 작은) 메모리 주소에 쓰는 것은 실제로 RAM과 통신하는 데 사용되지 않습니다. 하지만 플러그인 그래픽 어댑터와 같은 장치에서는 가능합니다.

이 개념을 메모리 매핑 IO 또는 메모리 매핑 하드웨어 장치라고도 합니다.

PC 메모리 맵

IO 포트는 IBM PC 아키텍처에서 주소 지정 가능한 리소스의 또 다른 유형입니다. 초기에는 "점퍼"를 사용하여 보드의 주소 지정 핀을 연결함으로써 플러그인(ISA) 카드에 이러한 주소를 물리적으로 구성했습니다. 일치하는 IO 주소를 사용하도록 소프트웨어를 구성할 수도 있습니다.

오래된 ISA 병렬 포트 카드

카드 왼쪽의 흰색 글자는 어떤 점퍼 위치가 어떤 IO 포트 주소 등을 제공하는지 설명합니다.

요즘에는 시스템이 시작될 때 주소 지정 세부 사항이 카드와 호스트 컴퓨터에 의해 협상되고 동적으로 할당됩니다. 더 이상 구성할 필요가 없습니다.

예를 들어 직렬 포트에 쓰기 위해 사용자 프로그램에서 이러한 메모리 주소에 액세스할 수 있습니까? 아마도 어셈블러를 사용하고 있을까요?

나는 그것을 허용하는 운영 체제(예: PC-DOS, 리얼 모드 OS)를 사용하고 있다고 가정합니다. 대조적으로, 현대의 보호 모드 OS는 사용자 프로그램에서 이러한 작업이 성공하는 것을 방지합니다.

답변2

/proc/ioportsI/O 포트 주소 범위를 나열합니다.

/proc/iomem물리적 메모리 주소 범위를 나열합니다.

매핑을 통해 사용자 프로그램에서 직접 물리적 메모리 주소에 액세스할 수 있지만 /dev/mem아마도 원하지 않을 것입니다. 를 사용하여 사용자 프로그램에서 직접 I/O 포트에 액세스할 수 있지만 ioperm아마도 원하지 않을 것입니다. 일반적으로 이러한 종류의 작업을 수행하려면 커널 모드에 있어야 합니다. 인터럽트 비활성화와 같은 작업을 수행해야 하기 때문입니다.

답변3

물리적이지만 일부는 가상 메모리에 선형적으로 매핑됩니다.

관련 정보