LINUX.ORG.RU

История изменений

Исправление Vic, (текущая версия) :

В молодости я писал на ассемблере для 68000, но там прямая адресация и когда перешел на 286 пытаясь понять его конструкцию и относительную адресацию понял что на ассемблере тут писать себе дороже

Ну, по сути, там не то что бы адресация была не линейная, просто вычисление адреса было муторным для программиста, из-за особенностей железа того времени. Слава богу, теперь это в прошлом и когда доходит дело до программ, адресация линейна. Мучаются только разработчики биосов, т.к. для совместимости, даже 64-разрядные процессоры стартуют в вот в том самом «реальном» x86 режиме с муторным вычислением адреса. Это вот то самое легаси, от которого все хотят отказаться очень давно, но не могут, т.к. пока есть популярные операционки, код которых рассчитан на старт в «реальном» режиме. Как исчезнут, так и то легаси само собой отвалится - UEFI, как я понимаю, это как раз первый шаг, там уже загрузчики операционных систем сделаны в виде обычных файлов, что позволит в дальнейшем инсталяторам операционок записывать нужный загрузчик в зависимости от того. в каком режиме стартанет процессор.

Читая этот тред, задумался, адрес это ячейка памяти в которое можно что то записать. Но ведь сам адрес это постоянная величина в нее писать нельзя, только читать….

Сейчас я вас еще больше ошарашу - у x86 процессоров два адресных пространства:

  • ОЗУ - память, откуда процессор берет команды и данные для выполнения. Для этой области есть команды чтения и записи по номеру байта. Эту область мы для краткости и называем адресным пространством процессоров.
  • Ввод-вывод - память, откуда процессор может только читать или записывать. Для этой области есть команды чтения и записи по номеру «порта». Эта часть появилась из-за аппаратуры того далекого времени, которое подключалось на отдельные шины ввода вывода.

Теоретически, разработчики могут наделать кучу адресных пространств и наделить их различным назначением. Но так уже никто не делает.

Все современные архитектуры стараются сделать единое адресное пространство, причем линейное. В области этого адресного пространства помещают и модули памяти (ОЗУ), и внутреннюю память самого процессора, и кусочки памяти контроллеров железа для обмена с подключаемыми устройствами. Т.к. теперь разработчики железа стали грамотнее, то им самим приходится писать программы и теперь они в большей части понимают весь геморрой системных программистов.

А как же пишут проги где есть обращение к не выделенной памяти ? Разве компилятор может пропустить конструкцию типа адрес + число ?

Для процессора нет «выделенной» или «не выделенной» памяти. Процессор оперирует адресным пространством - т.е. областью номеров, от 0 до максимума (2 в степени «разрядность процессора»). А есть ли по данному номеру память, которая запомнит, процессор сам не проверяет. Поэтому, вы можете читать и писать в любое место адресного пространства.

Контроль осуществляют операционные системы и различные библиотеки. Только им ведомо, что конкретно находится в данной области адресного пространства. Это они назначают программа области и отслеживают, что если программа попытается за них обратиться, то ее обычно «снимают». Конечно, вся эта кухня c отслеживанием требует поддержки со стороны процессора (есть кучи таблиц, по которым процессор проверяет каждую команду на корректность обращения к диапазону адресов, эти таблицы настраивает операционка).

Исправление Vic, :

В молодости я писал на ассемблере для 68000, но там прямая адресация и когда перешел на 286 пытаясь понять его конструкцию и относительную адресацию понял что на ассемблере тут писать себе дороже

Ну, по сути, там не то что бы адресация была не линейная, просто вычисление адреса было муторным для программиста, из-за особенностей железа того времени. Слава богу, теперь это в прошлом и когда доходит дело до программ, адресация линейна. Мучаются только разработчики биосов, т.к. для совместимости, даже 64-разрядные процессоры стартуют в вот в том самом «реальном» x86 режиме с муторным вычислением адреса. Это вот то самое легаси, от которого все хотят отказаться очень давно, но не могут, т.к. пока есть популярные операционки, код которых рассчитан на старт в «реальном» режиме. Как исчезнут, так и то легаси само собой отвалится - UEFI, как я понимаю, это как раз первый шаг, там уже загрузчики операционных систем сделаны в виде обычных файлов, что позволит в дальнейшем инсталяторам операционок записывать нужный загрузчик в зависимости от того. в каком режиме стартанет процессор.

Читая этот тред, задумался, адрес это ячейка памяти в которое можно что то записать. Но ведь сам адрес это постоянная величина в нее писать нельзя, только читать….

Сейчас я вас еще больше ошарашу - у x86 процессоров два адресных пространства:

  • ОЗУ - память, откуда процессор берет команды и данные для выполнения. Для этой области есть команды чтения и записи по номеру байта. Эту область мы для краткости и называем адресным пространством процессоров.
  • Ввод-вывод - память, откуда процессор может только читать или записывать. Для этой области есть команды чтения и записи по номеру «порта». Эта часть появилась из-за аппаратуры того далекого времени, которое подключалось на отдельные шины ввода вывода.

Теоретически, разработчики могут наделать кучу адресных пространств и наделить их различным назначением. Но так уже никто не делает.

Все современные архитектуры стараются сделать единое адресное пространство, причем линейное. В области этого адресного пространства помещают и модули памяти (ОЗУ), и внутреннюю память самого процессора, и кусочки памяти контроллеров железа для обмена с подключаемыми устройствами. Т.к. теперь разработчики железа стали грамотнее, то им самим приходится писать программы и теперь они в большей части понимают весь геморрой системных программистов.

А как же пишут проги где есть обращение к не выделенной памяти ? Разве компилятор может пропустить конструкцию типа адрес + число ?

Для процессора нет «выделенной» или «не выделенной» памяти. Процессор оперирует адресным пространством - т.е. областью номеров, от 0 до максимума (2 в степени «разрядность процессора»). А есть ли по данному номеру память, которая запомнит, процессор сам не проверяет. Поэтому, ты спокойно можешь читать и писать в любое место адресного пространства.

Контроль осуществляют операционные системы и различные библиотеки. Только им ведомо, что конкретно находится в данной области адресного пространства. Это они назначают программа области и отслеживают, что если программа попытается за них обратиться, то ее обычно «снимают». Конечно, вся эта кухня c отслеживанием требует поддержки со стороны процессора (есть кучи таблиц, по которым процессор проверяет каждую команду на корректность обращения к диапазону адресов, эти таблицы настраивает операционка).

Исправление Vic, :

В молодости я писал на ассемблере для 68000, но там прямая адресация и когда перешел на 286 пытаясь понять его конструкцию и относительную адресацию понял что на ассемблере тут писать себе дороже

Ну, по сути, там не то что бы адресация была не линейная, просто вычисление адреса было муторным для программиста, из-за особенностей железа того времени. Слава богу, теперь это в прошлом и когда доходит дело до программ, адресация линейна. Мучаются только разработчики биосов, т.к. для совместимости, даже 64-разрядные процессоры стартуют в вот в том самом «реальном» x86 режиме с муторным вычислением адреса. Это вот то самое легаси, от которого все хотят отказаться очень давно, но не могут, т.к. пока есть популярные операционки, код которых рассчитан на старт в «реальном» режиме. Как исчезнут, так и то легаси само собой отвалится - UEFI, как я понимаю, это как раз первый шаг, там уже загрузчики операционных систем сделаны в виде обычных файлов, что позволит в дальнейшем инсталяторам операционок записывать нужный загрузчик в зависимости от того. в каком режиме стартанет процессор.

Читая этот тред, задумался, адрес это ячейка памяти в которое можно что то записать. Но ведь сам адрес это постоянная величина в нее писать нельзя, только читать….

Сейчас я вас еще больше ошарашу - у x86 процессоров два адресных пространства:

  • ОЗУ - память, откуда процессор берет команды и данные для выполнения. Для этой области есть команды чтения и записи по номеру байта. Эту область мы для краткости и называем адресным пространством процессоров.
  • Ввод-вывод - память, откуда процессор может только читать или записывать. Для этой области есть команды чтения и записи по номеру «порта». Эта часть появилась из-за аппаратуры того далекого времени, которое подключалось на отдельные шины ввода вывода.

Теоретически, разработчики могут наделать кучу адресных пространств и наделить их различным назначением. Но так уже никто не делает.

Все современные архитектуры стараются сделать единое адресное пространство, причем линейное. В области этого адресного пространства помещают и модули памяти (ОЗУ), и внутреннюю память самого процессора, и кусочки памяти контроллеров железа для обмена с подключаемыми устройствами. Т.к. теперь разработчики железа стали грамотнее, то им самим приходится писать программы и теперь они в большей части понимают весь геморрой системных программистов.

А как же пишут проги где есть обращение к не выделенной памяти ? Разве компилятор может пропустить конструкцию типа адрес + число ?

Для процессора нет «выделенной» или «не выделенной» памяти. Процессор оперирует адресным пространством - т.е. областью номеров, от 0 до максимума (2 в степени «разрядность процессора»). А есть ли по данному номеру память, которая запомнит, процессор сам не проверяет. Поэтому, ты спокойно можешь читать и писать в любое место адресного пространства.

Контроль осуществляют операционные системы и различные библиотеки. Только им ведомо, что конкретно находится в данной области адресного пространства. Это они назначают программа области и отслеживают, что если программа попытается за них обратиться, то ее обычно «снимают». Конечно, вся эта кухня c отслеживанием требует поддержки со стороны процессора (есть кучи таблиц, по которым процессор проверяет каждую команду на корректность обращения к диапазону адресов, эти таблицы настраивает оепрационка).

Исправление Vic, :

В молодости я писал на ассемблере для 68000, но там прямая адресация и когда перешел на 286 пытаясь понять его конструкцию и относительную адресацию понял что на ассемблере тут писать себе дороже

Ну, по сути, там не то что бы адресация была не линейная, просто вычисление адреса было муторным для программиста, из-за особенностей железа того времени. Слава богу, теперь это в прошлом и когда доходит дело до программ, адресация линейна. Мучаются только разработчики биосов, т.к. для совместимости, даже 64-разрядные процессоры стартуют в вот в том самом «реальном» x86 режиме с муторным вычислением адреса. Это вот то самое легаси, от которого все хотят отказаться очень давно, но не могут, т.к. пока есть популярные операционки, код которых рассчитан на старт в «реальном» режиме. Как исчезнут, так и то легаси само собой отвалится - UEFI, как я понимаю, это как раз первый шаг, там уже загрузчики операционных систем сделаны в виде обычных файлов, что позволит в дальнейшем инсталяторам операционок записывать нужный загрузчик в зависимости от того. в каком режиме стартанет процессор.

Читая этот тред, задумался, адрес это ячейка памяти в которое можно что то записать. Но ведь сам адрес это постоянная величина в нее писать нельзя, только читать….

Сейчас я вас еще больше ошарашу - у x86 процессоров два адресных пространства:

  • ОЗУ - память, откуда процессор берет команды и данные для выполнения. Для этой области есть команды чтения и записи по номеру байта. Эту область мы для краткости и называем адресным пространством процессоров.
  • Ввод-вывод - память, откуда процессор может только читать или записывать. Для этой области есть команды чтения и записи по номеру «порта». Эта часть появилась из-за аппаратуры того далекого времени, которое подключалось на отдельные шины ввода вывода.

Теоретически, разработчики могут наделать кучу адресных пространств и наделить их различным назначением. Но так уже никто не делает.

Все современные архитектуры стараются сделать единое адресное пространство, причем линейное. В области этого адресного пространства помещают и модули памяти (ОЗУ), и внутреннюю память самого процессора, и кусочки памяти контроллеров железа для обмена с подключаемыми устройствами. Т.к. теперь разработчики железа стали грамотнее, то им самим приходится писать программы и теперь они в большей части понимают весь геморрой системных программистов.

А как же пишут проги где есть обращение к не выделенной памяти ? Разве компилятор может пропустить конструкцию типа адрес + число ?

Для процессора нет «выделенной» или «не выделенной» памяти. Процессор оперирует адресным пространством - т.е. областью номеров, от 0 до максимума (2 в степени «разрядность процессора»). А есть ли по данному номеру память, которая запомнит, процессор сам не проверяет. Поэтому, ты спокойно можешь читать и писать в любое место адресного пространства.

Контроль осуществляют операционные системы и различные библиотеки. Только им ведомо, что конкретно находится в данной области адресного пространства. Это они назначают программа области и отслеживают, что если программа попытается за них обратиться, то ее обычно «снимают».

Исправление Vic, :

В молодости я писал на ассемблере для 68000, но там прямая адресация и когда перешел на 286 пытаясь понять его конструкцию и относительную адресацию понял что на ассемблере тут писать себе дороже

Ну, по сути, там не то что бы адресация была не линейная, просто вычисление адреса было муторным для программиста, из-за особенностей железа того времени. Слава богу, теперь это в прошлом и когда доходит дело до программ, адресация линейна. Мучаются только разработчики биосов, т.к. для совместимости, даже 64-разрядные процессоры стартуют в вот в том самом «реальном» x86 режиме с муторным вычислением адреса. Это вот то самое легаси, от которого все хотят отказаться очень давно, но не могут, т.к. пока есть популярные операционки, код которых рассчитан на старт в «реальном» режиме. Как исчезнут, так и то легаси само собой отвалится - UEFI, как я понимаю, это как раз первый шаг, там уже загрузчики операционных систем сделаны в виде обычных файлов, что позволит в дальнейшем инсталяторам операционок записывать нужный загрузчик в зависимости от того. в каком режиме стартанет процессор.

Читая этот тред, задумался, адрес это ячейка памяти в которое можно что то записать. Но ведь сам адрес это постоянная величина в нее писать нельзя, только читать….

Сейчас я вас еще больше ошарашу - у x86 процессоров два адресных пространства:

  • ОЗУ - память, откуда процессор берет команды и данные для выполнения. Для этой области есть команды чтения и записи по номеру байта. Эту область мы для краткости и называем адресным пространством процессоров.
  • Ввод-вывод - память, откуда процессор может только читать или записывать. Для этой области есть команды чтения и записи по номеру «порта». Эта часть появилась из-за аппаратуры того далекого времени, которое подключалось на отдельные шины ввода вывода.

Теоретически, разработчики могут наделать кучу адресных пространств и наделить их различным назначением. Но так уже никто не делает.

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

А как же пишут проги где есть обращение к не выделенной памяти ? Разве компилятор может пропустить конструкцию типа адрес + число ?

Для процессора нет «выделенной» или «не выделенной» памяти. Процессор оперирует адресным пространством - т.е. областью номеров, от 0 до максимума (2 в степени «разрядность процессора»). А есть ли по данному номеру память, которая запомнит, процессор сам не проверяет. Поэтому, ты спокойно можешь читать и писать в любое место адресного пространства.

Контроль осуществляют операционные системы и различные библиотеки. Только им ведомо, что конкретно находится в данной области адресного пространства. Это они назначают программа области и отслеживают, что если программа попытается за них обратиться, то ее обычно «снимают».

Исходная версия Vic, :

В молодости я писал на ассемблере для 68000, но там прямая адресация и когда перешел на 286 пытаясь понять его конструкцию и относительную адресацию понял что на ассемблере тут писать себе дороже

Ну, по сути, там не то что бы адресация была не линейная, просто вычисление адреса было муторным для программиста, из-за особенностей железа того времени. Слава богу, теперь это в прошлом и когда доходит дело до программ, адресация линейна. Мучаются только разработчики биосов, т.к. для совместимости, даже 64-разрядные процессоры стартуют в вот в том самом «реальном» x86 режиме с муторным вычислением адреса.

Читая этот тред, задумался, адрес это ячейка памяти в которое можно что то записать. Но ведь сам адрес это постоянная величина в нее писать нельзя, только читать….

Сейчас я вас еще больше ошарашу - у x86 процессоров два адресных пространства:

  • ОЗУ - память, откуда процессор берет команды и данные для выполнения. Для этой области есть команды чтения и записи по номеру байта. Эту область мы для краткости и называем адресным пространством процессоров.
  • Ввод-вывод - память, откуда процессор может только читать или записывать. Для этой области есть команды чтения и записи по номеру «порта». Эта часть появилась из-за аппаратуры того далекого времени, которое подключалось на отдельные шины ввода вывода.

Теоретически, разработчики могут наделать кучу адресных пространств и наделить их различным назначением. Но так уже никто не делает.

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

А как же пишут проги где есть обращение к не выделенной памяти ? Разве компилятор может пропустить конструкцию типа адрес + число ?

Для процессора нет «выделенной» или «не выделенной» памяти. Процессор оперирует адресным пространством - т.е. областью номеров, от 0 до максимума (2 в степени «разрядность процессора»). А есть ли по данному номеру память, которая запомнит, процессор сам не проверяет. Поэтому, ты спокойно можешь читать и писать в любое место адресного пространства.

Контроль осуществляют операционные системы и различные библиотеки. Только им ведомо, что конкретно находится в данной области адресного пространства. Это они назначают программа области и отслеживают, что если программа попытается за них обратиться, то ее обычно «снимают».