|
|
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
Не до конца понимаю работу процессов в ОС Виндовс. Вот есть у нас ехе файл, который можно запустить на выполнение. Что происходит когда мы запускаем его? - ОС инициализирует новый процесс(создает контекст процесса) и загружает содержимое файла в сегмент кода процесса. Известно что оперативная память делится на сегменты кода, данных и стека. Получается что на каждый процесс создаются эти сегменты. Не ясно каким образом инициализируется сегмент данных. Не ясно как именно код начинает выполнятся, вот есть точка входа(функция мейн) с точки зрения сорцов с ней все ясно, а вот что означает точка входа в контексте выполнения процесса - мрак. Теперь про стек. Я так понимаю в стек грузится код из сегмента кода, правильно? Но тут у меня путаница со стеком CLR, который содержит данные... В общем хочу разложить по полочкам работу процессов в виндовсе, экстраполируя это все на CLR Кому не лень побеседовать на эту тему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2011, 23:42 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
EsofterНе до конца понимаю работу процессов в ОС Виндовс. Вот есть у нас ехе файл, который можно запустить на выполнение. Что происходит когда мы запускаем его? - ОС инициализирует новый процесс(создает контекст процесса) и загружает содержимое файла в сегмент кода процесса. Известно что оперативная память делится на сегменты кода, данных и стека. Получается что на каждый процесс создаются эти сегменты. Не ясно каким образом инициализируется сегмент данных. Не ясно как именно код начинает выполнятся, вот есть точка входа(функция мейн) с точки зрения сорцов с ней все ясно, а вот что означает точка входа в контексте выполнения процесса - мрак. Теперь про стек. Я так понимаю в стек грузится код из сегмента кода, правильно? Но тут у меня путаница со стеком CLR, который содержит данные... В общем хочу разложить по полочкам работу процессов в виндовсе, экстраполируя это все на CLR Кому не лень побеседовать на эту тему? лень кончно. освой asm(лично я осваивал через AFD. переход ЕС-Intel) , хотяб под дос. там все увидишь(16-разряд более понятнее, ). ну и есть прекрасный нелр от Нортона, с расширением .ng ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2011, 23:58 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
Esofterв принципе можно и книгу почитать например эту хотя вроде как Рихтер тоже что-то писал в этом роде вот здесь, ты не получишь ответа на >>> Известно что оперативная память делится на сегменты кода, данных и стека. Получается что на каждый процесс создаются эти сегменты. Не ясно каким образом инициализируется сегмент данных. Не ясно как именно код начинает выполнятся, вот есть точка входа(функция мейн) с точки зрения сорцов с ней все ясно, а вот что означает точка входа в контексте выполнения процесса - мрак. Теперь про стек. Я так понимаю в стек грузится код из сегмента кода, правильно? Но тут у меня путаница со стеком CLR, который содержит данные... <<< выделенному, хехе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:05 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
mcccвыделенному, хехе ну я ж говорю что экстраполировался на стек CLR, а именно стек вызовов. Возможно я что-то путаю, но я сюда и пришел за просветлением :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:07 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
Esoftermcccвыделенному, хехе ну я ж говорю что экстраполировался на стек CLR, а именно стек вызовов. Возможно я что-то путаю, но я сюда и пришел за просветлением :) изначально, из твоих, я понял, тебе интересен стык железо-программа. а CLR..., тут копать и копать(скажем, a++, в естестенном коде займет 2 байта, а посмотришь CLR, там ~60-100б). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:12 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
Esofter Известно что оперативная память делится на сегменты кода, данных и стека. Получается что на каждый процесс создаются эти сегменты. не известно. EsofterНе ясно каким образом инициализируется сегмент данных. копируется с исполняемого файла, побайтно тютелька в тютельку. EsofterНе ясно как именно код начинает выполнятся, вот есть точка входа(функция мейн) с точки зрения сорцов с ней все ясно, а вот что означает точка входа в контексте выполнения процесса - мрак. у процессора есть указатель текущей команды, вот он и выставляется на адрес первой инструкции ф-и майн. EsofterТеперь про стек. Я так понимаю в стек грузится код из сегмента кода, правильно? Но тут у меня путаница со стеком CLR, который содержит данные... неправильно ты понимаешь. со стеком мы работаем в момент выполнения программы посредством инструкций push, pop, call, ret. EsofterВ общем хочу разложить по полочкам работу процессов в виндовсе, экстраполируя это все на CLR увы, но я не знаю как CLR. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:13 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
Esoftermcccвыделенному, хехе ну я ж говорю что экстраполировался на стек CLR, а именно стек вызовов. Возможно я что-то путаю, но я сюда и пришел за просветлением :) при вызове ф-и, в стек заносятся локальные переменные и адрес возврата, но еще стеком можно пользоваться для хранения промежуточных результатов вычисления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:14 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
[quote ZyK_BotaN]Esofterнеправильно ты понимаешь. со стеком мы работаем в момент выполнения программы посредством инструкций push, pop, call, ret. ну так а что ложится-то в стек? Инструкции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:15 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNEsofterпропущено... ну я ж говорю что экстраполировался на стек CLR, а именно стек вызовов. Возможно я что-то путаю, но я сюда и пришел за просветлением :) при вызове ф-и, в стек заносятся локальные переменные и адрес возврата, но еще стеком можно пользоваться для хранения промежуточных результатов вычисления. то есть стек вызовов - это просто цепочка адресов возврата? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:16 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
EsofterИзвестно что оперативная память делится на сегменты кода, данных и стека. Получается что на каждый процесс создаются эти сегменты. это деление происходит не в оперативке а в процессоре: есть сегменты данных, стека, кода и еще один(ds, ss, cs, es). все эти регистры могут указывать на один и тот же адрес. так делается например в досовских .com-ах. стек работает от старших адресов, поэтому он не мешает сегменту данных и кода, ну пока не переполнится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:17 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
[quot Esofter]ZyK_BotaNпропущено... ну так а что ложится-то в стек? Инструкции? нет. данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:18 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
EsofterZyK_BotaNпропущено... при вызове ф-и, в стек заносятся локальные переменные и адрес возврата, но еще стеком можно пользоваться для хранения промежуточных результатов вычисления. то есть стек вызовов - это просто цепочка адресов возврата? нет стека вызовов, есть просто стек, поэтому там не только адреса возврата, но и локальные переменные, да и любые данные которые тебе вздумалось хранить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:19 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNEsofterИзвестно что оперативная память делится на сегменты кода, данных и стека. Получается что на каждый процесс создаются эти сегменты. это деление происходит не в оперативке а в процессоре: есть сегменты данных, стека, кода и еще один(ds, ss, cs, es). все эти регистры могут указывать на один и тот же адрес. так делается например в досовских .com-ах. стек работает от старших адресов, поэтому он не мешает сегменту данных и кода, ну пока не переполнится. то есть адреса инструкций заносятся в свои регистры, а адреса данных в свои? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:20 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
по поводу функции мейн тут не все так просто. Я как-то видел тут один мембер описывал что происходит на самом деле. Но уже подзабыл. Про мембера знаю что он тусуется в ветке С++ и что он с Одессы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:22 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
EsofterZyK_BotaNпропущено... это деление происходит не в оперативке а в процессоре: есть сегменты данных, стека, кода и еще один(ds, ss, cs, es). все эти регистры могут указывать на один и тот же адрес. так делается например в досовских .com-ах. стек работает от старших адресов, поэтому он не мешает сегменту данных и кода, ну пока не переполнится. то есть адреса инструкций заносятся в свои регистры, а адреса данных в свои? не совсем. есть прост регистры ds, ss, cs,es, которые указывают на начало сегментов, но в реале можна работать с данными не пребегая к ds или es. я уже привел приме .com, емнип все сегменты указывают на один и тот же адрес, поэтому максимальный размер программы 65 кб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:24 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
Esofterпо поводу функции мейн тут не все так просто. Я как-то видел тут один мембер описывал что происходит на самом деле. Но уже подзабыл. Про мембера знаю что он тусуется в ветке С++ и что он с Одессы... а что не просто? подготовка аргументо? или что? я просто сказал тебе как указывается начало выполнения программы. просто адрес 1-й инструкции записывается в указатель текущей инструкции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:26 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
кстати, в защищенном режиме все выглядит немного сложнее )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:27 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNEsofterпропущено... то есть адреса инструкций заносятся в свои регистры, а адреса данных в свои? не совсем. есть прост регистры ds, ss, cs,es, которые указывают на начало сегментов, но в реале можна работать с данными не пребегая к ds или es. я уже привел приме .com, емнип все сегменты указывают на один и тот же адрес, поэтому максимальный размер программы 65 кб. кажется вспомнил ds - data segment ss - stack segment cs - code segment по-моему был какой-то регистр di, которым задавалось то ли смещение в сегменте то ли что... А вот по поводу 65 Кб чет ничего сказать не могу... Откуда дровишки и как это обходится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:31 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
EsofterZyK_BotaNпропущено... не совсем. есть прост регистры ds, ss, cs,es, которые указывают на начало сегментов, но в реале можна работать с данными не пребегая к ds или es. я уже привел приме .com, емнип все сегменты указывают на один и тот же адрес, поэтому максимальный размер программы 65 кб. кажется вспомнил ds - data segment ss - stack segment cs - code segment по-моему был какой-то регистр di, которым задавалось то ли смещение в сегменте то ли что... А вот по поводу 65 Кб чет ничего сказать не могу... Откуда дровишки и как это обходится? 64 кб. это для 16-разрядного доса так было для .com-ов. просто 16-разрядный сегмент - 64 кб, а отличие кома от экз, что сегмент только один. а терь про di, там не только был di но и si, но и без них можно было обходится. di - место назначения si - источник но все эти названия условны. Как обходится, а зачем это обходить в эру виндовза и дотНета? )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 00:36 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNя уже привел приме .com, емнип все сегменты указывают на один и тот же адрес, поэтому максимальный размер программы 65 кб.Изменяет тебе память, изменяет. Во первых, DOS для .com устанавливала только CS и SS, a DS и ES на момент старта программы оставались в случайном состоянии. Их надо было ставить самому (push cs/pop ds). Во вторых, никто не запрещал задавать новые значения для сегментных регистров (включая CS через long jump). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 04:10 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
Гляньте еще раз, правильно ли я понимаю. Каждый из сегментных регистров содержит адрес начала соответственного сегмента в ОП. С помощью индексных регистров задается смещение и таким образом мы попадаем в нужное место ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 11:13 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
White OwlВо вторых, никто не запрещал задавать новые значения для сегментных регистров (включая CS через long jump). динамически задавать - да. но статически размер ком-файла разве мог превышать 64 кб? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 19:35 |
|
||
|
Нужно кое-что прояснить.
|
|||
|---|---|---|---|
|
#18+
[quot White Owl]ZyK_BotaN(включая CS через long jump). При определённых условиях это могло привести к ошибке. В отличие от retf/iret... ZyK_BotaNно статически размер ком-файла разве мог превышать 64 кб? Запросто. Вот только загружалось при этом (в зависимости от версии) либо 64 кб, либо (size mod 64k)... а в первом случае "хвост" ещё и частично и непредсказуемо разрушался, ибо регистры стека указывали именно туда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 20:02 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=37319005&tid=1342864]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
187ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 499ms |

| 0 / 0 |
