Ядро ОС Linux

Тема в разделе "WASM.HEAP", создана пользователем Nafanya, 3 дек 2011.

  1. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Всех приветствую.
    При чтении книги Роберта Лава по разработке ядра встретил следующее:
    "Фактически, можно заключить, что в операционной системе Linux процессор в любой момент времени выполняет один из трех типов действий:
    1) Работа от имени определенного процесса в режиме ядра в контексте процесса.
    2) Работа по обработке прерывания в режиме ядра в контексте прерывания, не связанном с процессами.
    3) Выполнение кода пользовательской программы в режиме задачи."

    Далее:
    "Ядро ОС Linux монолитное, т.е. оно выполняется в одном адресном пространстве, в режиме ядра"

    Нет ли противоречия между 1-ым пунктом и последним высказыванием: ведь контексты процессов - это разные адресные пространства, а потом говорится, что ядро выполняется в одном адресном пространстве? Как это понимать?

    Или код ядра находится в одном адресном пространстве и это пространство мапится на контексты всех процессов...
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Едрёное пространство адресов шарится между всеми процессами.
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Нету. Так как тут не формальное определение "контексте процесса."
     
  4. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Да, похоже контекст процесса - это не адресное пространство, как я считал ранее. Это такая же абстракция, как и файл:) Так как в контекст процесса можно подрубать целые адресные пространства, модифицируя таблицу страниц, например, замапить диапазон адресов, в котором находятся регистры управления контроллера некоторой PCI платы.
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Адресное пространство процесса в том числе. Как бы ещё иначе поток вернулся в юзермод? Именно шаринг пространства. Вы что с этим никогда не сталкивались?
     
  6. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Я только начал прорабатывать материал по ядру - решил инвестировать средства в самообразование и книг купил сегодня. С разработкой под Linux kernelmode раньше никогда не сталкивался (пару простеньких модулей писал дома, но это не в счёт). До настоящего момента развивался в usermode programming only.
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Nafanya
    Ты меня не понял. Русский язык не формальный. В нем много семантических правил связей.

    Поясню на примерах.
    1)Живёт в земле, камнями питается. Кто это?
    [большой, зелёный камнеед]
    2) Весь покрытый зеленью, абсолютно весь!?
    [новый русский]
    3) Что это такое: летит, шуршит, а не шуршавчик?
    [брат шуршавчика]
     
  8. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Next situation:
    По этому высказыванию читатель делает вывод, что при осуществлении systemcall'а и возврата из него не происходит context switching'а, т.к. код ядра выполняется в контексте текущего процесса. (не учитываем тот факт, что в любой момент может произойти context switching в связи с окончанием отведенного кванта времени).
    А что у пользовательских процессов(потоков) при возврате из пространства ядра происходит context swithing? По первому высказыванию, делается вывод, что не происходит, а теперь возникает неопределённость. Так происходит или нет context switching при осуществлении systemcall'а? Как правильно?
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Да что вы пристали к контекст свичу? Не происходит этого при переходе в ведро, поток выполняется в контексте вызвавшего процесса. Память шарится, одни и те же адреса мапятся на все процессы, сколько ещё раз надо это написать? Поток может непосредственно из ядра перейти на адрес текущего процесса(при этом он будет иметь ядрёные права) и ничего ему за это не будет.
     
  10. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Ну хорошо. Я просто пока не пойму зачем он вот это написал: Эти потоки работают только в пространстве ядра, и их контекст не переключается в пространство пользователя.
    А что существуют ситуации, когда контекст переключается из пространства ядра в пространство пользователя? Можете пример привести?
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Какие потоки? Вы вырвали фразу из контекста и её невозможно понять. Переключение контекстов процессов происходит постоянно, это нормальная ситуация.
     
  12. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Всё верно, как правило это так называемые отложенные процедуры. Что вас смущает? Наличие таких потоков?
     
  14. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Он говорит, что у потоков ядра контекст не переключается в пространство пользователя. А что разве существуют потоки, у которых контекст переключается из пространства ядра в пространство пользователя? Это неведомый для меня вид переключения контекста:)
     
  15. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Может быть правильней: у потоков ядра режим не переключается на пользовательский, а обычные потоки могут выполняться как в пользовательском режиме, так и в режиме ядра. Слово контекст там не в тему по-моему, режим правильней будет, хотя кто его знает.
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Есть контексты процессов, есть системный контекст. Поток работает в одном из этих контекстов. Переключаться потоку никуда не нужно. В чём вопрос? Если автор написал, что поток не переключатся, то вы решили что он таки может это делать? Weird logic.
     
  17. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Контекст процесса состоит из трёх частей: регистровый, системный и пользовательский.
    Регистровый контекст скорее всего переключается при переходе обычного процесса из usermode в kernelmode и обратно...
    Хотя нечего гадать на кофейной гуще - надо читать дальше, может ясно станет:) Чует моё сердце, что не просто так он сказал, что у потоков ядра контекст не переключается в пространство пользователя:) Значит у кого-то переключается:)
     
  18. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Nafanya
    Вы тут недавно кричали что многопоточность и алгоритмы планировщика для вас как воздух очевидно к использованию, что то изменилось ? Раз вы уже самых озов не понимаете.
    syscall происходят со сменой контекстов в юзер и кернел моды.

    Надо не просто читать "бабушкины сказки" , а еще кодесы смотреть , тогда станет все понятно и очевидно.

    Что начало что такое контекст ? дайте это определения дальше станет интрестней. Контекст процесса, потока, прирывания. Прирывания - что это , когда, зачем и сколько. Разрешены, запрещены. Вообще надо не просто читать абстракцию а смотреть семплы(код ядра).
     
  19. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    shchetinin
    В Linux потоки реализованы на базе процессов с совместно используемым адресным пространством. То есть clone вызывается как при создании потока, так и при создании процесса. Для потоков даже нет отдельной системной структуры, используется task_struct процесса - то бишь дескриптор процесса. Таким образом для Linux поток и процесс это одно и то же и различия между ними стёрты.
    Какого контекста - пользовательского, регистрового, системного? У процесса их три.
     
  20. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    При переключении контекста происходит сохранение и восстановление следующей информации:

    Регистровый контекст регистров общего назначения (в том числе флаговый регистр)
    Контекст состояния сопроцессора с плавающей точкой
    Состояние регистров MMX/SSE (x86)
    Состояние сегментных регистров (x86)
    Состояние некоторых управляющих регистров (например, регистр CR3 отвечающий за страничное отображение памяти процесса) (x86)

    В ядре ОС с каждым потоком связаны следующие структуры:

    Общая информация pid, tid, uid, gid, euid, egid,…
    Состояние процесса/потока
    Права доступа
    Используемые потоком ресурсы и блокировки
    Счетчики использования ресурсов (например таймеры использованного процессорного времени)
    Регионы памяти, выделенные процессу


    и так теперь становится очевидно что и для чего есть контекст.


    Отличае при переключинии таки есть(процесс, поток)

    Пример
    При переключении контекста между потоками, разделяющими одно адресное пространство в пределах одного процесса, ядро не трогает регистр CR3, тем самым сохраняя TLB

    Значит что контекст будет разный.

    Вообще пока вы не понимаете контекст процесса, потока, модуля ядра, для вас это будет просто текст.