*إذا كانت معلمات برنامج المستخدم تشير إلى جزء من الذاكرة في الصفحة 3 (الصفحة الأخيرة) ، فهناك تعارض لأن kernel ستعمل دائمًا على تعيين صفحة RAM داخل هذه الصفحة بالضبط أثناء syscall. وبالتالي ، سوف يعيد تعيين الصفحة 3 للمستخدم إلى الصفحة 2 (الصفحة الثالثة) للوصول إلى معلمات البرنامج. بالطبع ، في حالة وجود معلمات مؤشرات ، سيتم تعديلها للسماح لهم بالإشارة إلى العنوان الافتراضي الجديد (بمعنى آخر ، سيتم طرح مؤشر 16 كيلو بايت للسماح له بالإشارة إلى الصفحة 2).
لكي تكون قادرًا على نقل أجهزة كمبيوتر مستندة إلى Z80 التي لا تحتوي على MMU/Memory Mapper كما هو موضح أعلاه ، فإن Kernel لديها وضع جديد يمكن اختياره من خلال menuconfig : no-MMU.
في هذا الوضع ، لا يزال من المتوقع تعيين رمز نظام التشغيل في أول 16 كيلو بايت من الذاكرة ، من 0x0000 إلى 0x3FFF ومن المتوقع أن يكون الباقي ذاكرة الوصول العشوائي.
من الناحية المثالية ، يجب تعيين 48 كيلو بايت من ذاكرة الوصول العشوائي ابتداءً من 0x4000 وسوف ترتفع إلى 0xFFFF ، ولكن في الممارسة العملية ، من الممكن تكوين kernel لتوقع أقل من ذلك. للقيام بذلك ، يجب تكوين اثنين من الإدخالات في menuconfig بشكل مناسب:
KERNEL_STACK_ADDR : هذا يمثل نهاية منطقة رام kernel ، وكما ينص اسمها ، سيكون أسفل مكدس kernel.KERNEL_RAM_START : هذا يمثل عنوان البدء في رام kernel حيث سيتم تخزين المكدس ، وجميع المتغيرات المستخدمة من قبل kernel والسائقين. بالطبع ، يجب أن يكون كبيرًا بما يكفي لتخزين كل هذه البيانات. للحصول على معلومات ، يبلغ حجم قسم Kernel BSS الحالي حوالي 1 كيلو بايت. يعتمد عمق المكدس على تنفيذ برامج التشغيل المستهدفة. يجب أن يكون تخصيص 1 كيلو بايت للمكدس أكثر من كافية طالما أنه لا يتم تخزين المخازن المؤقتة (الكبيرة). بشكل عام ، يجب أن يكون تخصيص ما لا يقل عن 3 كيلو بايت لذاكرة وصول الكبش في Kernel آمنًا ومستقبلًا.خلاصة القول ، إليك مخطط لإظهار استخدام الذاكرة:
فيما يتعلق ببرامج المستخدم ، سيتم دائمًا ضبط عنوان المكدس على KERNEL_RAM_START - 1 بواسطة kernel قبل التنفيذ. كما أنه يتوافق مع عنوان بايت آخر بايت متاح في مساحة العنوان القابلة للاستخدام. هذا يعني أن البرنامج يمكنه تحديد حجم ذاكرة الوصول العشوائي المتاح عن طريق أداء SP - 0x4000 ، والذي يعطي ، في التجميع: التجميع:
ld hl, 0
add hl, sp
ld bc, -0x4000
add hl, bc
; HL contains the size of the available RAM for the program, which includes the program's code and its stack.
يقدم Z80 سجلات متعددة للأغراض العامة ، وليس جميعها تستخدم في النواة ، وهنا نطاق كل واحد منهم:
| يسجل | نِطَاق |
|---|---|
| AF ، BC ، DE ، HL | النظام والتطبيق |
| AF '، BC' ، DE '، HL' | معالجات المقاطعة |
| التاسع ، أنا | التطبيق (غير مستخدم في نظام التشغيل) |
هذا يعني أن نظام التشغيل لن يغير سجلات IX و IY ، بحيث يمكن استخدامها بحرية في التطبيق.
لا يمكن استخدام السجلات البديلة (الأسماء التي تليها ' ) إلا في معالجات المقاطعة 1 . يجب ألا يستخدم التطبيق هذه السجلات. إذا كان لا يزال يتعين عليك استخدامها لسبب ما ، فيرجى التفكير في تعطيل المقاطعات أثناء استخدامها:
my_routine:
di ; disable interrupt
ex af, af' ; exchange af with alternate af' registers
[...] ; use af'
ex af, af' ; exchange them back
ei ; re-enable interrupts
ضع في اعتبارك أن تعطيل المقاطعات لفترة طويلة يمكن أن يكون ضارًا لأن النظام لن يتلقى أي إشارة من الأجهزة (الموقتات ، لوحة المفاتيح ، GPIOS ...)
يوفر Z80 8 متجهات إعادة تعيين مميزة ، حيث من المفترض أن يتم تخزين النظام دائمًا في أول صفحة افتراضية للذاكرة ، وكلها مخصصة لنظام التشغيل:
| ناقل | الاستخدام |
|---|---|
| $ 00 | إعادة تعيين البرمجيات |
| 08 دولار | Syscall |
| 10 دولارات | يقفز إلى العنوان في HL (يمكن استخدامه لاتصال HL) |
| 18 دولار | غير مستخدم |
| 20 دولار | غير مستخدم |
| 28 دولار | غير مستخدم |
| 30 دولار | غير مستخدم |
| 38 دولار | مخصصة لوضع المقاطعة 1 ، قابلة للاستخدام من خلال التنفيذ الهدف |
عند تنفيذ برنامج المستخدم ، يخصص Kernel 3 صفحات من ذاكرة الوصول العشوائي (48 كيلو بايت) ، يقرأ الملف الثنائي لتنفيذه وتحميله بدءًا من العنوان الظاهري 0x4000 افتراضيًا. يمكن تكوين العنوان الظاهري لنقطة الإدخال من خلال menuconfig مع خيار KERNEL_INIT_EXECUTABLE_ADDR ، ولكن ضع في اعتبارك أن البرامج الحالية لن تعمل بعد الآن دون إعادة تنسيقها لأنها غير قابلة للانتقال في وقت التشغيل.
كما هو موضح أدناه ، يأخذ syscall exec معلمتين: اسم ملف ثنائي لتنفيذ ومعلمة.
يجب أن تكون هذه المعلمة عبارة عن سلسلة من إنهاء فريدة سيتم نسخها ونقلها إلى الثنائي لتنفيذها من خلال السجلات DE و BC :
DE يحتوي على عنوان السلسلة. سيتم نسخ هذه السلسلة إلى مساحة ذاكرة البرنامج الجديد ، وعادة ما تكون أعلى المكدس.BC يحتوي على طول تلك السلسلة (لذلك ، باستثناء بايت لاغية). إذا كان BC 0 ، فيجب التخلص من DE بواسطة برنامج المستخدم. يعتمد النظام على syscalls لأداء الطلبات بين برنامج المستخدم والكيرنيل. وبالتالي ، يجب أن يكون هذا هو السبيل لأداء العمليات على الأجهزة. يتم سرد العمليات الممكنة في الجدول أدناه.
| عدد | اسم | بارام. 1 | بارام. 2 | بارام. 3 |
|---|---|---|---|---|
| 0 | يقرأ | U8 ديف | U16 BUF | حجم U16 |
| 1 | يكتب | U8 ديف | U16 BUF | حجم U16 |
| 2 | يفتح | اسم U16 | أعلام U8 | |
| 3 | يغلق | U8 ديف | ||
| 4 | dstat | U8 ديف | U16 DST | |
| 5 | Stat | اسم U16 | U16 DST | |
| 6 | يطلب | U8 ديف | U32 الإزاحة | U8 من أين |
| 7 | IOCTL | U8 ديف | U8 CMD | u16 arg |
| 8 | mkdir | مسار U16 | ||
| 9 | chdir | مسار U16 | ||
| 10 | كوردير | مسار U16 | ||
| 11 | Opendir | مسار U16 | ||
| 12 | Readdir | U8 ديف | U16 DST | |
| 13 | RM | مسار U16 | ||
| 14 | جبل | U8 ديف | u8 رسالة | U8 FS |
| 15 | مخرج | رمز U8 | ||
| 16 | exec | اسم U16 | U16 Argv | |
| 17 | DUP | U8 ديف | U8 NDEV | |
| 18 | msleep | مدة U16 | ||
| 19 | settime | u8 id | u16 الوقت | |
| 20 | GetTime | u8 id | u16 الوقت | |
| 21 | setDate | تاريخ U16 | ||
| 22 | getDate | تاريخ U16 | ||
| 23 | رسم خريطة | U16 DST | U24 SRC | |
| 24 | تبديل | U8 ديف | U8 NDEV |
يرجى التحقق من القسم أدناه لمزيد من المعلومات حول كل من هذه المكالمات ومعلماتها.
ملاحظة : قد تكون بعض syscalls غير محدودة. على سبيل المثال ، على أجهزة الكمبيوتر التي لا يتم دعم الدلائل ، قد يتم حذف syscalls المتعلقة بالأدلة.
من أجل تنفيذ syscall ، يجب تخزين رقم العملية في السجل L ، يجب تخزين المعلمات بعد هذه القواعد:
| اسم المعلمة في API | Z80 سجل |
|---|---|
| U8 ديف | H |
| U8 NDEV | E |
| أعلام U8 | H |
| U8 CMD | C |
| u8 رسالة | D |
| رمز U8 | H |
| U8 FS | E |
| u8 id | H |
| U8 من أين | A |
| U16 BUF | DE |
| حجم U16 | BC |
| اسم U16 | BC |
| U16 DST | DE |
| u16 arg | DE |
| مسار U16 | DE |
| U16 Argv | DE |
| مدة U16 | DE |
| u16 الوقت | DE |
| تاريخ U16 | DE |
| U24 SRC | HBC |
| U32 الإزاحة | BCDE |
وأخيرًا ، يجب أن يقوم الرمز بتعليم RST $08 (يرجى التحقق من إعادة تعيين المتجهات).
يتم وضع القيمة التي تم إرجاعها في A. معنى هذه القيمة محددة لكل مكالمة ، يرجى التحقق من وثائق الروتين المعني لمزيد من المعلومات.
لزيادة توافق برامج المستخدم إلى الحد الأقصى مع kernel من حماسة 8 بت ، بغض النظر عما إذا كان قد تم تجميع النواة في وضع MMU أو NO-MMU ، فإن قيود معلمات SYSCALLS هي نفسها:
لا يجوز لأي مخزن مؤقت تمريره إلى syscall عبور صفحات افتراضية 16 كيلو بايت
بمعنى آخر ، إذا كان هناك buf من الحجم n في الصفحة الافتراضية i فيجب أن تكون بايت آخر بايت ، الذي أشار إليه buf + n - 1 ، موجودًا أيضًا في نفس الصفحة الأولى i
على سبيل المثال ، إذا تم read syscall مع:
DE = 0x4000 و BC = 0x1000 ، تكون المعلمات صحيحة ، لأن المخزن المؤقت الذي يوضحه DE في الصفحة 1 (من 0x4000 إلى 0x7FFF )DE = 0x4000 و BC = 0x4000 ، تكون المعلمات صحيحة ، لأن المخزن المؤقت الذي يشير إلى DE يناسب في الصفحة 1 (من 0x4000 إلى 0x7FFF )DE = 0x7FFF و BC = 0x2 ، المعلمات غير صحيحة ، لأن المخزن المؤقت الذي أشار إليه DE بين الصفحة 1 و Page2.exec على الرغم من أن نظام التشغيل Zeal 8-Bit هو نظام تشغيل أحادي المهام ، إلا أنه يمكنه تنفيذ العديد من البرامج في الذاكرة والحفاظ عليها. عندما ينفذ البرنامج A A البرنامج B بفضل SYSCALL exec ، يجب أن يوفر معلمة mode يمكن أن تكون إما EXEC_OVERRIDE_PROGRAM أو EXEC_PRESERVE_PROGRAM :
EXEC_OVERRIDE_PROGRAM : يخبر هذا الخيار kernel أنه لا يلزم تنفيذ البرنامج A ، لذلك سيتم تحميل البرنامج B في نفس مساحة العنوان مثل البرنامج A. وبعبارة أخرى ، سيتم تحميل البرنامج B داخل صفحات RAM نفسها مثل البرنامج A ، وسوف يكتبه.EXEC_PRESERVE_PROGRAM : يخبر هذا الخيار kernel بأن البرنامج A يحتاج إلى الاحتفاظ به في ذاكرة الوصول العشوائي حتى ينتهي البرنامج B من تنفيذه ويطلق على Syscall exit . للقيام بذلك ، ستقوم Kernel بتخصيص 3 صفحات ذاكرة جديدة ( 16KB * 3 = 48KB ) حيث تقوم بتخزين البرنامج الذي تم تحميله حديثًا ب. بمجرد خروج البرنامج B ، يحرر Kernel الصفحات المخصصة مسبقًا للبرنامج B ، وصفحات ذاكرة البرنامج A Remaps ، وتعيد اليد إلى البرنامج A. يتم تعريف عمق شجرة التنفيذ في menuconfig ، وذلك بفضل الخيار CONFIG_KERNEL_MAX_NESTED_PROGRAMS . إنه يمثل الحد الأقصى لعدد البرامج التي يمكن تخزينها في ذاكرة الوصول العشوائي في وقت واحد. على سبيل المثال ، إذا كان العمق هو 3 ، فإن البرنامج A يمكن الاتصال بالبرنامج B ، يمكن للبرنامج B استدعاء البرنامج C ، ولكن لا يمكن للبرنامج C استدعاء أي برنامج آخر. ومع ذلك ، إذا استدعى البرنامج exec مع EXEC_OVERRIDE_PROGRAM ، فلن يتم زيادة العمق لأن البرنامج الجديد لتحميله سيتجاوز البرنامج الحالي. على هذا النحو ، إذا استعدنا المثال السابق ، يمكن للبرنامج C استدعاء برنامج إذا وفقط إذا كان يستدعي SYSCALL exec في وضع EXEC_OVERRIDE_PROGRAM .
كن حذرًا ، عند تنفيذ برنامج فرعي ، سيتم مشاركة جدول الجهاز المفتوح بالكامل ، (بما في ذلك الملفات والدلائل والسائقين) ، وسجلات الدليل الحالي ، وسجلات وحدة المعالجة المركزية.
هذا يعني أنه إذا فتح البرنامج A ملفًا مع واصف 3 ، فإن البرنامج B سيرث هذا الفهرس ، وبالتالي ، يكون قادرًا أيضًا على قراءة هذا الواصف أو الكتابة أو حتى إغلاق هذا الواصف. بالمثل ، إذا فتحت B ملفًا أو دليلًا أو سائقًا ويخرج دون إغلاقه ، فسيتمكن البرنامج أيضًا من الوصول إليه. على هذا النحو ، فإن المبدأ التوجيهي العام الذي يجب اتباعه هو أنه قبل الخروج ، يجب على البرنامج دائمًا إغلاق الواصفات التي فتحها. في اللحظة الوحيدة التي يتم فيها إعادة تعيين جدول الأجهزة المفتوحة والدليل الحالي هو عندما يخرج البرنامج الأولي (البرنامج A في المثال السابق). في هذه الحالة ، ستغلق kernel جميع الواصفات في جدول الأجهزة المفتوحة ، وإعادة فتح الإدخال والإخراج القياسي ، وإعادة تحميل البرنامج الأولي.
هذا يعني أيضًا أنه عند استدعاء syscall exec في برنامج التجميع ، على النجاح ، يجب اعتبار جميع السجلات ، باستثناء HL ، تغييرًا لأنها ستستخدمها البرنامج الفرعي. لذلك ، إذا كنت ترغب في الحفاظ على AF أو BC أو DE أو IX أو IY ، فيجب دفعها على المكدس قبل استدعاء exec .
تم توثيق جميع syscalls في ملفات الرأس المقدمة لكل من Assembly و C ، ستجد ملف الرأس هذا في kernel_headers/ directory ، تحقق من ملف readMe لمزيد من المعلومات.
يتكون سائق من هيكل يحتوي على:
SER0 و SER1 و I2C0 ، إلخ.init ، يسمى عندما أحذية kernel.read ، حيث تكون المعلمات وعنوان الإرجاع هي نفسها كما في جدول SYSCALL.write الروتينية ، كما هو مذكور أعلاه.open ، كما هو مذكور أعلاه.close ، كما هو مذكور أعلاه.seek الروتيني ، كما هو مذكور أعلاه.ioctl ، كما هو مذكور أعلاه.deinit ، يسمى عند تفريغ برنامج التشغيل.فيما يلي مثال تسجيل السائق البسيط:
my_driver0_init:
; Register itself to the VFS
; Do something
xor a ; Success
ret
my_driver0_read:
; Do something
ret
my_driver0_write :
; Do something
ret
my_driver0_open :
; Do something
ret
my_driver0_close :
; Do something
ret
my_driver0_seek :
; Do something
ret
my_driver0_ioctl :
; Do something
ret
my_driver0_deinit :
; Do something
ret
SECTION DRV_VECTORS
DEFB "DRV0"
DEFW my_driver0_init
DEFW my_driver0_read
DEFW my_driver0_write
DEFW my_driver0_open
DEFW my_driver0_close
DEFW my_driver0_seek
DEFW my_driver0_ioctl
DEFW my_driver0_deinit يتكون تسجيل برنامج تشغيل في وضع هذه المعلومات (الهيكل) داخل قسم يسمى DRV_VECTORS . الأمر مهم للغاية حيث يجب حل أي اعتماد على السائق في وقت الترجمة. على سبيل المثال ، إذا كان برنامج التشغيل A يعتمد على برنامج التشغيل B ، فيجب وضع بنية B قبل A في القسم DRV_VECTORS .
عند التمهيد ، سيقوم مكون driver بتصفح قسم DRV_VECTORS بالكامل وتهيئة برامج التشغيل واحدة تلو الأخرى عن طريق الاتصال بروتينها init . إذا كان هذا الروتين يعيد ERR_SUCCESS ، فسيتم تسجيل برنامج التشغيل ويمكن برامج المستخدم فتحه ، وقراءته ، والكتابة ، و IOCTL ، وما إلى ذلك ...
يمكن إخفاء برنامج التشغيل على البرامج ، فهذا مفيد لبرامج تشغيل القرص التي يجب الوصول إليها فقط بواسطة طبقة نظام ملفات kernel. للقيام بذلك ، يجب أن يعيد روتين init ERR_DRIVER_HIDDEN .
نظرًا لأن الاتصال بين التطبيقات والأجهزة يتم ذلك من خلال Syscalls الموصوفة أعلاه ، نحتاج إلى طبقة بين تطبيق المستخدم والكيرنيل التي ستحدد ما إذا كنا بحاجة إلى استدعاء برنامج تشغيل أو نظام ملفات. قبل إظهار التسلسل الهرمي لمثل هذه الهندسة المعمارية ، دعنا نتحدث عن الأقراص والسائقين.
يمكن رؤية الطبقات المختلفة مثل هذا:
مخطط انسيابي TD ؛
التطبيق (برنامج المستخدم)
VFS (نظام الملفات الظاهري)
DSK (وحدة القرص)
DRV (تطبيق برنامج التشغيل: الفيديو ، لوحة المفاتيح ، المسلسل ، إلخ ...)
FS (نظام الملفات)
Sysdis (Syscall Dispatcher)
HW (الأجهزة)
الوقت (وحدة الوقت والتاريخ)
MEM (وحدة الذاكرة)
اللودر (وحدة المحمل)
التطبيق -Syscall/RST 8 -> sysdis ؛
sysdis-getDate/time-> الوقت ؛
Sysdis-mount-> dsk ؛
Sysdis -> VFS ؛
Sysdis-map-> mem ؛
sysdis -exec/exit -> loader ؛
VFS -> DSK & DRV ؛
DSK <-> fs ؛
fs -> drv ؛
drv -> hw ؛
يدعم OS 8 بت حماسة ما يصل إلى 26 قرصًا في وقت واحد. يتم الإشارة إلى الأقراص برسالة ، من A إلى Z. تقع على عاتق سائق القرص مسؤولية تحديد مكان تركيب القرص في النظام.
محرك الأقراص الأول ، A ، هو الذي سيبحث عن النظام عن التفضيلات أو التكوينات.
في التطبيق ، قد يكون path :
my_dir2/file1.txt/my_dir1/my_dir2/file1.txtB:/your_dir1/your_dir2/file2.txt على الرغم من أن نظام التشغيل قادر تمامًا على rom ولا يحتاج إلى أي نظام أو قرص للتمهيد ، بمجرد أن يحاول تحميل البرنامج الأولي ، يسمى init.bin افتراضيًا ، فإنه سيتحقق من القرص الافتراضي وطلب هذا الملف. وبالتالي ، حتى التخزين الأساسي يحتاج إلى نظام ملفات ، أو شيء مشابه.
يسمى "نظام الملفات" الأول ، الذي تم تنفيذه بالفعل ، "RawTable". كما ينص اسمها ، فإنه يمثل سلسلة من الملفات ، وليس الدلائل ، في جهاز تخزين ، في أي ترتيب معين. حد حجم اسم الملف هو نفسه kernel: 16 حرفًا ، بما في ذلك الاختياري . والتمديد. إذا أردنا مقارنته برمز C ، فستكون مجموعة من الهياكل التي تحدد كل ملف ، تليها محتوى الملف بنفس الترتيب. يتوفر رمز مصدر Romdisk Packer في packer/ بجذر هذا الريبو. تحقق من ReadMe لمزيد من المعلومات حول هذا الموضوع.
نظام الملفات الثاني ، الذي يتم تنفيذه أيضًا ، يسمى Zealfs. الغرض الرئيسي منه هو أن تكون مضمنة في مخازن صغيرة جدا ، من 8 كيلو بايت إلى 64 كيلو بايت. إنه قابل للقراءة وقابل للكتابة ، وهو يدعم الملفات والأدلة. مزيد من المعلومات حول هذا الموضوع في المستودع المخصص.
نظام الملفات الثالث الذي سيكون من الجيد أن يكون على نظام التشغيل Zeal 8 بت هو FAT16. مشهور جدًا ، مدعوم بالفعل من قبل جميع أنظمة تشغيل سطح المكتب تقريبًا ، قابلة للاستخدام على بطاقات CompactFlash وحتى SD ، فهذا أمر لا بد منه تقريبًا. لم يتم تنفيذها بعد ، ولكن من المخطط لها. FAT16 ليس مثاليًا على الرغم من أنه لا يتم تكييفه للتخزين الصغير ، وهذا هو السبب في حاجة إلى Zealfs.
يعتمد نظام OS 8 بت على مكونين رئيسيين: نواة ورمز مستهدف. نواة وحدها لا تفعل شيئًا. يحتاج الهدف إلى تنفيذ برامج التشغيل ، وبعض وحدات الماكرو MMU المستخدمة داخل kernel ونص رابط. البرنامج النصي Linker بسيط إلى حد ما ، وهو يسرد الأقسام بالترتيب الذي يجب ربطه في الثنائي النهائي بواسطة z80asm Assembler.
يستخدم kernel حاليًا الأقسام التالية ، والتي يجب تضمينها في أي نص نصي:
RST_VECTORS : يحتوي على متجهات إعادة تعيينSYSCALL_TABLE : يحتوي على جدول يتم فيه تخزين العنوان الروتيني Syscall i في الفهرس i ، في 256SYSCALL_ROUTINES : يحتوي على مرسل Syscall ، يسمى من متجه إعادة تعيينKERNEL_TEXT : يحتوي على رمز النواةKERNEL_STRLIB : يحتوي على الروتين المتعلق بالسلسلة المستخدمة في kernelKERNEL_DRV_VECTORS : يمثل مجموعة من برامج التشغيل للتهيئة ، والتحقق من قسم برنامج التشغيل لمزيد من التفاصيل.KERNEL_BSS : يحتوي على البيانات المستخدمة بواسطة رمز kernel ، يجب أن تكون في ذاكرة الوصول العشوائيDRIVER_BSS : غير مستخدم مباشرة بواسطة kernel ، يجب تعريفه واستخدامه في السائقين. ستقوم kernel بتعيينها على 0s على التمهيد ، يجب أن تكون أكبر من 2 بايت كما قيل سابقًا ، لا يزال دعم الكمبيوتر بحماس 8 بت جزئيًا ولكنه يكفي لتشغيل برنامج سطر الأوامر. يتم إنشاء romdisk قبل بناء kernel ، ويتم ذلك في target/zeal8bit/unit.mk script.sh .
سيقوم هذا البرنامج النصي بتجميع برنامج init.bin وتضمينه داخل romdisk الذي سيتم تسلسله إلى ثنائي OS المترجم. يمكن وميض الثنائي النهائي مباشرة إلى ولا فلاش.
ما لا يزال بحاجة إلى تنفيذ ، في أي ترتيب معين:
تم إنشاء منفذ سريع لجهاز TRS-80 Model-I لإظهار كيفية تنفيذ وتكوين نظام التشغيل 8 بت من الحماس للأهداف التي لا تحتوي على MMU.
هذا المنفذ بسيط إلى حد ما لأنه يعرض ببساطة لافتة التمهيد على الشاشة ، لا شيء أكثر من ذلك. للقيام بذلك ، يتم تطبيق برنامج تشغيل الفيديو فقط لوضع النص.
للحصول على منفذ أكثر إثارة للاهتمام ، يجب تنفيذ الميزات التالية:
init.bin /romdisk ، يمكن أن يكون للقراءة فقط ، لذلك يمكن تخزينه على romميناء إلى EZ80 Agon Light ، كتبه وصيانته بواسطة Shawn Sijnstra. لا تتردد في استخدام هذا الشوكة لخلل/طلبات محددة AGON. يستخدم هذا kernel غير MMU ، وينفذ معظم الميزات التي يدعمها تنفيذ الكمبيوتر بحماس 8 بت.
يتطلب هذا المنفذ محملًا لتخزينه وتنفيذه من الموقع الصحيح. الثنائي هو Osbootz ، متاح هنا.
لاحظ أن المنفذ يستخدم الوضع الطرفي لتبسيط لوحة المفاتيح I/O. هذا يعني أيضًا أن وظيفة التاريخ غير متوفرة.
ميزات أخرى بارزة:
إلى إصدار OS MMU 8 بت من Zeal Zeal إلى جهاز آخر ، تأكد من أن لديك خريطة ذاكرة أولاً تقسم مساحة عنوان Z80 64 كيلو بايت إلى 4 صفحات من 16 كيلو بايت لإصدار MMU.
إلى منفذ NO-MMU Zeal 8 بت ، تأكد من توفر RAM من العنوان الظاهري 0x4000 وما فوق. الحالات الأكثر مثالية هي وجود ROM هي أول 16 كيلو بايت لنظام التشغيل وذاكرة الوصول العشوائي في 48 كيلو بايت المتبقية لبرامج المستخدم وذاكرة KERNEL.
إذا كان هدفك متوافقًا ، فاتبع التعليمات:
Kconfig بجذر هذا الريبو ، وأضف إدخالًا إلى خيارات config TARGET و config COMPILATION_TARGET . خذ تلك الموجودة بالفعل كأمثلة.target/ هدفك ، يجب أن يكون الاسم هو نفسه المحدد في خيار config TARGET الجديد.unit.mk جديدة. هذا هو الملف الذي يجب أن يحتوي على جميع الملفات المصدر للتجميع أو تلك التي يجب تضمينها.unit.mk الخاص بك ، للقيام بذلك ، يمكنك make المتغيرات التالية:SRCS : قائمة الملفات المراد تجميعها. عادة ، هذه هي السائقين (إلزامية)INCLUDES : الدلائل التي تحتوي على ملفات الرأس التي يمكن تضمينهاPRECMD : أمر باش يتم تنفيذه قبل أن تبدأ النواة في البناءPOSTCMD : أمر باش يتم تنفيذه بعد أن ينتهي kernel من مبنىmmu_h.asm الذي سيتم تضمينه بواسطة kernel لتكوين واستخدام MMU. تحقق من target/zeal8bit/include/mmu_h.asm لمعرفة كيف ينبغي أن تبدو.zos_disks_mount الروتيني ، الذي يحتوي على ملف init.bin ، تم تحميله وتنفيذه بواسطة kernel on boot.zos_vfs_set_stdout الروتينية.للحصول على changelog الكامل ، يرجى التحقق من صفحة الإصدار.
المساهمات مرحب بها! لا تتردد في إصلاح أي خطأ قد تراه أو تواجهه ، أو تنفيذ أي ميزة تجدها مهمة.
للمساهمة:
(*) رسالة الالتزام الجيدة هي كما يلي:
Module: add/fix/remove a from b
Explanation on what/how/why
على سبيل المثال:
Disks: implement a get_default_disk routine
It is now possible to retrieve the default disk of the system.
موزعة تحت رخصة Apache 2.0. انظر ملف LICENSE لمزيد من المعلومات.
أنت حر في استخدامه للاستخدام الشخصي والتجاري ، يجب ألا تتم إزالة اللوحات الموجودة في كل ملف.
للحصول على أي اقتراح أو طلب ، يمكنك الاتصال بي على اتصال [at] zeal8bit [dot] com
لطلبات الميزات ، يمكنك أيضًا فتح مشكلة أو طلب سحب.
لا يجوز اعتبارهم غير متقلدين. وبعبارة أخرى ، يجب ألا يفترض معالج المقاطعة أن البيانات التي كتبتها داخل أي سجل بديل سيتم الاحتفاظ به حتى المرة التالية التي يطلق عليها. ↩