Привет всем обитателям WASM.ru! Где можно подробно прочитать(подробнейшая книга,не статья) про описание KUSER_SHARED_DATA и подобной хрени, имеется куча статей, понятно, что они все писаны по оригиналу, определенной книге,являющейся фундаментальной, посоветуйте пока есть в наличии свободное время смогу прочитать и наконец понять что и как существует, пока знания несколько пространственные. Завтра пойду в книжный и по вашему совету потрачу н-ную сумму. 1)Внимание без флуда пожалуйста 2) И не надо говорить что вопросы провоцируют на флуд 3) Просто "сказал" как отрезал и все
Coderess Руссинович,Соломон; откуда такие выводы?)) мои статьи, например, больше, чем наполовину из результатов реверсинга состоят. а общие слова, действительно, по руссиновичу
Выкинь нах, юзоем хидеры: Код (Text): typedef struct _KUSER_SHARED_DATA { // // Current low 32-bit of tick count and tick count multiplier. // // N.B. The tick count is updated each time the clock ticks. // ULONG TickCountLowDeprecated; ULONG TickCountMultiplier; // // Current 64-bit interrupt time in 100ns units. // volatile KSYSTEM_TIME InterruptTime; // // Current 64-bit system time in 100ns units. // volatile KSYSTEM_TIME SystemTime; // // Current 64-bit time zone bias. // volatile KSYSTEM_TIME TimeZoneBias; // // Support image magic number range for the host system. // // N.B. This is an inclusive range. // USHORT ImageNumberLow; USHORT ImageNumberHigh; // // Copy of system root in unicode. // WCHAR NtSystemRoot[260]; // // Maximum stack trace depth if tracing enabled. // ULONG MaxStackTraceDepth; // // Crypto exponent value. // ULONG CryptoExponent; // // Time zone ID. // ULONG TimeZoneId; ULONG LargePageMinimum; ULONG Reserved2[7]; // // Product type. // NT_PRODUCT_TYPE NtProductType; BOOLEAN ProductTypeIsValid; // // The NT Version. // // N. B. Note that each process sees a version from its PEB, but if the // process is running with an altered view of the system version, // the following two fields are used to correctly identify the // version // ULONG NtMajorVersion; ULONG NtMinorVersion; // // Processor features. // BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX]; // // Reserved fields - do not use. // ULONG Reserved1; ULONG Reserved3; // // Time slippage while in debugger. // volatile ULONG TimeSlip; // // Alternative system architecture, e.g., NEC PC98xx on x86. // ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture; // // If the system is an evaluation unit, the following field contains the // date and time that the evaluation unit expires. A value of 0 indicates // that there is no expiration. A non-zero value is the UTC absolute time // that the system expires. // LARGE_INTEGER SystemExpirationDate; // // Suite support. // ULONG SuiteMask; // // TRUE if a kernel debugger is connected/enabled. // BOOLEAN KdDebuggerEnabled; // // NX support policy. // UCHAR NXSupportPolicy; // // Current console session Id. Always zero on non-TS systems. // volatile ULONG ActiveConsoleId; // // Force-dismounts cause handles to become invalid. Rather than always // probe handles, a serial number of dismounts is maintained that clients // can use to see if they need to probe handles. // volatile ULONG DismountCount; // // This field indicates the status of the 64-bit COM+ package on the // system. It indicates whether the Intermediate Language (IL) COM+ // images need to use the 64-bit COM+ runtime or the 32-bit COM+ runtime. // ULONG ComPlusPackage; // // Time in tick count for system-wide last user input across all terminal // sessions. For MP performance, it is not updated all the time (e.g. once // a minute per session). It is used for idle detection. // ULONG LastSystemRITEventTickCount; // // Number of physical pages in the system. This can dynamically change as // physical memory can be added or removed from a running system. // ULONG NumberOfPhysicalPages; // // True if the system was booted in safe boot mode. // BOOLEAN SafeBootMode; // // The following field is used for heap and critcial sectionc tracing. The // last bit is set for critical section collision tracing and second last // bit is for heap tracing. Also the first 16 bits are used as counter. // ULONG TraceLogging; // // Depending on the processor, the code for fast system call will differ, // Stub code is provided pointers below to access the appropriate code. // // N.B. The following two fields are only used on 32-bit systems. // ULONGLONG TestRetInstruction; ULONG SystemCall; ULONG SystemCallReturn; ULONGLONG SystemCallPad[3]; // // The 64-bit tick count. // union { volatile KSYSTEM_TIME TickCount; volatile ULONG64 TickCountQuad; }; // // Cookie for encoding pointers system wide. // ULONG Cookie; // // Shared information for Wow64 processes. // ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES]; } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
а зачем? ты хочешь пропустить через мозг то, что накодили несколько сотен человек за 10 лет - и не все из них были в здравом уме ... проще написать свою операционку, наверное... пусть она будет не такая крутая, зато - будешь всё в ней знать - по этой причине до сих пор существует сообщество програмистов в Синклере - тусуются, общаются ...
Great Не. Меня вот его ответ в ступор надолго ввел. Он конечно слишком категоричный, но иногда для того, чтобы что-то понять нужно довести это что-то до абсурда.
Изучение даже плохой ОС является неплохим способом набраться опыта: по крайней мере, будешь знать, как можно, но не нужно писать ОС Однако само понятие "плохая ОС" (ну или "плохая программа" вообще) достаточно расплывчато. Например, в плохо спроектированной ОС могут быть фрагменты прекрасно написанного кода, а хорошо спроектированная, наоборот, может быть реализована безобразно. Что же касается собственно темы, то многое зависит от глубины первоначальных знаний. ОС -- это именно _система_, её надо изучать в комплексе, а для этого нужно иметь представление "верхнего уровня" и постепенно копать вниз. Соломон-Руссинович именно этот "верхний уровень" и дают, и дают весьма неплохо. "Средний уровень" -- это описание API, по большому счёту, но не просто список функций с параметрами, а с объяснениями, к каким последствиям эти вызовы приводят для программы, как функции API между собой связаны и т.д. Ну а как всё реализовано в самом низу -- тут да, нужны (в идеале) исходники и проектная документация на систему. Однако, к примеру, бесполезно пытаться разобраться со структурами данных, используемыми для управления памятью, если не знать, как же вообще ОС управляет этой самой памятью с точки зрения программиста-прикладника (как делится адресное пространство, какие возможности совместного использования памяти присутствуют, как память выделяется-освобождается и т.п.). Именно поэтому нельзя сказать, что книга такая-то является наилучшей: для одного человека на данном историческом этапе наилучшим будет одно, для другого -- другое...
Aspire Доведение до абсурда - плохое поведение. SII Ну в общем да, нужно начинать сверху и спускаться вниз. Так и изучается все обычно.
А че бы не снизу? Там загрузочная запись, адресация памяти, переключение режимов, прерывания.. и тд.. потом потоки, синхронизация и прочее?
Aspire Приведу другой пример Никогда никому не советовал начинать кодить с ассемблера. Большинство ни черта не понимают и так и не поймут, потому что сочтут программирование чрезвычайно сложным занятием. Все изучают от простого к сложному. От общего к частному. И так далее - это стандартная практика. Не надо переворачивать мир с ног на голову.
Aspire Потому что будет неясно, а на кой ляд это нужно, где и как используется и прочая и прочая. Кроме того, подобные вещи специфичны для конкретной архитектуры. Если человек не знает вообще, что такое виртуальная память, зачем она нужна и как работает при взгляде "с высоты птичьего полёта", нафиг ему сразу забивать голову конкретными форматами управляющих структур, используемыми конкретным процессором? Ему надо сначала понять саму идею, а затем уже, если понадобится, спускаться вниз, к реализации этого механизма на конкретной архитектуре. Или зачем ему сразу погружаться в переключение режимов ИА-32, если он вообще ещё не знает об их существовании и тем более о назначении? В общем, ассемблер плох тем, что в нём обычно легко понять, что делается, но сложно -- для чего делается. Не надо быть особо гениальным, чтобы запомнить: MOV пересылает данные из одного места в другое, ADD складывает, SUB вычитает... Но вот из мешанины этих и им подобных команд понять, например, идею алгоритма быстрой сортировки куда сложнее, чем при его записи на языке высокого уровня и тем более чем по изложению этого же алгоритма на обычном русском языке -- когда раскрывается именно идея, смысл тех или иных действий, а не всякие низкоуровневые подробности.
Прошу прощения за не конструктивную оценку выше(был в вакууме, есчо немного мутно..). Вобщем Руссиновича доки вполне не плохи, но там весьма поверхностно всё описано. У меня например подход следующий. Необходимо узнать какойто механизм, постепенно разбираются все его нюансы, код и структуры с ним связанные, из сурцов, но по большей части реверсом, некоторые факты берутся из какихто сторонних источников. После накопления множества отдельных фактов всё сложится в одну систему. Изучать очень подробные механизмы по докам просто читая всё подряд думаю не стоит, следует рассматривать интересные вещи. По сути я когдато с этого и начинал. Ось размещающаяся в 16к ром, где половину её занимал програмный сопроцессор математики, а остальную часть интерпретатор была хороша. И коденг под неё весьма доставлял. Кстати многие идеи оттуда взяты.
Clerk > После накопления множества отдельных фактов всё сложится в одну систему. > Изучать очень подробные механизмы по докам просто читая всё подряд > думаю не стоит, следует рассматривать интересные вещи. согласен, поскольку "от простого к сложному" не отрицает "от сложного к простому", а потому лучше всего двигаться к солотой середине познания с двух направлений. уже виртуальную память можно рассматривать и на уровне общих концепций абстрактной оси и на уровне конкретных структур конкретного процессора. причем, не по очереди, а сразу эххх.... было же золотое время в эпоху ms-dos, когда после программирования флоповода на уровне портов ввода/вывода мы вытирали пыль с головы, а сейчас все стало действительно очень сложным. учебников по асму нет, а тех что есть начинают сначала с реального режима, потом говорят: забудьте, скомканно объясняют защищенный и дают примеры на асме, сводящиеся к вызову api функций, опустив подробности испорта и подгрузки динамических библиотек.
как бы Руссионвич помогает задать направление исследования. Например, нужно мне было посмотреть как устроено LPC, сначала почитал у Руссиновича, потом посмотрел соответствующие сорцы, и в общем более-менее начал понимать механизм. А когда написал несколько тестовых програм, то вообще все стало хорошо
2 n0name: И што именно стало то хорошо ? ;( Кстати, никто не в курсе, а на кой ляд вообще этот LPC нужон то?? Типа чтобы отрисовывать окошки побыстрее ? Дааааcc, это отличная тема в M$-development