Ни одна из этих деталей не обрабатывается операционной системой. Они обрабатываются пользовательскими программами.
По первому вопросу: внутренне в памяти нет абсолютно никакого различия между символом «А» и числовым значением 65 (при условии, конечно, что вы просто просматриваете один байт данных). Разница возникает, когда вы видите, как эти биты интерпретируются программой. Например, если пользовательская программа пытается распечатать строку на экране, она, вероятно, сделает какой-то системный вызов ОС, чтобы попросить ОС напечатать символ. В этом случае код в ОС состоит из серии инструкций по сборке, чтобы воспроизвести эти биты где-то в устройстве отображения. Дисплей затем выполняет рендеринг набора соответствующих пикселей, чтобы нарисовать символ «А». Другими словами, программа ни разу не «знала», что значением является «А». Вместо этого аппаратное обеспечение просто перемещало биты, которые контролировали другой фрагмент кода, перед которым в конечном итоге была поставлена задача превратить эти биты в пиксели.
По вашему второму вопросу, это действительно зависит от менеджера памяти. У программы есть много способов выделить память и узнать, где она хранится. Я не совсем уверен, что понимаю, что вы спрашиваете, но я считаю, что этого ответа должно быть достаточно:
На уровне ОС ядро ОС даже не знает, что байт был выделен. Вместо этого ОС просто выделяет гигантские блоки памяти для пользовательской программы, которая будет использоваться во время работы. Когда программа завершается, вся эта память освобождается.
На уровне программ большинство программ содержат диспетчер памяти , фрагмент кода, предназначенный для выделения и разделения этого большого куска памяти на более мелкие фрагменты, которые затем могут использоваться программой , Это обычно отслеживает выделенную память в виде списка «чанков», где каждый чанк памяти обрабатывается как двусвязный список элементов. Каждый чанк обычно снабжается информацией, указывающей, что он используется и насколько велик чанк, что позволяет диспетчеру памяти восстанавливать память после освобождения.
На уровне кода пользователя, когда вы запрашиваете память, вы обычно сохраняете ее в указателе, чтобы отслеживать, где находится память. Это всего лишь серия байтов в памяти, в которой хранится адрес, на который ОС и менеджер памяти никогда не смотрят, пока не получат указание.
Надеюсь, это поможет!