Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

Размещение данных в памяти

30.11.2019, 16:17. Показов 4195. Ответов 9

Студворк — интернет-сервис помощи студентам
если правильно понимаю, то все данные, которые мы захотим разместить , расположутся в адресном пространстве процессора. стек также разместиться там. я правильно понимаю?


планирую разместить массив из 3000 элементов в секции .bss это правильно? или существуюет какой-то другой способ это сделать?
подскажите пожалуйста
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2019, 16:17
Ответы с готовыми решениями:

Размещение в памяти данных
Подскажите отличия,если я читаю данные(вещественные числа) с бинарного файла поэлементно и к примеру если я читаю те же самые данные из...

Размещение данных в памяти компьютера
Здравствуйте! Подскажите, может можете назвать какую нибудь литературу, касаемо размещения данных в памяти компьютера, пробовала гуглить,...

Массив как структура данных и размещение его в памяти
Добрый день! Как правильно ответить на вопрос почему в java можно написать Object x = new int? Что происходит при этом в памяти?

9
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
02.12.2019, 15:35
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Пространство процесса под управлением обычного linux ( невстроенном ) занято страницами, спроецированными из файлов или из ниоткуда. Страницы могут быть доступны процессу для чтения данных(r), изменения (w), выполнения (x).
Часть спроецированных файлов - исполняемые объектные модули программ и разделяемых (динамических) библиотек.
Необязатльно одни и те же области исполняемых файлов спроецируются на те же области виртуальной памяти при каждом выполнении программы.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
PS C:\WINDOWS> wsl tail /proc/self/maps
7f16eaaa3000-7f16eaaa4000 r--p 00000000 00:00 30424              /usr/lib/locale/chr_US/LC_TELEPHONE
7f16eaaa4000-7f16eaaa5000 r--p 00000000 00:00 30435              /usr/lib/locale/chr_US/LC_MEASUREMENT
7f16eaaa5000-7f16eaaa6000 r--p 00000000 00:00 30439              /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
7f16eac00000-7f16eac0f000 r-xp 00000000 00:00 42130              /usr/bin/tail
7f16eac0f000-7f16eac10000 r-xp 0000f000 00:00 42130              /usr/bin/tail
7f16eae0f000-7f16eae10000 r--p 0000f000 00:00 42130              /usr/bin/tail
7f16eae10000-7f16eae11000 rw-p 00010000 00:00 42130              /usr/bin/tail
7fffc0aa0000-7fffc0ac1000 rw-p 00000000 00:00 0                  [heap]
7fffc7d3c000-7fffc853c000 rw-p 00000000 00:00 0                  [stack]
7fffc8863000-7fffc8864000 r-xp 00000000 00:00 0                  [vdso]
PS C:\WINDOWS> wsl tail /proc/self/maps
7fd480d17000-7fd480d18000 r--p 00026000 00:00 45357              /usr/lib/x86_64-linux-gnu/ld-2.27.so
7fd480d18000-7fd480d19000 rw-p 00027000 00:00 45357              /usr/lib/x86_64-linux-gnu/ld-2.27.so
7fd480d19000-7fd480d1a000 rw-p 00000000 00:00 0
7fd480e00000-7fd480e0f000 r-xp 00000000 00:00 42130              /usr/bin/tail
7fd480e0f000-7fd480e10000 r-xp 0000f000 00:00 42130              /usr/bin/tail
7fd48100f000-7fd481010000 r--p 0000f000 00:00 42130              /usr/bin/tail
7fd481010000-7fd481011000 rw-p 00010000 00:00 42130              /usr/bin/tail
7ffff76b0000-7ffff76d1000 rw-p 00000000 00:00 0                  [heap]
7ffffe175000-7ffffe975000 rw-p 00000000 00:00 0                  [stack]
7ffffeb71000-7ffffeb72000 r-xp 00000000 00:00 0                  [vdso]
PS C:\WINDOWS> wsl tail /proc/self/maps
7f6eed3cf000-7f6eed3d0000 r--p 00000000 00:00 30435              /usr/lib/locale/chr_US/LC_MEASUREMENT
7f6eed3d0000-7f6eed3d2000 rw-p 00000000 00:00 0
7f6eed3d2000-7f6eed3d3000 r--p 00000000 00:00 30439              /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
7f6eed400000-7f6eed40f000 r-xp 00000000 00:00 42130              /usr/bin/tail
7f6eed40f000-7f6eed410000 r-xp 0000f000 00:00 42130              /usr/bin/tail
7f6eed60f000-7f6eed610000 r--p 0000f000 00:00 42130              /usr/bin/tail
7f6eed610000-7f6eed611000 rw-p 00010000 00:00 42130              /usr/bin/tail
7fffd5f16000-7fffd5f37000 rw-p 00000000 00:00 0                  [heap]
7fffde0a8000-7fffde8a8000 rw-p 00000000 00:00 0                  [stack]
7fffdee08000-7fffdee09000 r-xp 00000000 00:00 0                  [vdso]
Добавлено через 1 час 14 минут
А что же проецируется в пространство процессов из исполняемых файлов программ?
PowerShell
1
PS C:\WINDOWS> wsl readelf -l /init
Elf file type is EXEC (Executable file)
Entry point 0x223000
There are 8 program headers, starting at offset 64

Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000200040 0x0000000000200040
0x00000000000001c0 0x00000000000001c0 R 0x8
LOAD 0x0000000000000000 0x0000000000200000 0x0000000000200000
0x0000000000022b54 0x0000000000022b54 R 0x1000
LOAD 0x0000000000023000 0x0000000000223000 0x0000000000223000
0x0000000000066c12 0x0000000000066c12 R E 0x1000
LOAD 0x000000000008a000 0x000000000028a000 0x000000000028a000
0x0000000000006140 0x000000000000c0c8 RW 0x1000
TLS 0x000000000008a3e8 0x000000000028a3e8 0x000000000028a3e8
0x0000000000000000 0x0000000000000001 R 0x1
GNU_RELRO 0x000000000008b000 0x000000000028b000 0x000000000028b000
0x0000000000005140 0x0000000000006000 R 0x1
GNU_EH_FRAME 0x000000000000e770 0x000000000020e770 0x000000000020e770
0x00000000000030fc 0x00000000000030fc R 0x4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0x0


Section to Segment mapping:
Segment Sections...
00
01 .rodata .gcc_except_table .eh_frame_hdr .eh_frame
02 .text .init .fini
03 .data .data.rel.ro .init_array .got .bss
04 .tbss
05 .data.rel.ro .init_array .got
06 .eh_frame_hdr
07
PowerShell
1
PS C:\WINDOWS> wsl cat /proc/1/maps
00200000-00222000 r--p 00000000 00:00 16548 /init
00222000-00223000 r--p 00022000 00:00 16548 /init
00223000-00289000 r-xp 00023000 00:00 16548 /init
00289000-0028a000 r-xp 00089000 00:00 16548 /init
0028a000-00291000 rw-p 0008a000 00:00 16548 /init
00291000-00297000 rw-p 00000000 00:00 0
00d4d000-00d4e000 rw-p 00000000 00:00 0 [heap]
7f0303d20000-7f0303d21000 ---p 00000000 00:00 0
7f0303d21000-7f0303d36000 rw-p 00000000 00:00 0
7fffce454000-7fffcec54000 rw-p 00000000 00:00 0 [stack]
7fffcf044000-7fffcf045000 r-xp 00000000 00:00 0 [vdso]
В используемых в настоящее время ELF области адресного пространства, нужные программе описывают Segments, перечисленные в program headers, таблицы,
которая обычно располагаются сразу после заголовка ELF.
В основном это segments типа LOAD.

Добавлено через 1 час 18 минут
То же самое чуть в другом оформлении
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PS C:\WINDOWS> wsl objdump -p /init
 
/init:     file format elf64-x86-64
 
Program Header:
    PHDR off    0x0000000000000040 vaddr 0x0000000000200040 paddr 0x0000000000200040 align 2**3
         filesz 0x00000000000001c0 memsz 0x00000000000001c0 flags r--
    LOAD off    0x0000000000000000 vaddr 0x0000000000200000 paddr 0x0000000000200000 align 2**12
         filesz 0x0000000000022b54 memsz 0x0000000000022b54 flags r--
    LOAD off    0x0000000000023000 vaddr 0x0000000000223000 paddr 0x0000000000223000 align 2**12
         filesz 0x0000000000066c12 memsz 0x0000000000066c12 flags r-x
    LOAD off    0x000000000008a000 vaddr 0x000000000028a000 paddr 0x000000000028a000 align 2**12
         filesz 0x0000000000006140 memsz 0x000000000000c0c8 flags rw-
     TLS off    0x000000000008a3e8 vaddr 0x000000000028a3e8 paddr 0x000000000028a3e8 align 2**0
         filesz 0x0000000000000000 memsz 0x0000000000000001 flags r--
   RELRO off    0x000000000008b000 vaddr 0x000000000028b000 paddr 0x000000000028b000 align 2**0
         filesz 0x0000000000005140 memsz 0x0000000000006000 flags r--
EH_FRAME off    0x000000000000e770 vaddr 0x000000000020e770 paddr 0x000000000020e770 align 2**2
         filesz 0x00000000000030fc memsz 0x00000000000030fc flags r--
   STACK off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**0
         filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
Добавлено через 1 час 22 минуты
А так можно посмотреть карту адресного пространства на старте программы
Bash
1
 gdb /init -q
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Reading symbols from /init...(no debugging symbols found)...done.
(gdb) starti
Starting program: /init
 
Program stopped.
0x0000000000223000 in ?? ()
(gdb) i proc map
process 611
Mapped address spaces:
 
          Start Addr           End Addr       Size     Offset objfile
            0x200000           0x222000    0x22000        0x0 /init
            0x222000           0x223000     0x1000    0x22000 /init
            0x223000           0x289000    0x66000    0x23000 /init
            0x289000           0x28a000     0x1000    0x89000 /init
            0x28a000           0x291000     0x7000    0x8a000 /init
            0x291000           0x297000     0x6000        0x0
      0x7fffff7ef000     0x7ffffffef000   0x800000        0x0 [stack]
      0x7ffffffef000     0x7fffffff0000     0x1000        0x0 [vdso]
(gdb) !cat /proc/611/maps
00200000-00222000 r--p 00000000 00:00 16548                      /init
00222000-00223000 r--p 00022000 00:00 16548                      /init
00223000-00289000 r-xp 00023000 00:00 16548                      /init
00289000-0028a000 r-xp 00089000 00:00 16548                      /init
0028a000-00291000 rw-p 0008a000 00:00 16548                      /init
00291000-00297000 rw-p 00000000 00:00 0
7fffff7ef000-7ffffffef000 rw-p 00000000 00:00 0                  [stack]
7ffffffef000-7fffffff0000 r-xp 00000000 00:00 0                  [vdso]
(gdb)
2
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
02.12.2019, 19:21  [ТС]
компилятор у Gas и C++ один. ну так у меня, на моем LINUX.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main(){
int *arr=new int[3];
 
*(arr+11)=12;
 
*(arr+21)=1;
 
 
 
}
 
 
скажите пожалуйста, что мешает использовать мне все участки оперативной памяти, беря любой ее участок и помещаю туда како-либо значение?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
02.12.2019, 20:21
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Ничто не мешает. Вы же помещаете значения за пределами.
Но аппаратура ЭВМ под управлением linux возбудит исключительную ситуацию, если код пользователя попытается обратиться к страницам, которые отсутствуют в карте памяти процесса. или пытается выполнить или записать в страницы, которые не доступны для выполненния или записи. linux обработает ситуацию и просигнализирует об этом процессу.
2
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
02.12.2019, 22:04  [ТС]
а точно пишется за пределами?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.12.2019, 06:05
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Эту гипотезу легко проверить экспериментально.
Например, попытаться прочитать записанное.

Добавлено через 5 минут
Bash
1
2
g++ -g ub.c++ -o ub
gdb -q ub
Добавлено через 3 минуты
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Reading symbols from ub...
(gdb) start
Temporary breakpoint 1 at 0x1149: file ub.c++, line 1.
Starting program: /home/ubuntu/c/ub 
 
Temporary breakpoint 1, main () at ub.c++:1
1   int main(){
(gdb) n
2   int *arr=new int[3];
(gdb) 
4   *(arr+11)=12;
(gdb) p arr[11]
$1 = 0
(gdb) n
6   *(arr+21)=1;
(gdb) p arr[11]
$2 = 12
(gdb) n
10  }
(gdb) p arr[21]
$3 = 1
(gdb) p arr[-1]
$4 = 0
(gdb) p arr[-2]
$5 = 33
(gdb) p arr[-3]
$6 = 0
(gdb)
2
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.12.2019, 08:09  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Например, попытаться прочитать записанное.
Я не умею пользоваться отладчиком. что он говорит? пишется за пределами?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.12.2019, 08:30
Выражения arr[11] arr[21] arr[-1] arr[-2] arr[-3] понимаете, что значат?
print - команда, которая печатает результат вычисления выражения.
start - перезапускает отлаживаемую программу с остановкой на первой строчке main()
next - продолжает выполнение до следующей строчки программы (если есть отладочная информации об адресах исходных строчек) и печатает строчку, на которой остановилась.
Старенький перевод
https://www.opennet.ru/docs/RU... html#SEC15
https://www.opennet.ru/docs/RUS/ddd/

Если нет возможности или навыков использования отладчика можно прямо в программу вставить отладочную печать интересующих значений куда-нибудь в std::cerr. Разве Вы так никогда не делали?
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.12.2019, 16:32  [ТС]
нет, не делала. так что там? действительно ли *(arr+11) выходит за границы?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.12.2019, 19:19
pcmax, UB Вы уже неоднократно обсуждали Выделение блока памяти нулевой длины
в соответствующем разделе Форума https://www.cyberforum.ru/sear... d=16410566
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.12.2019, 19:19
Помогаю со студенческими работами здесь

Размещение памяти
Здравствуйте, есть 16 gb памяти, что будет быстрее работать, 2 планки по 8gb двухканальный режим, либо 4 планки по 4 gb тоже каждая пара...

Размещение map'а в памяти
Элементы вектора гарантировано размещаются в памяти рядом, в случае списка элементы лежат где попало, но для этого есть прямые и обратные...

Размещение переменных в памяти
пользуюсь Dev-C++, стало интересно, как компиляторы размещают даныые: последовательно, или как попало? предположим есть объявление int i;...

Размещение в методов памяти
Наверно, сумбурный несколько вопрос, но хотел бы прояснить. Узнал что в javascript при конструировании методы "объекта"...

Размещение элементов в памяти
Добрый день! Подскажите. может ли контейнер STL vector хранить значения типа char (wchar_t)? Если нет, то подскажите, как создать некую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru