القسم 2 TClass ذرة
في وحدة System.pas، يتم تعريف TClass على النحو التالي:
TClass = فئة TObject؛
وهذا يعني أن TClass هي فئة TObject. نظرًا لأن TObject نفسه عبارة عن فئة، فإن TClass هو ما يسمى بفئة الفئات.
من الناحية النظرية، TClass هو نوع من الفئة، أي فئة. ومع ذلك، نحن نعلم أن فئة DELPHI تمثل جزءًا من بيانات VMT. لذلك، يمكن اعتبار الفئة النوع المحدد لعنصر بيانات VMT، وهو في الواقع نوع مؤشر يشير إلى بيانات VMT!
في لغة C++ التقليدية السابقة، لم يكن من الممكن تحديد نوع الفصل. بمجرد تجميع الكائن، يتم إصلاحه، ويتم تحويل المعلومات الهيكلية للفئة إلى رمز الجهاز المطلق، ولن تكون معلومات الفئة الكاملة موجودة في الذاكرة. يمكن لبعض اللغات الموجهة للكائنات ذات المستوى الأعلى أن تدعم الوصول الديناميكي واستدعاء معلومات الفئة، ولكنها غالبًا ما تتطلب آلية تفسير داخلية معقدة والمزيد من موارد النظام. تمتص لغة Object Pascal من DELPHI بعض الميزات الممتازة للغات عالية المستوى الموجهة للكائنات، مع الاحتفاظ بالميزة التقليدية المتمثلة في تجميع البرامج مباشرة في كود الآلة، مما يحل بشكل مثالي مشاكل الوظائف المتقدمة وكفاءة البرنامج.
يرجع ذلك على وجه التحديد إلى أن DELPHI تحتفظ بمعلومات الفئة الكاملة في التطبيق، حيث يمكنها توفير وظائف متقدمة موجهة للكائنات مثل تحويل الفئات وتحديدها في وقت التشغيل، حيث تلعب بيانات VMT الخاصة بالفئة دورًا أساسيًا رئيسيًا. يمكن للأصدقاء المهتمين قراءة عمليتي تجميع AsClass وIsClass في وحدة النظام، وهما رموز التنفيذ الخاصة بـ as وis لتعميق فهمهم للفئات وبيانات VMT.
مع نوع الفئة، يمكنك استخدام الفئة كمتغير. يمكن فهم متغير الفئة على أنه كائن خاص، ويمكنك الوصول إلى توابع متغير الفئة تمامًا مثل الكائن. على سبيل المثال: دعونا نلقي نظرة على جزء البرنامج التالي:
يكتب
TsampleClass = فئة TsampleObject؛
TsampleObject = الفئة (TObject)
عام
إنشاء المنشئ؛
تدمير المدمرة؛
وظيفة الفئة GetSampleObjectCount:Integer;
الإجراء GetObjectIndex:Integer;
نهاية؛
فار
aSampleClass : TSampleClass;
كلاس: TClass؛
في هذا الكود، نحدد فئة TSampleObject ونوع الفئة المرتبطة بها TsampleClass، بالإضافة إلى متغيري الفئة aSampleClass وaClass. بالإضافة إلى ذلك، قمنا أيضًا بتعريف مُنشئ ومدمر وطريقة فئة GetSampleObjectCount وطريقة كائن GetObjectIndex لفئة TsampleObject.
أولاً، دعونا نفهم معنى متغيرات الفئة aSampleClass وaClass.
من الواضح أنه يمكنك التعامل مع TsampleObject و TObject كقيم ثابتة وتعيينهما لمتغيرات aClass، تمامًا مثل تعيين 123 قيمة ثابتة للمتغير الصحيح i. ولذلك فإن العلاقة بين أنواع الفئات والفئات ومتغيرات الفئة هي العلاقة بين الأنواع والثوابت والمتغيرات، ولكن على مستوى الفئة وليس على مستوى الكائن. بالطبع، ليس من القانوني تعيين TObject مباشرة إلى aSampleClass، لأن aSampleClass هو متغير فئة من فئة TSampleObject المشتقة من TObject، ولا يحتوي TObject على كافة التعريفات المتوافقة مع نوع TSampleClass. على العكس من ذلك، من القانوني تعيين TsampleObject لمتغير aClass، لأن TsampleObject هي فئة مشتقة من TObject ومتوافقة مع نوع TClass. وهذا مشابه تمامًا لعلاقة مطابقة التعيين والنوع لمتغيرات الكائن.
ثم دعونا نلقي نظرة على ما هي الأساليب الصفية.
تشير طريقة الفئة المزعومة إلى الطريقة التي يتم استدعاؤها على مستوى الفئة، مثل طريقة GetSampleObjectCount المحددة أعلاه، وهي طريقة تم الإعلان عنها بفئة الكلمات المحجوزة. تختلف أساليب الفئة عن أساليب الكائنات التي يتم استدعاؤها على مستوى الكائن. في تعريف TObject، يمكننا العثور على عدد كبير من أساليب الفئة، مثل ClassName، ClassInfo، NewInstance، وما إلى ذلك. من بينها، يتم تعريف NewInstance أيضًا على أنه افتراضي، أي طريقة فئة افتراضية. هذا يعني أنه يمكنك إعادة كتابة طريقة تنفيذ NewInstance في فئة فرعية مشتقة لإنشاء مثيلات كائن لتلك الفئة بطريقة خاصة.
يمكنك أيضًا استخدام المعرف self في أساليب الفصل، لكن معناه يختلف عن self في أساليب الكائنات. تمثل الذات في أسلوب الفصل فئتها الخاصة، أي المؤشر إلى VMT، بينما تمثل الذات في أسلوب الكائن الكائن نفسه، أي المؤشر إلى مساحة بيانات الكائن. على الرغم من أنه لا يمكن استخدام أساليب الفئة إلا على مستوى الفئة، إلا أنه لا يزال بإمكانك استدعاء أساليب الفئة من خلال كائن. على سبيل المثال، يمكن استدعاء أسلوب الفئة ClassName للكائن TObject من خلال العبارة aObject.ClassName، لأن البايتات الأربعة الأولى في مساحة بيانات الكائن التي يشير إليها مؤشر الكائن هي مؤشرات للفئة VMT. على العكس من ذلك، لا يمكنك استدعاء أساليب الكائن على مستوى الفئة، ويجب أن تكون عبارات مثل TObject.Free غير قانونية.
تجدر الإشارة إلى أن المنشئ هو أسلوب فئة، والمدمر هو أسلوب كائن!
ماذا؟ البناة هي أساليب فئة والمدمرات هي أساليب كائن! هل كان هناك أي خطأ؟
كما ترى، عندما تقوم بإنشاء كائن، فمن الواضح أنك تستخدم عبارة مشابهة لما يلي:
aObject := TObject.Create;
من الواضح أنه يستدعي طريقة إنشاء فئة TObject. عند حذف كائن، استخدم العبارة التالية:
aObject.Destroy;
حتى إذا كنت تستخدم الأسلوب المجاني لتحرير الكائن، يتم استدعاء الأسلوب تدمير الكائن بشكل غير مباشر.
السبب بسيط للغاية. قبل إنشاء الكائن، لم يكن الكائن موجودًا بعد، فقط الفئة موجودة. على العكس من ذلك، فإن حذف كائن يجب أن يؤدي إلى حذف الكائن الموجود، وليس الفئة.
أخيرًا، دعونا نناقش مسألة المنشئين الوهميين.
في لغة C++ التقليدية، يمكن تنفيذ أدوات التدمير الافتراضية، لكن تنفيذ المنشئات الافتراضية يمثل مشكلة صعبة. لأنه في لغة C++ التقليدية، لا توجد أنواع من الفئات. توجد مثيلات الكائنات العامة في مساحة البيانات العالمية في وقت الترجمة، كما أن كائنات الوظائف المحلية هي أيضًا مثيلات تم تعيينها في مساحة المكدس في وقت الترجمة. حتى الكائنات التي تم إنشاؤها ديناميكيًا يتم وضعها في بنية الفئة الثابتة باستخدام المثيلات المخصصة مساحة الكومة، والمنشئ هو مجرد أسلوب كائن يقوم بتهيئة مثيل الكائن الذي تم إنشاؤه. لا توجد أساليب فئة حقيقية في لغة C ++ التقليدية. حتى لو كان من الممكن تعريف ما يسمى بالطرق القائمة على الفئات الثابتة، فسيتم تنفيذها في النهاية كوظيفة عالمية خاصة، ناهيك عن أساليب الطبقة الافتراضية التي يمكنها استهداف كائن معين فقط الحالات. لذلك، تعتقد لغة C++ التقليدية أنه قبل إنشاء مثيل كائن معين، من المستحيل إنشاء الكائن نفسه بناءً على الكائن المراد إنشاؤه. وهو أمر مستحيل بالفعل، لأن هذا من شأنه أن يخلق مفارقة متناقضة في المنطق!
ومع ذلك، فإنه على وجه التحديد بسبب المفاهيم الأساسية لمعلومات نوع الفصل الديناميكي، وأساليب الفصل الافتراضية الحقيقية، والمنشئات التي يتم تنفيذها بناءً على الفئات في DELPHI، يمكن تنفيذ المنشئات الافتراضية. يتم إنتاج الأشياء عن طريق الفصول الدراسية. الكائن يشبه طفلًا ينمو، والطبقة هي أمه. ولا يعرف الطفل نفسه نوع الشخص الذي سيصبح عليه في المستقبل، لكن الأمهات يستخدمن أساليبهن التعليمية الخاصة لتربية أطفال مختلفات. أيها الناس، المبادئ واحدة.
في تعريف فئة TComponent، يتم تعريف المُنشئ على أنه افتراضي بحيث يمكن لأنواع مختلفة من عناصر التحكم تنفيذ طرق البناء الخاصة بها. هذه هي عظمة المفاهيم مثل الفئات التي أنشأتها TClass، وكذلك عظمة DELPHI.
.................................................. ..
الفصل 3 عرض الزمان والمكان في WIN32
نظر والدي العجوز إلى حفيده الصغير وهو يلعب بالألعاب على الأرض، ثم قال لي: "هذا الطفل يشبهك تمامًا عندما كنت صغيرًا. يحب تفكيك الأشياء ولا يتوقف إلا بعد رؤيتها حتى النهاية". عندما أفكر في طفولتي، غالبًا ما كنت أقوم بتفكيك سيارات الألعاب، وساعات المنبه الصغيرة، وصناديق الموسيقى، وما إلى ذلك، وكثيرًا ما كانت أمي توبخني.
في المرة الأولى التي فهمت فيها المبادئ الأساسية لأجهزة الكمبيوتر، كان الأمر يتعلق بصندوق الموسيقى الذي قمت بتفكيكه. كان ذلك في كتاب هزلي عندما كنت في المدرسة الثانوية. كان رجل عجوز ذو لحية بيضاء يشرح نظرية الآلات الذكية، وكان عمه ذو الشارب يتحدث عن أجهزة الكمبيوتر وصناديق الموسيقى. وقالوا إن وحدة المعالجة المركزية للكمبيوتر هي صف من قصب الموسيقى المستخدمة للنطق في صندوق الموسيقى، وبرنامج الكمبيوتر عبارة عن نتوءات مكتظة بكثافة على الأسطوانة الصغيرة في صندوق الموسيقى، ويعادل دوران الأسطوانة الصغيرة إلى دوران وحدة المعالجة المركزية، وهي الحركة الطبيعية لمؤشر التعليمات، بينما تتحكم النتوءات التي تمثل الموسيقى على الأسطوانة الصغيرة في اهتزاز القصبة الموسيقية لتنتج تعليمات تعادل تنفيذ البرنامج بواسطة المعالج المركزي. يصدر صندوق الموسيقى لحنًا جميلاً، يتم تشغيله وفقًا للنوتة الموسيقية المحفورة على الأسطوانة الصغيرة بواسطة الحرفي. يكمل الكمبيوتر معالجة معقدة بناءً على البرنامج المبرمج مسبقًا بواسطة المبرمج. بعد أن ذهبت إلى الكلية، علمت أن الرجل العجوز ذو اللحية البيضاء هو العملاق العلمي تورينج، وقد عززت نظريته عن الآلات المحدودة تطور ثورة المعلومات بأكملها، وكان العم ذو الشارب هو أبو أجهزة الكمبيوتر، فون نيومان. لا تزال هندسة الكمبيوتر هي الهيكل المعماري الرئيسي لأجهزة الكمبيوتر. لم يتم تفكيك صندوق الموسيقى عبثا، يمكن للأم أن تطمئن.
فقط من خلال الفهم البسيط والعميق يمكننا إنشاء إبداعات عميقة وموجزة.
سنناقش في هذا الفصل المفاهيم الأساسية المتعلقة ببرمجتنا في نظام التشغيل Windows 32 بت وإنشاء العرض الصحيح للزمان والمكان في WIN32. آمل أنه بعد قراءة هذا الفصل، يمكننا الحصول على فهم أعمق للبرامج والعمليات والخيوط، وفهم مبادئ الملفات القابلة للتنفيذ ومكتبات الارتباط الديناميكي وحزم وقت التشغيل، ورؤية الحقيقة بوضوح حول البيانات العالمية والبيانات المحلية والمعلمات في الذاكرة .
القسم 1 فهم العملية
لأسباب تاريخية، نشأ نظام Windows من DOS. في عصر DOS، كان لدينا دائمًا مفهوم البرنامج فقط، وليس مفهوم العملية. في ذلك الوقت، كانت أنظمة التشغيل العادية فقط، مثل UNIX وVMS، هي التي كانت تمتلك مفهوم العمليات، وكانت العمليات المتعددة تعني أجهزة كمبيوتر صغيرة ومحطات طرفية ومستخدمين متعددين، وهو ما يعني أيضًا المال. في معظم الأوقات، لم أتمكن من استخدام سوى أجهزة الكمبيوتر الصغيرة وأنظمة DOS الرخيصة نسبيًا، ولم أبدأ في التعامل مع العمليات وأجهزة الكمبيوتر الصغيرة إلا عندما كنت أدرس أنظمة التشغيل.
ولم يحدث ذلك إلا بعد Windows 3. في الماضي، في نظام DOS، كان من الممكن تنفيذ برنامج واحد فقط في نفس الوقت، ولكن في نظام Windows، كان من الممكن تنفيذ برامج متعددة في نفس الوقت. أثناء تشغيل برنامج في نظام DOS، لا يمكن تنفيذ نفس البرنامج في نفس الوقت، ولكن في نظام Windows، يمكن تشغيل أكثر من نسختين من نفس البرنامج في نفس الوقت، وكل نسخة قيد التشغيل من البرنامج عبارة عن عملية. لنكون أكثر دقة، كل تشغيل لأي برنامج يولد مهمة، وكل مهمة هي عملية.
عندما يتم فهم البرامج والعمليات معًا، يمكن اعتبار كلمة برنامج تشير إلى أشياء ثابتة. البرنامج النموذجي عبارة عن تعليمات برمجية ثابتة وبيانات مكونة من ملف EXE أو ملف EXE بالإضافة إلى عدة ملفات DLL. العملية هي تشغيل برنامج، وهو عبارة عن تعليمات برمجية وبيانات متغيرة ديناميكيًا تعمل ديناميكيًا في الذاكرة. عندما يكون هناك حاجة إلى برنامج ثابت للتشغيل، سيوفر نظام التشغيل مساحة معينة من الذاكرة لهذه العملية، وينقل رمز البرنامج الثابت والبيانات إلى مساحات الذاكرة هذه، ويعيد وضع رمز البرنامج والبيانات وتعيينها في هذه المساحة تنفيذها في الداخل، وبالتالي خلق عملية ديناميكية.
تشغيل نسختين من نفس البرنامج في نفس الوقت يعني وجود مساحتين للعمليات في ذاكرة النظام، لكن وظائف البرنامج الخاصة بهما هي نفسها، لكنهما في حالات مختلفة تتغير ديناميكيًا.
من حيث وقت تشغيل العملية، يتم تنفيذ كل عملية في نفس الوقت، ويطلق على المصطلح المهني التنفيذ المتوازي أو التنفيذ المتزامن. ولكن هذا هو في الأساس الشعور السطحي الذي يمنحنا إياه نظام التشغيل. في الواقع، يتم تنفيذ كل عملية بطريقة مشاركة الوقت، أي أن كل عملية تتناوب وتشغل وقت وحدة المعالجة المركزية لتنفيذ تعليمات البرنامج الخاصة بالعملية. بالنسبة لوحدة المعالجة المركزية، يتم تنفيذ تعليمات عملية واحدة فقط في نفس الوقت. نظام التشغيل هو المتلاعب وراء تشغيل العملية المجدولة، فهو يقوم باستمرار بحفظ وتبديل الحالة الحالية لكل عملية يتم تنفيذها في وحدة المعالجة المركزية، بحيث تعتقد كل عملية مجدولة أنها تعمل بشكل كامل ومستمر. نظرًا لأن جدولة العمليات المشتركة بالوقت سريعة جدًا، فهذا يعطينا الانطباع بأن العمليات كلها تعمل في نفس الوقت. في الواقع، التشغيل المتزامن الحقيقي يكون ممكنًا فقط في بيئة أجهزة متعددة وحدات المعالجة المركزية (CPU). عندما نتحدث عن الخيوط لاحقًا، سنجد أن الخيوط هي التي تحرك العملية حقًا، والأهم من ذلك أنها توفر مساحة للعملية.
من حيث المساحة التي تشغلها العملية، فإن كل مساحة عملية مستقلة نسبيًا، وكل عملية تعمل في مساحة مستقلة خاصة بها. يتضمن البرنامج كلاً من مساحة التعليمات البرمجية ومساحة البيانات. يشغل كل من التعليمات البرمجية والبيانات مساحة العملية. يخصص Windows الذاكرة الفعلية لمساحة البيانات التي تتطلبها كل عملية، ويستخدم بشكل عام أساليب المشاركة لمساحة التعليمات البرمجية، مما يؤدي إلى تعيين رمز واحد من البرنامج إلى عمليات متعددة للبرنامج. وهذا يعني أنه إذا كان البرنامج يحتوي على 100 كيلو من التعليمات البرمجية ويتطلب 100 كيلو من مساحة البيانات، مما يعني أنه مطلوب إجمالي 200 كيلو من مساحة العملية، فسيخصص نظام التشغيل 200 كيلو من مساحة العملية في المرة الأولى التي يتم فيها تشغيل البرنامج، و200 كيلو من مساحة العملية سيتم تخصيص المساحة في المرة الثانية التي يتم فيها تشغيل البرنامج. عند بدء العملية، يخصص نظام التشغيل 100 كيلو بايت فقط من مساحة البيانات، بينما تشارك مساحة التعليمات البرمجية مساحة العملية السابقة.
ما ورد أعلاه هو عرض الوقت والمكان الأساسي للعملية في نظام التشغيل Windows. في الواقع، هناك اختلاف كبير في عرض الوقت والمكان للعملية بين نظامي التشغيل Windows 16 بت و32 بت.
من حيث الوقت، فإن إدارة العمليات لأنظمة تشغيل Windows 16 بت، مثل Windows 3.x، بسيطة للغاية، وهي في الواقع مجرد نظام تشغيل لإدارة المهام المتعددة. علاوة على ذلك، تكون جدولة مهام نظام التشغيل سلبية. إذا لم تتوقف المهمة عن معالجة الرسالة، فيجب على نظام التشغيل الانتظار. نظرًا للعيوب الموجودة في إدارة العمليات لنظام Windows 16 بت، فعند تشغيل العملية، فإنها تشغل موارد وحدة المعالجة المركزية بالكامل. في تلك الأيام، لكي تتاح لـ Windows 16 بت فرصة لجدولة مهام أخرى، أشادت Microsoft بمطوري تطبيقات Windows لكونهم مبرمجين واسعي الأفق، لذلك كانوا على استعداد لكتابة بضعة أسطر إضافية من التعليمات البرمجية كهدية نظام التشغيل. على العكس من ذلك، تتمتع أنظمة التشغيل WIN32، مثل Windows 95 وNT، بقدرات نظام تشغيل متعددة العمليات ومتعددة المهام. تتم جدولة العملية في WIN32 بالكامل بواسطة نظام التشغيل بمجرد انتهاء الشريحة الزمنية للعملية قيد التشغيل، سيتحول نظام التشغيل بشكل فعال إلى العملية التالية بغض النظر عما إذا كانت العملية لا تزال تقوم بمعالجة البيانات. بالمعنى الدقيق للكلمة، لا يمكن اعتبار نظام التشغيل Windows 16 بت نظام تشغيل كامل، ولكن نظام التشغيل WIN32 32 بت هو نظام التشغيل الحقيقي. بالطبع، لن تقول Microsoft أن WIN32 يعوض عيوب Windows 16 بت، لكنها تدعي أن WIN32 يطبق تقنية متقدمة تسمى "تعدد المهام الوقائي"، وهي طريقة تجارية.
من منظور الفضاء، على الرغم من أن مساحة العملية في نظام التشغيل Windows 16 بت مستقلة نسبيًا، إلا أنه يمكن للعمليات الوصول بسهولة إلى مساحة بيانات بعضها البعض. لأن هذه العمليات هي في الواقع شرائح بيانات مختلفة في نفس المساحة الفعلية، ويمكن أن تؤدي عمليات العناوين غير الصحيحة بسهولة إلى قراءة وكتابة مساحة غير صحيحة، وتعطل نظام التشغيل. ومع ذلك، في نظام التشغيل WIN32، تكون كل مساحة عملية مستقلة تمامًا. يوفر WIN32 لكل عملية مساحة عنوان افتراضية ومستمرة تصل إلى 4G. ما يسمى بمساحة العنوان المستمر يعني أن كل عملية لها مساحة عنوان تتراوح من 00000000 دولار إلى FFFFFFFF، بدلاً من المساحة المقسمة لنظام Windows 16 بت. في WIN32، لا داعي للقلق بشأن تأثير عمليات القراءة والكتابة الخاصة بك عن غير قصد على البيانات في مساحات العمليات الأخرى، ولا داعي للقلق بشأن العمليات الأخرى التي قد تضايق عملك. وفي الوقت نفسه، فإن المساحة الافتراضية 4G المستمرة التي يوفرها WIN32 لعمليتك هي الذاكرة الفعلية التي تم تعيينها لك بواسطة نظام التشغيل بدعم من الأجهزة. على الرغم من أن لديك مثل هذه المساحة الافتراضية الواسعة، فإن النظام لن يضيع بايتًا أبدًا الذاكرة الجسدية .
القسم 2 مساحة العملية
عندما نستخدم DELPHI لكتابة تطبيقات WIN32، نادرًا ما نهتم بالعالم الداخلي للعملية عند تشغيلها. نظرًا لأن WIN32 يوفر 4G من مساحة المعالجة الافتراضية المستمرة لعمليتنا، فربما يستخدم أكبر تطبيق في العالم حاليًا جزءًا منها فقط. يبدو أن مساحة المعالجة غير محدودة، لكن مساحة معالجة 4G افتراضية، وقد تكون الذاكرة الفعلية لجهازك بعيدة عن هذا. على الرغم من أن العملية لديها مثل هذه المساحة الشاسعة، إلا أن بعض برامج الخوارزمية المعقدة ستظل غير قادرة على التشغيل بسبب تجاوز سعة المكدس، وخاصة البرامج التي تحتوي على عدد كبير من الخوارزميات العودية.
لذلك، فإن الفهم المتعمق لبنية مساحة عملية 4G وعلاقتها بالذاكرة الفعلية وما إلى ذلك سيساعدنا على فهم عالم الزمكان لـ WIN32 بشكل أكثر وضوحًا، حتى نتمكن من استخدام الأساليب الصحيحة في أعمال التطوير الفعلية النظرة العالمية والمنهجية لحل المشاكل الصعبة المختلفة.
بعد ذلك، سوف نستخدم تجربة بسيطة لفهم العالم الداخلي لمساحة معالجة WIN32. قد يتطلب هذا بعض المعرفة بسجلات CUP ولغة التجميع، لكنني حاولت شرح ذلك بلغة بسيطة.
عند بدء تشغيل DELPHI، سيتم إنشاء مشروع Project1 تلقائيًا وسنبدأ به. قم بتعيين نقطة توقف في أي مكان في البرنامج الأصلي لـ Project1.dpr، على سبيل المثال، قم بتعيين نقطة توقف عند جملة البداية. ثم قم بتشغيل البرنامج وسوف يتوقف تلقائيا عندما يصل إلى نقطة التوقف. في هذا الوقت، يمكننا فتح نافذة وحدة المعالجة المركزية في أداة التصحيح لمراقبة البنية الداخلية لمساحة العملية.
تم إيقاف سجل مؤشر التعليمات الحالي Eip عند $0043E4B8 من أعلى رقمين سداسيين عشريين للعنوان حيث توجد تعليمات البرنامج كلاهما صفر، يمكن ملاحظة أن البرنامج الحالي في موضع العنوان أسفل 4G. مساحة العملية، التي تشغل 00000000 دولار إلى مساحة عنوان صغيرة جدًا مقابل FFFFFFFF $.
في مربع الأوامر في نافذة وحدة المعالجة المركزية، يمكنك البحث عن محتويات مساحة العملية. عند عرض محتوى مساحة أقل من 00400000 دولار، ستجد سلسلة من علامات الاستفهام "؟؟؟؟" تظهر في المحتوى أقل من 00400000 دولار، وذلك لأن مساحة العنوان لم يتم تعيينها على المساحة الفعلية. إذا نظرت إلى القيمة السداسية العشرية للمتغير الشامل HInstance في هذا الوقت، فستجد أنها أيضًا 00400000 دولار. على الرغم من أن HInstance يعكس مقبض مثيل العملية، فهو في الواقع قيمة عنوان البداية عند تحميل البرنامج في الذاكرة، وكذلك في نظام التشغيل Windows 16 بت. ولذلك يمكننا أن نعتقد أن برنامج العملية يتم تحميله ابتداءً من 00400000 دولار، أي أن المساحة التي تبدأ من 4M في الفضاء الافتراضي 4G هي المساحة التي يتم فيها تحميل البرنامج.
بدءًا من 00400000 دولار أمريكي وما قبله وحتى 0044D000 دولار أمريكي، فهي بشكل أساسي مساحة عنوان رمز البرنامج والبيانات العالمية. في مربع المكدس في نافذة وحدة المعالجة المركزية، يمكنك عرض عنوان المكدس الحالي. وبالمثل، ستجد أن مساحة عنوان المكدس الحالية تتراوح من 0067B000 دولار إلى 00680000 دولار، ويبلغ طولها 5000 دولار. في الواقع، الحد الأدنى لحجم مساحة المكدس للعملية هو 5000 دولار، والذي يتم الحصول عليه بناءً على قيمة الحد الأدنى لحجم المكدس المعينة في صفحة الرابط الخاصة بـ ProjectOptions عند ترجمة برنامج DELPHI، بالإضافة إلى 1000 دولار. ينمو المكدس من العنوان العلوي إلى الأسفل عندما لا يكون المكدس كافيًا عند تشغيل البرنامج، سيقوم النظام تلقائيًا بزيادة حجم مساحة المكدس باتجاه العنوان السفلي مساحة العملية. عند ترجمة برنامج DELPHI، يمكنك التحكم في الحد الأقصى لمساحة المكدس التي يمكن زيادتها عن طريق تعيين قيمة الحد الأقصى لحجم المكدس في صفحة الرابط في ProjectOptions. خاصة في البرامج التي تحتوي على علاقات استدعاء روتينية عميقة أو تستخدم خوارزميات متكررة، يجب تعيين قيمة الحد الأقصى لحجم المكدس بشكل معقول. نظرًا لأن استدعاء روتين فرعي يتطلب مساحة مكدس، وبعد استنفاد المكدس، فسيقوم النظام بإلقاء خطأ "تجاوز سعة المكدس".
يبدو أن مساحة العملية بعد مساحة المكدس يجب أن تكون مساحة حرة. في الواقع، ليس هذا هو الحال، تشير المعلومات ذات الصلة بـ WIN32 إلى أن مساحة 2G بعد 80.000.000 دولار هي المساحة التي يستخدمها النظام. يبدو أن العملية يمكن أن تمتلك مساحة 2G فقط. في الواقع، المساحة التي يمكن أن تمتلكها العملية حقًا ليست حتى 2G، لأن مساحة 4M من 00000000 دولار إلى 00400000 دولار هي أيضًا منطقة محظورة.
ولكن بغض النظر عن ذلك، فإن العناوين التي يمكن أن تستخدمها عمليتنا لا تزال واسعة جدًا. خاصة بعد مساحة المكدس والتي تتراوح قيمتها بين 80.000.000 دولار، فهي ساحة المعركة الرئيسية لمساحة العملية. سيتم تعيين مساحة الذاكرة المخصصة بواسطة العملية من النظام إلى هذه المساحة، وسيتم تعيين مكتبة الارتباط الديناميكي التي تم تحميلها بواسطة العملية إلى هذه المساحة، كما سيتم تعيين مساحة مكدس مؤشر الترابط الخاص بمؤشر الترابط الجديد إلى هذه المساحة، تقريبًا كل شيء سيتم تعيين جميع العمليات التي تتضمن تخصيص الذاكرة إلى هذه المساحة. يرجى ملاحظة أن التعيين المذكور هنا يعني المراسلات بين الذاكرة الفعلية وهذه المساحة الافتراضية. لا يمكن استخدام مساحة العملية غير المعينة للذاكرة الفعلية، تمامًا مثل السلسلة "" في مربع الأوامر في نافذة وحدة المعالجة المركزية أثناء التصحيح؟ ؟؟؟".
............
شكرا للقراءة!