где консоль VxWorks хранит данные - PullRequest
0 голосов
/ 21 февраля 2019

Я использовал консоль для разрешения "errno", например так:

-> strerror(0x23)
value = 22279888 = 0x153f6d0
-> d 0x153f6d0
NOTE: memory values are displayed in hexadecimal.
0x0153f6d0:  5f53 7265 6e72 5f6f 4e45 544f 5553 0050  *S_errno_ENOTSUP.*
0x0153f6e0:  0000 0000 0000 0000 0000 0000 0000 0000  *................*
...
0x0153f7c0:  0000 0000 0000 0000 0000 0000 0000 0000  *................*
value = 0 = 0x0

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

-> a=6
New symbol "a" added to kernel symbol table.
a = 0x45446f60: value = 6 = 0x6

Теперь она сохраняется и доступна,Но теперь мне интересно, где эти байты сохранены?Создает ли консоль mem в фоновом режиме или уже выделило некоторое количество оперативной памяти для этих целей?Должен ли я быть обеспокоен тем, где это будет сохранено?Я предполагаю, что эти данные хранятся до перезагрузки и до тех пор, пока я работаю с консолью.

Я заглянул в «Руководство пользователя по Kernel Shell», но не нашел ответа.(VxWorks 7.0)

1 Ответ

0 голосов
/ 26 февраля 2019

strerror возвращает указатель на текст ошибки по номеру ошибки.Текст ошибки не является какой-то динамической строкой, это предопределенная константа, известная до начала компиляции, поэтому он должен храниться в сегменте .data вместе со всеми другими константами, рядом со всеми другими инициализированными данными.Всякий раз, когда вы вызываете strerror с тем же параметром, вы получаете один и тот же адрес в той же области памяти, не стесняйтесь попробовать.

Создание новой переменной - это другое дело, она фактически выделяет память из кучи одинаковоспособ malloc / new делает.Если вы вызовете malloc для небольшого объема данных (например, 16 байт) сразу после создания новой переменной, вы можете получить указатель, действительно близкий к адресу новой переменной.И даже более того, вы можете вызвать free &a из консоли, чтобы правильно освободить память, ошибки не должны появляться.

Вы действительно можете изучить карту памяти, если хотите

  • Запустить иРазмер стека / кучи должен быть определен где-то в конфигурации вашего проекта
  • Вы можете попросить компоновщика сгенерировать файл .map , например, и проверить адреса сегментов в нем.

Так что в любом случае вы сможете угадать участок памяти по значению указателя

Обратите внимание, я работал только с более старыми версиями VxWorks (5.5, который имеет), так что это может быть не неточно, но основная идеядолжно быть в порядке.

...