2016-12-12 1 views
1

리눅스 커널 모듈 내부의 시스템에서 사용 가능한 모든 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 용으로 사용할 수 있습니다. 리눅스에서.

답변

2

리눅스 터미널에서 사용할 수있는 몇 가지 명령이 있습니다. 둘 다 리눅스 시스템의 실제 메모리 주소 범위를 보여줄 것입니다.

고양이/proc 디렉토리/meminfo 파일 :

MemTotal:  8027952 kB 
MemFree:   3893748 kB 
Buffers:   132208 kB 
Cached:   1666864 kB 
SwapCached:  226556 kB 
Active:   1979556 kB 
Inactive:  1849480 kB 
Active(anon): 1592580 kB 
Inactive(anon): 886080 kB 
Active(file):  386976 kB 
Inactive(file): 963400 kB 
Unevictable:   68 kB 
Mlocked:    68 kB 
SwapTotal:  15624188 kB 
SwapFree:  15050964 kB 
Dirty:    172 kB 
Writeback:    0 kB 
AnonPages:  1907548 kB 
Mapped:   223484 kB 
Shmem:   448696 kB 
Slab:    140444 kB 
SReclaimable:  101456 kB 
SUnreclaim:  38988 kB 
KernelStack:  4960 kB 
PageTables:  53108 kB 
NFS_Unstable:   0 kB 
Bounce:    0 kB 
WritebackTmp:   0 kB 
CommitLimit: 19638164 kB 
Committed_AS: 7822876 kB 
VmallocTotal: 34359738367 kB 
VmallocUsed:  567356 kB 
VmallocChunk: 34359151824 kB 

또는 -s vmstat를 :이 같은 터미널의 값을 출력합니다

8027952 K total memory 
    4114688 K used memory 
    1960100 K active memory 
    1849792 K inactive memory 
    3913264 K free memory 
    132240 K buffer memory 
    1667108 K swap cache 
15624188 K total swap 
    573224 K used swap 
15050964 K free swap 
    931285 non-nice user cpu ticks 
    6391 nice user cpu ticks 
    152567 system cpu ticks 
    7019826 idle cpu ticks 
    181109 IO-wait cpu ticks 
     19 IRQ cpu ticks 
    2262 softirq cpu ticks 

가있다 : 이것은 값을 출력합니다 dmidecode을 사용하는 명령이 하나 더 있습니다. sudo dmidecode -t memory을 사용하여 Linux 시스템의 RAM 세부 정보를 확인할 수 있습니다.

+0

감사합니다. VK이지만 커널 모듈에서 커널 호출을 사용하여 프로그래밍 방식으로이 값을 얻는 데 도움이 필요합니다. 명확하지 않을 수도 있으므로 제 질문을 수정했습니다. – hiteshradia

+0

이것을 위해, 여러분이 선택한 언어로 "/ proc/meminfo"파일을 읽을 수 있습니다. meminfo는 실제 메모리에 대한 모든 정보를 저장하는 파일입니다. –

+0

예 : 루비에서는 File.read ('/ proc/meminfo')를 사용하여이 작업을 수행 할 수 있습니다. –

관련 문제