리눅스 커널 모듈 내부의 시스템에서 사용 가능한 모든 RAM의 실제 주소 범위를 얻으려고합니다.프로그래밍 방식으로 리눅스에서 실제 메모리 주소 범위를 가져 오는 방법
나는 cat/proc/iomem을보고 실제 메모리가 연속적이지 않다는 것을 알았다.
32 비트 시스템 호환성을 위해 PCI 및 기타 주변 장치 메모리가 4GB 주소 범위 내에 있어야한다는 것을 알고 있습니다. 도스의 경우 640kB 초기 값입니다. 출력 아래 는 x86_64의 시스템 내 질문은
00000000-00000fff : reserved
00001000-0009d7ff : System RAM //640kB here
0009d800-0009ffff : reserved
000a0000-000bffff : PCI Bus 0000:00
000c0000-000cedff : Video ROM
000e0000-000fffff : reserved
000f0000-000fffff : System ROM
00100000-daa85fff : System RAM //~3.5 gb here
01000000-0177acb8 : Kernel code
0177acb9-01d1b53f : Kernel data
01e79000-01fbdfff : Kernel bss
daa86000-daa87fff : reserved
daa88000-dad0efff : System RAM //some RAM here
dad0f000-dae75fff : reserved
dae76000-dae95fff : ACPI Non-volatile Storage
dae96000-daf1efff : reserved
daf1f000-daf9efff : ACPI Non-volatile Storage
daf9f000-daffefff : ACPI Tables
dafff000-daffffff : System RAM //some RAM here
db000000-df9fffff : reserved
dba00000-df9fffff : Graphics Stolen Memory
dfa00000-feafffff : PCI Bus 0000:00
e0000000-efffffff : 0000:00:02.0
f0000000-f03fffff : 0000:00:02.0
f0400000-f04fffff : PCI Bus 0000:02
f0400000-f0403fff : 0000:02:00.0
f0400000-f0403fff : r8169
f0404000-f0404fff : 0000:02:00.0
f0404000-f0404fff : r8169
f0500000-f05fffff : PCI Bus 0000:01
f0500000-f0503fff : 0000:01:00.0
f0500000-f0503fff : bcma-pci-bridge
f0600000-f0603fff : 0000:00:1b.0
f0600000-f0603fff : ICH HD audio
f0604000-f06040ff : 0000:00:1f.3
f0605000-f060500f : 0000:00:16.0
f0605000-f060500f : mei_me
f0608000-f06087ff : 0000:00:1f.2
f0608000-f06087ff : ahci
f0609000-f06093ff : 0000:00:1d.0
f0609000-f06093ff : ehci_hcd
f060a000-f060a3ff : 0000:00:1a.0
f060a000-f060a3ff : ehci_hcd
f8000000-fbffffff : PCI MMCONFIG 0000 [bus 00-3f]
f8000000-fbffffff : reserved
f8000000-fbffffff : pnp 00:05
fec00000-fec00fff : reserved
fec00000-fec003ff : IOAPIC 0
fed00000-fed003ff : HPET 0
fed00000-fed003ff : PNP0103:00
fed08000-fed08fff : reserved
fed10000-fed19fff : reserved
fed10000-fed17fff : pnp 00:05
fed18000-fed18fff : pnp 00:05
fed19000-fed19fff : pnp 00:05
fed1c000-fed1ffff : reserved
fed1c000-fed1ffff : pnp 00:05
fed1f410-fed1f414 : iTCO_wdt
fed20000-fed3ffff : pnp 00:05
fed40000-fed44fff : PCI Bus 0000:00
fed45000-fed8ffff : pnp 00:05
fed90000-fed93fff : pnp 00:05
fee00000-fee00fff : Local APIC
fee00000-fee00fff : reserved
ff000000-ffffffff : INT0800:00
ffd80000-ffffffff : reserved
100000000-15fdfffff : System RAM //~1.5 gB here
15fe00000-15fffffff : RAM buffer
에서입니다. 1. 커널 코드를 사용하여 DMA에 사용할 수있는 모든 RAM을 얻는 방법. 2. 여분의 RAM 영역이있는 이유는 무엇입니까? ? 또한 RAM이 전제에 대한 적절한 경계에서 분리되지 않는 이유도 있습니다. 2GB + 3GB. 3. 3.5GB의 영역 만 DMA 용으로 사용되거나 1.5GB 이상을 DMA 용으로 사용할 수 있습니다. 리눅스에서.
감사합니다. VK이지만 커널 모듈에서 커널 호출을 사용하여 프로그래밍 방식으로이 값을 얻는 데 도움이 필요합니다. 명확하지 않을 수도 있으므로 제 질문을 수정했습니다. – hiteshradia
이것을 위해, 여러분이 선택한 언어로 "/ proc/meminfo"파일을 읽을 수 있습니다. meminfo는 실제 메모리에 대한 모든 정보를 저장하는 파일입니다. –
예 : 루비에서는 File.read ('/ proc/meminfo')를 사용하여이 작업을 수행 할 수 있습니다. –