LINUX.ORG.RU

Определить количество оперативной памяти

 ,


0

2

На компе стоит 48Gb оперативной памяти, и вывод команды lsmem отображает правильные данные

RANGE                                  SIZE  STATE REMOVABLE  BLOCK
0x0000000000000000-0x00000000dfffffff  3.5G online       yes   0-27
0x0000000100000000-0x0000000c1fffffff 44.5G online       yes 32-387

Memory block size:       128M
Total online memory:      48G
Total offline memory:      0B

в тоже самое время команды типа free, cat /proc/meminfo, vmstat отображают другую информацию

free
              total        used        free      shared  buff/cache   available
Mem:       49245724    34189184     1039760      292840    14902972    15056540
...

vmstat -s
     49245724 K total memory
     34027332 K used memory
...

cat /proc/meminfo 
MemTotal:       49245724 kB
MemFree:          751580 kB
...

Возникает вопрос, судя по выводу этих команд, куда-то пропало более одного гигабайта оперативной памяти. Т.е. я понимаю что он не пропал конечно :) а где-то и кто-то его таки использует.

Я попробовал посчитать память которую указывает команда lspci при запросе данных об устройстве, даже если не отслеживать в выводе пересечение используемых диапазонов адресов, то там памяти набралось на чуть более чем 360М

Могу предположить что её отрезал биос на видео (хотя карта стоит внешняя, но я мог забыть убрать в биосе настройку), но тогда странно что размер потерянного куска не четко 1G а немного больше, да и как понять что это отрезано на интегрированную карту…

Подскажите, как узнать куда делось более 1G оперативки, т.е. если она не попала в доступную общую память, то кто его использует?

Перемещено hobbit из general

Ответ на: комментарий от kirill_rrr

Вот только модулей в Гб в принципе никто никогда не выпускает, они все в Гиб

не буду с вами спорить :) вот вам ссылочка https://www.dns-shop.ru/catalog/17a89a3916404e77/operativnaya-pamyat-dimm/

если найдете там хоть один модуль в Gib - покажите :))

В Gib считают объем памяти, в выпускаемых электромеханических жестких дисках, и это обоснованно, т.к. используется деление на сектора, которые физически не могут быть одинаковыми на разных дорожках, поэтому для упрощения и благодаря тупым маркетологам (ну не учили они другие системы счислений), в коммерческих целях, ввели единицы кратные не 1024, а 1000 :) но опять таки, я с вами не спорю, вы можете считать всё, в том числе и оперативную память в GiB, это ваше право.

а если запустите утилитку free c ключами -g и потом с -giga на своем компе, то сами увидите.

ssnakess
() автор топика
Ответ на: комментарий от kirill_rrr

Да, и я искал как то и не нашёл способа просмотреть выделенную железу память. Ядро возможно само не знает.

наверное надо поковырять исходники утилиты lsmem почему-то она знает «правильные» цифры :)

ssnakess
() автор топика
Ответ на: комментарий от ssnakess

Ты путаешь префиксы. С i — как раз двоичные. Просто на них все забивают, поэтому редко можно их увидеть.

В Gib считают объем памяти, в выпускаемых электромеханических жестких дисках

Во-первых, в Gb. Во-вторых, на самом деле практически для всех накопителей, не только для механики.

anonymous
()
Ответ на: комментарий от anonymous

Размера страницы в 64K в x86 нет. Или 4K, или 2/4M (в зависимости от PAE) или 1G (только на 64-битных). Да и если они используются, 4K-шные страницы, в них входящие, все равно имеют набор struct page c пометкой «эта страница — часть большой страницы». Иначе страницы будет невозможно разделить на маленькие в случае нехватки памяти.

squareroot ★★★★
()
Последнее исправление: squareroot (всего исправлений: 1)
Ответ на: комментарий от u5er

Потом напиши, что по итогу насчитает твой парсер. Интересно посмотреть на результаты.

вообщем как ни считал, и так и эдак, и только корневые узлы и только листья этого дерева не выходит «каменный цветок» :))

если считать размеры диапазонов только корневых узлов, то получается 48,45G, не много, но больше 48G если считать размеры только листьев, то получается очень мало а именно ровно 4G

т.е. в принципе идея нормальная, но видимо какието из диапазонов этого списка не относятся к памяти, т.е. это внутренняя память самих устройств, которым выделен диапазон адресного пространства, но какие именно диапазоны убрать из суммы - вопрос….

Но, вот по мотивам комента Определить количество оперативной памяти (комментарий) полез в этот каталог /sys/devices/system/memory

коль туда обращается lsmem, который какраз и выдает нормальное количество памяти :)

небольшой реверсивный инжиниринг этого каталога показал следующее:

  1. в файле ./block_size_bytes написан размер блока памяти в 16 системе счисления, в моем случае (да и посмотрел на других тачках) там указан размер 8000000 байт
  2. в каталоге находятся подкаталоги с именами типа memoryNNN, где NNN - номер блока
  3. в моем каталоге существует 384 подкаталога с именем memoryNNN, с индексами от 0 до 387. Т.е. нумерация не последовательная - прерывается, а именно нет каталогов с индексами с 28 по 31 включительно
  4. количество каталогов = количеству блоков памяти = 384, умножаем на размер блока 8000000(16) или 134217728(10), и получаем заветные 48Gb
  5. если просуммировать размеры существующих интервалов блоков, то получаем вывод команды lsmem, а именно
SIZE  STATE REMOVABLE  BLOCK
3.5G online       yes   0-27
44.5G online       yes 32-387
  1. попробовал команду lsmem на других машинках, получил интересную картину, помимо того что утилитка показывает суммарные значения по диапазонам индексов каталогов, но еще делит последовательность по признаку removable. Т.е. например на CentOS7 (виртуалка с 4Gb), утилитка lsmem показала довольно длинный список диапазонов
lsmem
RANGE                                  SIZE  STATE REMOVABLE BLOCK
0x0000000000000000-0x0000000007ffffff  128M online       нет     0
0x0000000008000000-0x0000000027ffffff  512M online        да   1-4
0x0000000028000000-0x0000000037ffffff  256M online       нет   5-6
0x0000000038000000-0x000000007fffffff  1,1G online        да  7-15
0x0000000080000000-0x0000000087ffffff  128M online       нет    16
0x0000000088000000-0x00000000a7ffffff  512M online        да 17-20
0x00000000a8000000-0x00000000afffffff  128M online       нет    21
0x00000000b0000000-0x00000000b7ffffff  128M online        да    22
0x00000000b8000000-0x00000000dfffffff  640M online       нет 23-27
0x0000000100000000-0x0000000107ffffff  128M online        да    32
0x0000000108000000-0x000000011fffffff  384M online       нет 33-35

вообщем в каждом каталоге блока, лежит файл removable в котором указан признак 1 или 0. и несмотря на то что на CentOS небыло разрыва в диапазоне индексов блоков, она поделила их последовательность по этому признаку. Но несмотря на все эти деления списка, если взять размер блока из файла block_size_bytes, и умножить на количество каталогов memoryNNN, то мы чудесным образом получаем правильный размер оперативки в 4G Конечно остается вопрос, откуда там признак removable? в виртуалке то! ладно на хосте он стоит 1, т.е. в принципе я могу вытащить планки, а вот в виртуалке…. да еще разные признаки т.е. часть не извлекаемая, а часть извлекаемая…. не понимаю что этот признак означает :)

Интересно как утилита lsmem рассчитывает значения range - я пока не понял принципа. Если знаете, как она его формирует, подскажите.

ssnakess
() автор топика
Ответ на: комментарий от ssnakess

не выходит «каменный цветок»

У меня тоже. Я вчера тоже от нечего делать накидал парсер iomem на тикле. Он у меня насчитал что-то в районе 16 терабайт памяти xD. Пробежав глазками по выхлопу утилиты cat я понял, что никакой ошибки нет.

# cat /proc/iomem 
00000000-00000fff : Reserved
00001000-0009ffff : System RAM
000a0000-000fffff : Reserved
  000a0000-000fffff : PCI Bus 0000:00
    000c0000-000dffff : 0000:00:02.0
    000f0000-000fffff : System ROM
00100000-1fffdfff : System RAM
  13000000-13ffffff : Kernel code
  14000000-14ae6fff : Kernel rodata
  14c00000-14f3baff : Kernel data
  156b2000-159fffff : Kernel bss
1fffe000-1fffefff : Reserved
1ffff000-1fffffff : System RAM
20000000-201fffff : Reserved
  20000000-201fffff : pnp 00:00
20200000-3fffffff : System RAM
40000000-401fffff : Reserved
  40000000-401fffff : pnp 00:00
40200000-7fcf5fff : System RAM
7fcf6000-7fcf6fff : ACPI Tables
7fcf7000-7fe1efff : System RAM
7fe1f000-7fe2cfff : ACPI Tables
7fe2d000-7fe31fff : Reserved
7fe32000-7fe32fff : System RAM
7fe33000-8e9fffff : Reserved
  7fe70000-7fe77fff : BOOT0000:00
8ea00000-efffffff : PCI Bus 0000:00
  8ea00000-8eafffff : PCI Bus 0000:02
    8ea00000-8ea0ffff : 0000:02:00.0
      8ea00000-8ea0ffff : ath9k
  8eb00000-8ebfffff : PCI Bus 0000:0d
    8eb00000-8eb000ff : 0000:0d:00.0
      8eb00000-8eb000ff : mmc0
  8ec00000-8effffff : 0000:00:02.0
  8f000000-8f7fffff : PCI Bus 0000:04
  8f800000-8f81ffff : 0000:00:19.0
    8f800000-8f81ffff : e1000e
  8f820000-8f823fff : 0000:00:1b.0
    8f820000-8f823fff : ICH HD audio
  8f824000-8f824fff : 0000:00:19.0
    8f824000-8f824fff : e1000e
  8f825000-8f825fff : 0000:00:1f.6
  8f826000-8f8267ff : 0000:00:1f.2
    8f826000-8f8267ff : ahci
  8f827000-8f8273ff : 0000:00:1a.0
    8f827000-8f8273ff : ehci_hcd
  8f828000-8f8283ff : 0000:00:1d.0
    8f828000-8f8283ff : ehci_hcd
  8f829000-8f8290ff : 0000:00:1f.3
  90000000-9fffffff : 0000:00:02.0
f0000000-f3ffffff : PCI MMCONFIG 0000 [bus 00-3f]
  f0000000-f3ffffff : pnp 00:00
fec00000-fec003ff : IOAPIC 0
fed00000-fed003ff : HPET 0
  fed00000-fed003ff : pnp 00:01
fed10000-fed17fff : pnp 00:00
fed18000-fed18fff : pnp 00:00
fed19000-fed19fff : pnp 00:00
fed1c000-fed1ffff : pnp 00:00
  fed1f410-fed1f414 : iTCO_wdt.1.auto
    fed1f410-fed1f414 : iTCO_wdt.1.auto iTCO_wdt.1.auto
fed20000-fed3ffff : pnp 00:00
fed40000-fed44fff : PCI Bus 0000:00
  fed40000-fed44fff : pnp 00:00
    fed40000-fed44fff : 00:06 TPM
fed45000-fed8ffff : pnp 00:00
fed90000-fed90fff : dmar0
fed91000-fed91fff : dmar1
ff000000-ffffffff : INT0800:00
100000000-46fad6fff : System RAM
46fad7000-46fb49fff : Reserved
46fb4a000-46ffeafff : System RAM
46ffeb000-46ffecfff : ACPI Tables
46ffed000-4701f0fff : System RAM
4701f1000-4701f2fff : Reserved
4701f3000-470284fff : System RAM
470285000-47028afff : Reserved
47028b000-470291fff : System RAM
470292000-470295fff : Reserved
470296000-4703b7fff : System RAM
4703b8000-4703bbfff : Reserved
4703bc000-4703c4fff : System RAM
4703c5000-4703eefff : Reserved
4703ef000-4711fffff : System RAM
471200000-471210fff : Reserved
471211000-471272fff : System RAM
471273000-471277fff : Reserved
471278000-471289fff : System RAM
47128a000-47128bfff : Reserved
47128c000-47128efff : System RAM
47128f000-471296fff : Reserved
471297000-47129ffff : System RAM
4712a0000-4712a4fff : Reserved
4712a5000-4712c2fff : System RAM
4712c3000-4712dafff : Reserved
4712db000-4712e8fff : System RAM
4712e9000-4712e9fff : Reserved
4712ea000-4712eafff : System RAM
4712eb000-4712fbfff : Reserved
4712fc000-4715fffff : System RAM
471600000-fffffffff : PCI Bus 0000:00
  471600000-4815fffff : PCI Bus 0000:04

Там реально есть диапазоны, которые дают очень большие значения, так что я полагаю, что iomem не годится для таких целей.

небольшой реверсивный инжиниринг

Я думаю, что в таких случаях можно почитать документацию

u5er ★★
()

Немного памяти можно вернуть параметрами ядра add_efi_memmap swiotlb=noforce, ясное дело не гарантирую отсутствие проблем.

anonymous
()
Ответ на: комментарий от u5er

У меня тоже. Я вчера тоже от нечего делать накидал парсер iomem на тикле. Он у меня насчитал что-то в районе 16 терабайт памяти xD. Пробежав глазками по выхлопу утилиты cat я понял, что никакой ошибки нет.

я взял твой список и засунул себе в программу, получилось если идти по узлам дерева, то 63,8286151885986 Gb

если по листьям 15,8937428044155 Gb

На сколько я понимаю, у тебя 64Gb :) так?

ssnakess
() автор топика
Ответ на: комментарий от u5er

И что у тебя там на PCI Bus 0000:00??

PCI Bus 0000:00	47,75Gb
System RAM	15,76Gb

вот сумма по таким же позициям на моей машине

PCI Bus 0000:00	0,38Gb
System RAM 47,93Gb

просто интересно куда там столько пространства? 100500 видюх? :))

ssnakess
() автор топика
Ответ на: комментарий от u5er

Неа. 16.

хм… если считать листья то 15,8937428044155Gb, т.е. почти 16

т.е. абсолютно противоположность с моими данными iomem у меня наоборот, по листьям 4G, а по узлам 48.45Gb

очень интересно….. с чем связанна такая разница в этих двух машинах? могу предположить что связанно с устройствами на PCI, у меня висит всего два устройства видюха и контроллер sata

ssnakess
() автор топика
Ответ на: комментарий от u5er

Как понять листья? Мой парсер ищет строчки с «System RAM», вычисляет разность и потом считает сумму всех разностей

вот само дерево:

00000000-00000fff : Reserved   - лист
00001000-0009ffff : System RAM - лист
000a0000-000fffff : Reserved   - узел
  000a0000-000fffff : PCI Bus 0000:00 - узел
    000c0000-000dffff : 0000:00:02.0  - лист
    000f0000-000fffff : System ROM  -лист
00100000-1fffdfff : System RAM -узел
  13000000-13ffffff : Kernel code - лист
  14000000-14ae6fff : Kernel rodata - лист
  14c00000-14f3baff : Kernel data - лист
  156b2000-159fffff : Kernel bss  - лист
1fffe000-1fffefff : Reserved  - лист
1ffff000-1fffffff : System RAM - лист
20000000-201fffff : Reserved - узел
  20000000-201fffff : pnp 00:00 - лист
20200000-3fffffff : System RAM - лист

и т.д.

сумма размеров сегментов листов в узле, не всегда совпадает с размером сегмента узла

ssnakess
() автор топика
Ответ на: комментарий от u5er

Мой парсер ищет строчки с «System RAM», вычисляет разность и потом считает сумму всех разностей

4096	655359	00001000	0009ffff	System RAM	651264		
1048576	536862719	00100000	1fffdfff	System RAM	535814144		
536866816	536870911	1ffff000	1fffffff	System RAM	4096		
538968064	1073741823	20200000	3fffffff	System RAM	534773760		
1075838976	2144296959	40200000	7fcf5fff	System RAM	1068457984		
2144301056	2145513471	7fcf7000	7fe1efff	System RAM	1212416		
2145591296	2145595391	7fe32000	7fe32fff	System RAM	4096		
4294967296	19053506559	100000000	46fad6fff	System RAM	14758539264		
19053977600	19058831359	46fb4a000	46ffeafff	System RAM	4853760		
19058839552	19060953087	46ffed000	4701f0fff	System RAM	2113536		
19060961280	19061559295	4701f3000	470284fff	System RAM	598016		
19061583872	19061612543	47028b000	470291fff	System RAM	28672		
19061628928	19062816767	470296000	4703b7fff	System RAM	1187840		
19062833152	19062870015	4703bc000	4703c4fff	System RAM	36864		
19063042048	19077791743	4703ef000	4711fffff	System RAM	14749696		
19077861376	19078262783	471211000	471272fff	System RAM	401408		
19078283264	19078356991	471278000	471289fff	System RAM	73728		
19078365184	19078377471	47128c000	47128efff	System RAM	12288		
19078410240	19078447103	471297000	47129ffff	System RAM	36864		
19078467584	19078590463	4712a5000	4712c2fff	System RAM	122880		
19078688768	19078746111	4712db000	4712e8fff	System RAM	57344		
19078750208	19078754303	4712ea000	4712eafff	System RAM	4096		
19078823936	19081986047	4712fc000	4715fffff	System RAM	3162112	16926896128	15,7644004821777

гдето у тебя парсер не то или не так считает

ssnakess
() автор топика
Ответ на: комментарий от ssnakess

вот вам ссылочка https://www.dns-shop.ru

О, так я же сам осенью купил у них моуль ноутбучной ДДР3 на 8192 Миб, состоящий из 8,59 (восьми целых и 59 сотых) чипов по 1Гб.

В Gib считают объем памяти, в выпускаемых электромеханических жестких дисках

Вот как раз вам удачи найти диск на 8912 Гиб.

а если запустите утилитку free c ключами -g и потом с -giga

rrr@raspberrypi:~ $ free -m
               total        used        free      shared  buff/cache   available
Mem:            3794        1445         371        1637        1977         636
Swap:          38145         412       37733
rrr@raspberrypi:~ $ free --mega
               total        used        free      shared  buff/cache   available
Mem:            3978        1514         390        1716        2073         667
Swap:          39998         432       39566

О да, я прям вижу как у меня выделенные 256М видеопамяти на 4Гб чипе рассасываются!

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 1)
Ответ на: комментарий от anonymous

Это же малина в конце концов! Там самая главная операционка на VC6 выполняется, а в 16М она чисто фреймбуфер* и покажет. А видеодекодера, видеоэнкодера и openGL + вулкан - фигвам.

*кстати фреймбуфер до 8К, т.е. 7680х4320х32бита = 126,56 Миб.

kirill_rrr ★★★★★
()

Всё очень просто))) команда: lsmem тебе показывает размер в gigabytes, а комонда: free по умолчанию и т.д отображают тебе размер в (чтитать внимательно) >>> kibibytes <<<, вот есть статья на эту тему на Habr.

Ruslan76
()
Ответ на: комментарий от ssnakess

Перепроверил. Парсер считает правильно. Это я значит сонный был и уже не соображал ничего. Но всё равно, ровно 16 гигов не выдаёт ни так ни этак.

Total ram is 16926896105 bytes
Total ram is 15.764400460757315 GiB
Total ram is 16.926896105 GB

Вот код парсера:

#! /usr/bin/tclsh

proc parseLine { line } {
	
	set res [ regexp {^ *([a-f0-9]*)-([a-f0-9]*) *: *(.*)$} $line full regionStart regionEnd regionName ]
	if { $res > 0 } {
		
		if { $regionName == "System RAM" } {
			set regionSize [ expr "0x$regionEnd - 0x$regionStart" ]
			
			puts "$line"
			puts "Region start is $regionStart"
			puts "Region end is   $regionEnd"
			puts "Region size is  $regionSize"
			puts ""
			
			return $regionSize
		}
	}
	
	return 0
}

proc calculateMem { } {
	
	set totalRam 0
	set iomem [ open "/proc/iomem" ]
	
	while { [ gets $iomem line ] >= 0 } {
		set res [ parseLine $line ]
		incr totalRam $res
	}
	
	close $iomem
	
	#                                   k      m      g
	set totalRamGib [ expr $totalRam / 1024.0 / 1024.0 / 1024.0 ]
	set totalRamGb  [ expr $totalRam / 1000.0 / 1000.0 / 1000.0 ]
	
	puts "Total ram is $totalRam bytes"
	puts "Total ram is $totalRamGib GiB"
	puts "Total ram is $totalRamGb GB"
	
}

calculateMem

u5er ★★
()
Ответ на: комментарий от ssnakess

И что у тебя там на PCI Bus 0000:00??

Вот всё

$ lspci 
00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
00:19.0 Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (Lewisville) (rev 05)
00:1a.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (rev 05)
00:1b.0 Audio device: Intel Corporation 6 Series/C200 Series Chipset Family High Definition Audio Controller (rev 05)
00:1c.0 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 1 (rev b5)
00:1c.1 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 2 (rev b5)
00:1c.2 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 3 (rev b5)
00:1c.3 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 4 (rev b5)
00:1c.4 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 5 (rev b5)
00:1c.5 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 7 (rev b5)
00:1d.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (rev 05)
00:1f.0 ISA bridge: Intel Corporation QM67 Express Chipset LPC Controller (rev 05)
00:1f.2 SATA controller: Intel Corporation 6 Series/C200 Series Chipset Family 6 port Mobile SATA AHCI Controller (rev 05)
00:1f.3 SMBus: Intel Corporation 6 Series/C200 Series Chipset Family SMBus Controller (rev 05)
00:1f.6 Signal processing controller: Intel Corporation 6 Series/C200 Series Chipset Family Thermal Management Controller (rev 05)
02:00.0 Network controller: Qualcomm Atheros AR9285 Wireless Network Adapter (PCI-Express) (rev 01)
0d:00.0 SD Host controller: Ricoh Co Ltd PCIe SDXC/MMC Host Controller (rev 04)
u5er ★★
()
Ответ на: комментарий от kirill_rrr

О, так я же сам осенью купил у них моуль ноутбучной ДДР3 на 8192 Миб, состоящий из 8,59 (восьми целых и 59 сотых) чипов по 1Гб

Если хотите холиварить - то это на других ресурсах

Неверное вы тот самый маркетолог, который не в курсе что существуют системы счислений отличные от 10й :) И не в курсе почему в компьютерных делах используются системы счислений: двоичная, весьмеричная, щестнадцетиричная а не десятичная.

Как пример: Но, вот ссылка на первый попавшийся дешманский модуль памяти https://www.dns-shop.ru/product/1767f979960f2ff4/operativnaa-pamat-netac-basic-ntbsd3p16sp-04-4-gb/

4Gb, где стоит представляете, но не 5, не 10, а 8 чипов

А вот вам ссылка на датащит чипов которые там стоят https://html.alldatasheetru.com/html-pdf/1179036/HYNIX/H5TC4G83BFR-PBA/6230/33/H5TC4G83BFR-PBA.html

просвещайтесь

ssnakess
() автор топика
Последнее исправление: ssnakess (всего исправлений: 1)
Ответ на: комментарий от ssnakess

просвещайтесь

Просветился. Ну и что ты мне пытаешься показать? Я вижу чипы по 512М, а не 500М как ты пытаешься мне впаривать. Хотя в даташите это упоминается всего 1-2 раза, между делом, потому что для всех очевиден множитель 2^10 для оперативки. Не думаю что ты сможешь откопать хоть одно исключение.

kirill_rrr ★★★★★
()
Ответ на: комментарий от ssnakess

ИМХО, вам нужно залезать в дебри спецификации PCI и информации, получаемой ядром от BIOS. ИМХО, суммируя ″System RAM″ из iomem вы просто определите, сколько ОЗУ наконфигурил BIOS программируя контроллер памяти, а где именно недостающая память BIOS не скажет. Если PCI-устройство забирает диапазон адресов, не обязательно что оно забирает это кол-во физической памяти, может контроллер памяти переопределит эти физические адреса ОЗУ на другие, но может у него есть какое ограничение на количество таких remap'ов...

А что касается виртуалок, то там можете отдельно упроться и начать изучать что там делает BIOS :)

mky ★★★★★
()
Ответ на: комментарий от u5er

У тебя размеры регионов нечётные получаются, чего быть не может. Нужно 1 к каждому размеру прибавлять. Ну и вообще я немного улучшил твой скрипт:

#!/usr/bin/tclsh

proc formatSize3 { size } {
	set KiB [ expr 1024 ]
	set MiB [ expr 1024 * 1024 ]
	return "$size ([expr $size / $KiB.0] KiB, [expr $size/ $MiB.0] MiB"
}

proc parseLine { line } {
	
	set res [ regexp {^ *([a-f0-9]*)-([a-f0-9]*) *: *(.*)$} $line full regionStart regionEnd regionName ]
	if { $res > 0 } {
		
		if { $regionName == "System RAM" ||
		     $regionName == "Graphics Stolen Memory" ||
		     $regionName == "RAM buffer" } {
			set regionSize [ expr "0x$regionEnd - 0x$regionStart + 1" ]
			
			puts "$line"
			puts "Region start is $regionStart"
			puts "Region end is   $regionEnd"
			puts "Region size is  [formatSize3 $regionSize]"
			puts ""
			
			return $regionSize
		}
	}
	
	return 0
}

proc calculateMem { } {
	
	set totalRam 0
	set iomem [ open "/proc/iomem" ]
	
	while { [ gets $iomem line ] >= 0 } {
		set res [ parseLine $line ]
		incr totalRam $res
	}
	
	close $iomem

	set GiB [ expr 1024 * 1024 * 1024 ]
	set GB [ expr 1000 * 1000 * 1000 ]

	set totalRamGiB [ expr $totalRam / $GiB.0 ]
	set totalRamGB  [ expr $totalRam / $GB.0 ]
	set lacking     [ expr $GiB - $totalRam % $GiB ]

	puts "Total ram is $totalRam bytes"
	puts "Total ram is $totalRamGiB GiB"
	puts "Total ram is $totalRamGB GB"
	if { $lacking > 0 } {
		puts "Lacking up to GB boundary: [formatSize3 $lacking]"
	}
}

calculateMem
wandrien ★★
()
Ответ на: комментарий от wandrien

Вот так получается:

00001000-0009d7ff : System RAM
Region start is 00001000
Region end is   0009d7ff
Region size is  641024 (626.0 KiB, 0.611328125 MiB)

00100000-aabeefff : System RAM
Region start is 00100000
Region end is   aabeefff
Region size is  2863591424 (2796476.0 KiB, 2730.93359375 MiB)

aafff000-aaffffff : System RAM
Region start is aafff000
Region end is   aaffffff
Region size is  4096 (4.0 KiB, 0.00390625 MiB)

  aba00000-af9fffff : Graphics Stolen Memory
Region start is aba00000
Region end is   af9fffff
Region size is  67108864 (65536.0 KiB, 64.0 MiB)

100000000-44fdfffff : System RAM
Region start is 100000000
Region end is   44fdfffff
Region size is  14224982016 (13891584.0 KiB, 13566.0 MiB)

44fe00000-44fffffff : RAM buffer
Region start is 44fe00000
Region end is   44fffffff
Region size is  2097152 (2048.0 KiB, 2.0 MiB)

Total ram is 17158424576 bytes
Total ram is 15.98002815246582 GiB
Total ram is 17.158424576 GB
Lacking up to GB boundary: 21444608 (20942.0 KiB, 20.451171875 MiB)
wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)