كان هذا منحنى تعليمي رائع ساعدني على ما يبدو على تعزيز الأفكار النظرية والمفاهيمية المحيطة بالنظريات/القوانين على أسرار أنظمة التشغيل والنواة الأساسية. لقد افترضت ، كان لدي فكرة جيدة عن كيفية عمل OSS. ومع ذلك ، كان إنشاء نظام التشغيل الخاص بي أكثر تحديدًا مقارنةً بقراءة فقط. في رأيي الصادق. كانت هذه طريقة بالنسبة لي للحصول على فهم أفضل للبرامج التي أرغب في العبث بها على وضع kernel ووضع المستخدم.
قبل أن نبدأ ، على الرغم من أن نظام التشغيل ونظام التشغيل هو 32 بت. سأشرح المفاهيم في 64 بت أيضًا ، من الواضح أن أحدها وضع طويل.
أوضاع
المقاطعات
الواصفات
الترحيل
اقرأ المزيد عن الوضع المحمي في Intel® 64 و IA-32 Architectures Developer Developer Volume 3A: دليل برمجة النظام ، الجزء 1 ؛ الفصل 3 *
ما هي المقاطعات
يمكنك التفكير في المقاطعات باعتبارها إشارة أو بيانات يتم إرسالها بواسطة جهاز مثل لوحة المفاتيح أو محرك الحالة الصلبة أو برنامج التشغيل الصلب أو الماوس والبرامج التي تخبر وحدة المعالجة المركزية بحدوث حدث ما ويحتاج إلى إيقاف ما يفعله حاليًا ، للمضي قدمًا في ما الذي أرسله إلى المقاطعة.
على سبيل المثال ، عند الانتقال/النقر فوق الماوس ، سترسل وحدة تحكم الماوس مقاطعة إلى وحدة التحكم في المقاطعة لوحدة المعالجة المركزية ، ستذهب انتباه وحدة المعالجة المركزية على الفور إلى مقاطعة الماوس وستتابع تنفيذ روتين (حركة الماوس أو النقر). بعد مقاطعة الماوس ، ستستمر وحدة المعالجة المركزية في القيام بكل ما كان عليه قبل المقاطعة أو الذهاب لإدارة مقاطعة أخرى إذا كانت إشارة إليها.
+------------------------+ +------------+
| TYPES OF INTERRUPTS |------------| Exceptions |
+------------------------+ +------------+
/
/
/
+------------+ +------------+
| HARDWARE | | SOFTWARE |
| INTERRUPTS | | INTERRUPTS |
+------------+ +------------+
خطوط IRQ ، أو IRQs المستندة إلى دبوس: هذه عادة ما يتم توجيهها بشكل ثابت على مجموعة الشرائح. يتم تشغيل الأسلاك أو الخطوط من الأجهزة الموجودة على مجموعة الشرائح إلى وحدة تحكم IRQ التي تسلسل طلبات المقاطعة التي ترسلها الأجهزة ، وإرسالها إلى وحدة المعالجة المركزية واحدة تلو الأخرى لمنع السباقات. في كثير من الحالات ، سترسل وحدة تحكم IRQ IRQs متعددة إلى وحدة المعالجة المركزية في وقت واحد ، بناءً على أولوية الجهاز. مثال على وحدة تحكم IRQ المعروفة جيدًا هي سلسلة وحدة تحكم Intel 8259 ، والتي توجد على جميع شرائح IBM-PC المتوافقة مع وحدة التحكم في IBM-PC ، كل منها يوفر 8 دبابيس إدخال لما مجموعه 16 دبابيس إشارات IRQ قابلة للاستخدام على IBM-PC.
المقاطعات المستندة إلى الرسائل: يتم الإشارة إلى هذه عن طريق كتابة قيمة لموقع الذاكرة المخصصة للحصول على معلومات حول الجهاز المقاطع ، والمقاطعة نفسها ، ومعلومات المتجهة. يتم تعيين الجهاز موقعًا يكتب إليه إما عن طريق البرامج الثابتة أو بواسطة برنامج kernel. بعد ذلك ، يتم إنشاء IRQ بواسطة الجهاز باستخدام بروتوكول التحكيم الخاص بحافلة الجهاز. مثال على الناقل الذي يوفر وظائف المقاطعة القائمة على الرسائل هو ناقل PCI. بقلم wiki.osdev - https://wiki.osdev.org/interrupts
الإدخال - يحدد الإدخال منطقة في الذاكرة حيث تبدأ ، إلى جانب حد المنطقة وامتيازات الوصول المرتبطة بالإدخال. امتياز الوصول كما في إخبار المعالج إذا كان نظام التشغيل يعمل في النظام (الحلقة 0) أو التطبيق (الحلقة 3). يمنع التطبيقات أو UserMode من الوصول إلى بعض السجلات/المعاملات والعلماء mnemonic. مثل سجلات CR و CLI/STI على التوالي.
الحد - حجم واصف القطاع
محدد القطاع - إنها سجلات تحمل فهرس الواصفات
أن تكون أكثر وضوحًا ، فهرس ليس محددًا
الأشياء التي يحتفظ بها تسجيل القطاع:
الوصول إلى جدول الواصف له امتياز أيضًا ، ويسمى هذا RPL (مستوى امتياز الطلب) لكل سجل ولكن يسمى cs (مستوى الامتياز الحالي). كلاهما يخدمان أغراض مختلفة ، يمكنك اكتشافه في أدلة Intel أو AMD.
الجدول لاستخدامه للنظر في. جدول واحد هو GDT الآخر هو LDT.
قاعدة غير رسمية للتخيل من الناحية النظرية استخدام المحدد: وبالتالي فإن القاعدة غير الرسمية هي:
concector = index + table_to_use + امتياز table_to_use + index = واصف = جميع المعلومات حول شريحة الذاكرة المراد استخدامها
حيث لا تعد علامة Plus عملية حسابية
حقل بت سجل محدد القطاع:
15 3 2 0
+--------------------------------------------------+----+--------+
| Index | TI | RPL |
+--------------------------------------------------+----+--------+
TI = Table Indicator: 0 = GDT, 1 = LDT
The TI specify if the Descriptor were dealing with is a GDT or LDT
IF(TI == 0) THEN
... THE DESCRIPTOR IS A GDT
ELSEIF(TI == 1) THEN
... THE DESCRIPTOR IS A LDT
GDT هو 1: 1 مع عنوان منطقي ، مثال على GDT يعمل مع المحدد:
<---- Selector ----> +----- Segment Selector Register
+-------+----+-----+ v
| Index | TI | RPL | = DS
+-------+----+-----+ GDT LDT
| | +---------------------+ +---------------------+
| +------------>| Null Descriptor | | Null Descriptor |
| +---------------------+ +---------------------+
| | Descriptor 1 | | Descriptor 1 |
| +---------------------+ +---------------------+
| | | | |
| ... ... ... ... ... ... ... ...
| | |
| +---------------------+
+------------------->| Descriptor K |
+---------------------+
| |
... ... ... ...
RPL (Request Privilege Level) describes the privilege for accessing the descriptor
نقوم بتخزين جميع قاعدة GDT (العنوان) والحد (حجم GDT لدينا) في GDTR. يشير GDTR إلى جميع إدخالات GDT الخاصة بنا في الذاكرة ، بدءًا من القاعدة. بعد ذلك ، يتم تحميله بعد ذلك مع ذاكري lgdt :
typedef union _gdt_descriptor
{
struct
{
uint64_t limit_low : 16 ;
uint64_t base_low : 16 ;
uint64_t base_middle : 8 ;
uint64_t access : 8 ;
uint64_t granularity : 8 ;
uint64_t base_high : 8 ;
};
} __attribute__((packed)) gdt_entry_t ;
gdt_entry_t gdt_entrys[ 256 ];
/* The GDTR (GDT Register) */
struct gdtr
{
uint16_t limit;
uint32_t base;
} __attribute__((packed)) gdtr;
...
gdtr.base = &gdt_entrys;
gdtr.limit = ( sizeof (gdt_descr) * 256 ) - 1 )
اقرأ المزيد عليه في دليل Amd64 Architecture Programmer ، المجلد 2 ، القسم 4.7 (ص. 84 - 90 {+})
الإشارة إلى هذا وما فصاعدا. https://notes.shichao.io/utlk/ch2/#paging-in-hardware كان هذا هو أكثر متعة إلى حد بعيد ، كنت متحمسًا للغاية بمجرد أن أفهمها.
x86 OS Legacy-Paking العنوان الظاهري مع صفحات 4 كيلو بايت:
X86 OS CR4.PAE PARAING العنوان الظاهري مع صفحة 4 كيلو بايت:
x86_64 (IA-32E) OS CR4.LME/CR4.PAE العنوان الافتراضي مع صفحة 4 كيلو بايت:
• أعلام WP و PG في سجل التحكم CR0 (بت 16 و Bit 31 ، على التوالي).
• أعلام PSE و PAE و PGE و PCIDE و SMEP و SMAP و PKE في سجل التحكم CR4 (بت 4 ، بت 5 ، بت 7 ، بت 17 ، بت 20 ، بت 21 ، بت 22 ، على التوالي).
• أعلام LME و NXE في IA32_EFER MSR (بت 8 و Bit 11 ، على التوالي). • علامة AC في سجل EFLAGS (بت 18). بموجب الفصل 4 من Intel® 64 و IA-32 Architectures Developer Developer Volume 3A: System Programming Guide ، Part 1 ؛ الفصل 4
• أعلام LME و NXE في IA32_EFER MSR (بت 8 و Bit 11 ، على التوالي). • علامة AC في سجل EFLAGS (بت 18). الفصل 4 من Intel® 64 و IA-32 Architectures Developer Developer Volume 3A: دليل برمجة النظام ، الجزء 1 ؛ الفصل 4
إذا تم تعيين CR4.PAE و/أو CR4.LME على 1 ، فإن PSE يتم تجاهله تمامًا.
لم تتم إضافة محطة
cd smkrnl; make run
من أجل شرارة الإلهام/الدعم على جهدي المستمر في هذا المشروع ومساعدتي في فهم مفاهيم معينة في تطوير kernel/OS. =)