Почему 0-й элемент таблицы GDT нельзя ипользовать?
Для чего он вообще используется?
Ни в одной литературе нормального ответа на этот вопрос не нашёл!!!
Причём если я всё делаю по правилам — не использую его, то всё работает, а если использую, то нет!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Здравствуйте, Stanky, Вы писали:
S>Почему 0-й элемент таблицы GDT нельзя ипользовать? S>Для чего он вообще используется? S>Ни в одной литературе нормального ответа на этот вопрос не нашёл!!! S>Причём если я всё делаю по правилам — не использую его, то всё работает, а если использую, то нет!!!
--
Вся информация есть в IA-32 Intel Architecture Software Developer’s Manual Volume 3:System Programming Guide, в частности ответ на этот вопрос есть в "3.4.1.Segment Selectors".
> Вся информация есть в IA-32 Intel Architecture Software Developer’s > Manual Volume 3:System Programming Guide, в частности ответ на этот > вопрос есть в "3.4.1.Segment Selectors". >
Есть-то она есть, да вот ради такого маленького вопроса качать 6 метров по модему как-то несоизмеримо!!!
Ну да ладно — раз трудно ответить, скачаю!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
> Ну да ладно — раз трудно ответить, скачаю!!! >
Скачал, прочитал, написано:
The first entry of the GDT is not used by the processor. A segment selector that points to this
entry of the GDT (that is, a segment selector with an index of 0 and the TI flag set to 0) is used
as a “null segment selector.” The processor does not generate an exception when a segment
register (other than the CS or SS registers) is loaded with a null selector. It does, however,
generate an exception when a segment register holding a null selector is used to access memory.
A null selector can be used to initialize unused segment registers. Loading the CS or SS register
with a null segment selector causes a general-protection exception (#GP) to be generated.
У фроловых написано примерно тоже самое, но мне непонятна практическая сторона сего действа!!!
Зачем нам вообще инициализировать неиспользуемые регистры? Если имеется ввиду, что это нужно при переходе из ядра в 3 кольцо, например обнулить FS и GS, то разве мы сами не можем это сделать, создав в таблице описание нулевого сегмента, если он нужен? Или он при загрузке такого селектора исключением срыгнёт? Да, я конечно умею читать: The processor does not generate an exception when a segment register (other than the CS or SS registers) is loaded with a null selector, но это читается не совсем однозначно!!!
Вобщем для чего было вводить такую вещь аппаратно?
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
S>The first entry of the GDT is not used by the processor. A segment selector that points to this
S>entry of the GDT (that is, a segment selector with an index of 0 and the TI flag set to 0) is used
S>as a “null segment selector.” The processor does not generate an exception when a segment
S>register (other than the CS or SS registers) is loaded with a null selector. It does, however,
S>generate an exception when a segment register holding a null selector is used to access memory.
S>A null selector can be used to initialize unused segment registers. Loading the CS or SS register
S>with a null segment selector causes a general-protection exception (#GP) to be generated.
S>
S>У фроловых написано примерно тоже самое, но мне непонятна практическая сторона сего действа!!! S>Зачем нам вообще инициализировать неиспользуемые регистры?
--
Ну, например, для того чтобы "отлавливать" действия с этим регистром, которые в таком случае будут являться некорректной работой с не инициализированным указателем. Чуть ниже по тексту (3.5.1) об этом прямо сказано "By initializing the segment registers with this [“null descriptor”] segment selector, accidental reference to unused segment registers can be guaranteed to generate an exception"
S>Если имеется ввиду, что это нужно при переходе из ядра в 3 кольцо, например обнулить FS и GS, то разве мы сами не можем это сделать, создав в таблице описание нулевого сегмента, если он нужен? Или он при загрузке такого селектора исключением срыгнёт? Да, я конечно умею читать: The processor does not generate an exception when a segment register (other than the CS or SS registers) is loaded with a null selector, но это читается не совсем однозначно!!!
--
Чтот такое "описание нулевого сегмента"? Вы хотите сделать сегмент в памяти и дескриптор для него, аналогичный тому, на который как будто-бы "ссылается" 0-й селектор GDT? Если да, то сделать это, по-моему, будет проблематично.
Во-первых, какой должен быть базовый адрес этого сегмента? С точки зрения “null descriptor”, сегмент, на который он "ссылается", должен быть недоступным или генерировать исключения при доступе к нему, а как это гарантировано сделать на всех (практических) платформах, использующих этот CPU?
Во-вторых, мы не можем сделать сегмент нулевой длины. Это значит, что любой сегмент имеет по крайней мере один валидный адрес в памяти. Опять же, этот не соответсвует работе с "null descriptor'ом".
Можно, конечно, все врямя маркировать дескриптор этого сегмента как "not present" (P бит = 0), но это, по достаточно явным причинам, нехорошо.
S>Вобщем для чего было вводить такую вещь аппаратно?
--
На мой взляд, все достаточно просто — этот механизм позволяет "отлавливать" ошибочные действия в программе, например, с указателями в C/C++:
— Запись NULL в переменную — это нормально (запись "null descriptor" в сегментые регистры, отличные от CS и SS, разрешен).
— Выполнять действия по адресу NULL — это ошибка (запись "null descriptor" в сегментые регистры CS и SS генерирует исключение);
— Запись и чтение по адресу NULL — это ошибка (обращение к памяти по сегментномуу регистру, содержащему "null descriptor", генерирует исключение);
С уважением,
Геннадий Майко.
P.S. Я считаю, что лучше самому прочесть "первоисточники", чем их цитировать. Только поэтому я не стал приводить как раз именно эту фразу, которые Вы сами нашли.
Пасибы, теперь картина проясняется!!!
> На мой взляд, все достаточно просто — этот механизм позволяет "отлавливать" ошибочные действия в программе, например, с указателями в C/C++: > — Запись NULL в переменную — это нормально (запись "null descriptor" в сегментые регистры, отличные от CS и SS, разрешен). > — Выполнять действия по адресу NULL — это ошибка (запись "null descriptor" в сегментые регистры CS и SS генерирует исключение); > — Запись и чтение по адресу NULL — это ошибка (обращение к памяти по сегментномуу регистру, содержащему "null descriptor", генерирует исключение); >
А вот с этим я не согласен!!! В указателе селектор не присутствует, в нём есть только смещение в сегменте на который указывает селектор данных (DS, ES)!!!
Напиример в винде нашим программам выделяется сегмент данных размером 2ГБ (ну мне кажется так сделано), а селектор этого сегмента загружается в DS, ES и SS!!! Механизм отлавливания левых указателей реализуется другим путём!!!
> P.S. Я считаю, что лучше самому прочесть "первоисточники", чем их цитировать. Только поэтому я не стал приводить как раз именно эту > фразу, которые Вы сами нашли. >
Я не жалею, что скачал — вещь действительно великолепная!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
В винде действует страничная адресация, поэтому 4Gb (а не 2, а на Pentium Pro с 36 битной адресацией вообще 32Gb) памяти на самом не выделяется просто при обращении праграммы к "несуществующей" (не выделенной ей) странице памяти обработчик исключения #PF выделяет ее из неизпользуемой памяти (или сначала свопит кого-нибудь).
А про интел мануал, так его качать не надо, на их сайте абсолютно на шару можно заказать бумажный вариант всех 4-х книг, они приходят через несколько дней прямо тебе домой (я заказал и не жалею качество книг офигительное, у нас "на книжке" (в Одессе) такие бы стоили долларов 20, а то и больше)
Re[6]: GDT
От:
Аноним
Дата:
01.01.05 12:33
Оценка:
>> На мой взляд, все достаточно просто — этот механизм позволяет "отлавливать" ошибочные действия в программе, например, с указателями в C/C++: >> — Запись NULL в переменную — это нормально (запись "null descriptor" в сегментые регистры, отличные от CS и SS, разрешен). >> — Выполнять действия по адресу NULL — это ошибка (запись "null descriptor" в сегментые регистры CS и SS генерирует исключение); >> — Запись и чтение по адресу NULL — это ошибка (обращение к памяти по сегментномуу регистру, содержащему "null descriptor", генерирует исключение); >> S>А вот с этим я не согласен!!! В указателе селектор не присутствует, в нём есть только смещение в сегменте на который указывает селектор данных (DS, ES)!!!
Согласен с Вами, но позволю заметить, что Вы говорите о near pointers но ведь есть еще и far pointers!
S>Напиример в винде нашим программам выделяется сегмент данных размером 2ГБ (ну мне кажется так сделано), а селектор этого сегмента загружается в DS, ES и SS!!! Механизм отлавливания левых указателей реализуется другим путём!!!
Мне тоже кажется, что dereferencing первых 64 КБ в Виндах реализуется другим путем, но дело в том, что Винды задействуют не все возможности даже 386-го процессора. К примеру, почему не задействованы 1 и 2 кольца защиты?
Можно ведь создать ОСь в которой отлавливание обращений по нулевому адресу будет использовать механизм описанный Генадием и самим manual-ом? Другими словами, то что поддерживается процессором не обязательно должно использоваться операционкой...
>> P.S. Я считаю, что лучше самому прочесть "первоисточники", чем их цитировать. Только поэтому я не стал приводить как раз именно эту >> фразу, которые Вы сами нашли. >> S>Я не жалею, что скачал — вещь действительно великолепная!!!
Жаль что их не печатают больше.
Re[7]: GDT
От:
Аноним
Дата:
01.01.05 12:36
Оценка:
T>А про интел мануал, так его качать не надо, на их сайте абсолютно на шару можно заказать бумажный вариант всех 4-х книг, они приходят через несколько дней прямо тебе домой (я заказал и не жалею качество книг офигительное, у нас "на книжке" (в Одессе) такие бы стоили долларов 20, а то и больше)
А когда Вы в последний раз заказывали эти мануалы? Я искал недавно, но сейчас, по-моему, только можно заказать CD.
> Согласен с Вами, но позволю заметить, что Вы говорите о near pointers > но ведь есть еще и far pointers! >
В винде их нет!!!
Если бы они были, то можно было бы организовать адресное пространство далеко превышающее 4ГБ, но только работа с ним была бы просто ужасной — не было бы никакой линейности памяти (за пределами сегмента) — тоесть было бы тоже самое, что и в реальном режиме, только размер сегмента 4ГБ!!! Поэтому мелкомягкие и не стали вводить всю эту порнуха, а сделали так, как есть!!!
> К примеру, почему не задействованы 1 и 2 кольца защиты? >
Им видать было проще все дрова там уместить, хотя некоторые высокоуровневые навроде файловых систем можно было бы и выше кинуть — вобщем на это смогут ответить только они (и то не факт)!!!
> Можно ведь создать ОСь в которой отлавливание обращений по нулевому > адресу будет использовать механизм описанный Генадием и самим > manual-ом? Другими словами, то что поддерживается процессором не > обязательно должно использоваться операционкой... >
Конечно можно, но как я уже говорил работа с таким адресным пространством сказкой не покажется!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
> В винде действует страничная адресация, поэтому 4Gb (а не 2, а на > Pentium Pro с 36 битной адресацией вообще 32Gb) >
Ну а какже тогда реализована защита верхних 2-х гигов адресного пространства ядра?
Почему вылетит исключение, если мы попробуем выше второго гига полезть (из 3-го кольца естественно)?
Уж не потому ли, что выделенный нам сегмент данных имеет предел в 2 гига?
> памяти на самом не выделяется просто при обращении праграммы к > "несуществующей" (не выделенной ей) странице памяти обработчик исключения > #PF выделяет ее из неизпользуемой памяти (или сначала свопит кого-нибудь). >
Я это всё и сам прекрасно знаю!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Здравствуйте, Stanky, Вы писали:
>> Согласен с Вами, но позволю заметить, что Вы говорите о near pointers >> но ведь есть еще и far pointers! >> S>В винде их нет!!! S>Если бы они были, то можно было бы организовать адресное пространство далеко превышающее 4ГБ, но только работа с ним была бы просто ужасной — не было бы никакой линейности памяти (за пределами сегмента) — тоесть было бы тоже самое, что и в реальном режиме, только размер сегмента 4ГБ!!! Поэтому мелкомягкие и не стали вводить всю эту порнуха, а сделали так, как есть!!!
>> К примеру, почему не задействованы 1 и 2 кольца защиты? >> S>Им видать было проще все дрова там уместить, хотя некоторые высокоуровневые навроде файловых систем можно было бы и выше кинуть — вобщем на это смогут ответить только они (и то не факт)!!!
>> Можно ведь создать ОСь в которой отлавливание обращений по нулевому >> адресу будет использовать механизм описанный Генадием и самим >> manual-ом? Другими словами, то что поддерживается процессором не >> обязательно должно использоваться операционкой... >> S>Конечно можно, но как я уже говорил работа с таким адресным пространством сказкой не покажется!!!
Гы гы Что ж ты все знаешь а такой чес гонишь ? Может тогда расскажешь как 32битная (36 в pentium pro) шина данных может адресовать больше 4 Гб (32 Гб) памяти ?
И вообще, как это ты собрался "выше второго гига полезть" ? Забудь о физических адресах в страничной адресации... Защита организована есесно так же как и обычно, на уровне страниц, и зашита в ОСь пиши хоть
mov ecx,-1
rep stosd
А в куда реале это будет писаться знает тока Винда и таблица страниц
> Гы гы Что ж ты все знаешь а такой чес гонишь ? >
Я не строю из себя всезнайку, как тебе кажется!!!
> Может тогда расскажешь как 32битная (36 в pentium pro) шина данных > может адресовать больше 4 Гб (32 Гб) памяти ? >
Ну во-первых начнём с того, что шина данных вообще ничего не адресует и является 64-х разрядной и нужна она для обмена данными, во-вторых адреса выставляются на шину адреса и она является 32-х разрядной, так что физически мы естественно не можем адресовать больше 4ГБ, а логически сколько угодно!!!
Простой пример: каждая задача в винде имеет своё адресное пространство в 4ГБ!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
TD>Гы гы Что ж ты все знаешь а такой чес гонишь ? Может тогда расскажешь как 32битная (36 в pentium pro) шина данных может адресовать больше 4 Гб (32 Гб) памяти ?
> И вообще, как это ты собрался "выше второго гига полезть" ? Забудь о > физических адресах в страничной адресации... >
Я и не говорил о физических адресах — я говорил про адресное пространство задач в винде!!!
> Защита организована есесно так же как и обычно, на уровне страниц, и > зашита в ОСь пиши хоть >
Ну по этому поводу нам спорить бесполезно, так как не ты ни я этого не знаем, но любой может быть прав!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
> Вообщем, читайте тут: http://www.wasm.ru/article.php?article=pipm10 >
Статья хоть и содрана с официального руководства, но содрана некачественно!!!
Ты раскритиковал всех в наигрубейших ошибках, а у себя ещё более грубой не обнаружил: таблица GDT единственная в системе, а таблица LDT может быть своя для каждой задачи!!! Регистр LDTR содержит 16-ти разрядный селектор, по которому в таблице GDT находится дескриптор LDT.- в нём хранится базовый адрес таблицы LDT и её предел!!!
Так что максимально возможное виртуальное адресное пространство = 8191 * 8192 * 4 * 1024 * 1024 * 1024 = (256 * 1024)ТБ — 4ГБ!!!
Кстати какой префикс идёт после терра и перед экза?
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re: GDT
От:
Аноним
Дата:
01.01.05 18:24
Оценка:
0 элемент используется для того, чтобы процессор смог обработать доступ к нулевому описателю сегмента.
Это применяется для обработки ошибок.