
هذه المقالة هي الاستنتاج المنطقي
لسلسلة من مقالات "تسلق Elbrus" حول تقديم
Embox إلى
بنية معالج Elbrus (E2K) . لماذا الاستنتاج المنطقي ، لأنه نتيجة لذلك ، كان من الممكن تشغيل تطبيق telnet الذي يعرض الصورة على الشاشة ، أي لتحقيق العمل الكامل لـ Embox على هذه البنية. بالكاد يمكن إجراء مزيد من البحوث على أنها مقدمة ، على الرغم من أن الكثير ما زال غير واضح بالطبع. والهندسة المعمارية لديها العديد من الميزات المثيرة للاهتمام ، والتي هي أيضا غير مفهومة حاليا. في هذه المقالة ، سوف نركز على تنظيم الذاكرة الظاهرية ، وسنتطرق إلى PCI ، ونتحدث قليلاً عن بطاقة الشبكة ونلمس بطاقة الفيديو على جهاز معين لدينا.
بالنسبة لأولئك الذين هم كسولون جدًا في قراءة المقال ، سأقدم على الفور مقطع فيديو قصير مع النتائج.
والآن بالنسبة لأولئك المهتمين ، سنكشف التفاصيل الفنية التي تمكنا من فهمها في هذه العملية.
الذاكرة الافتراضية
خطأ المكدس لدينا
لنبدأ بالذاكرة الافتراضية. في الواقع ، هذا ما استقرنا عليه في
المقالة السابقة
في السلسلة. تجدر الإشارة إلى سبب احتياجنا للذاكرة الظاهرية على الفور ، لأن Embox يمكنها العمل بدونها. الأمر بسيط: الشيء هو التخزين المؤقت. عملت Vidyaha ، ولكن كان لا بد لي من تسجيل الشيء نفسه مرتين في ذاكرة الفيديو لاسترجاع صورة موثوقة. بالطبع ، كان من الممكن التعامل مع ذاكرة التخزين المؤقت ، لكن أمثلةنا تشير إلى استخدام ذاكرة الفيديو مباشرة من تطبيق المستخدم ، دون أي مواد نووية مثل إدارة ذاكرة التخزين المؤقت ، لذلك كان من الصواب معرفة كيفية تعيين الذاكرة على أنها غير قابلة للتخزين المؤقت. يمكن القيام بنفس الشيء على نظام Linux عن طريق تعيين fb (
مثال ).
تجدر الإشارة إلى أنه على الرغم من أننا لم نكتب عن Elbrus لفترة طويلة وقد يبدو أن MMU في هذا الهيكل هو نوع من التعقيد الفائق ، لكن الأمر مختلف. في الواقع ، أضفنا الدعم في فصل الصيف ، ببساطة لم نصل إلى أيدينا للكتابة عنه. لقد قضى وقت طويل (عدة أشهر) بسبب خطأنا الغبي. تم ارتكاب هذا الخطأ حتى في عنوان المقال ("أو لن تنسى أبدًا ما حصلت عليه أثناء الذكاء"). نحن نتحدث عن الأكوام التي تعاملنا معها بشكل جيد ووصفناها في المقال Climbing
Elbrus - Reconnaissance. الجزء الفني 1. السجلات والمداخن والتفاصيل الفنية الأخرى .
" لقد عانينا لفترة طويلة للغاية ، ونفقد بغباء حقيقة أننا نأخذ المكدس الأولي (الذي تمت تهيئة النظام عليه) من مكان ما في الخارج ، ورسمنا كل شيء. ما نحتاجه لكي تعمل Embox ، لم نقم بتخطيط هذه البيانات.
تحت القطة ، سأقدم وظيفة جديدة e2k_entry ، كما هو موضح في المقالة الثانية في
المقال في السلسلة .
إذا كنت ترغب في ذلك ، يمكنك مقارنة.
__attribute__ ((__section__(".e2k_entry"))) void e2k_entry(struct pt_regs *regs) { if (entries_count >= CPU_COUNT) { e2k_trap_handler(regs); RESTORE_COMMON_REGS(regs); E2K_DONE; } e2k_wait_all(); entries_count = __e2k_atomic32_add(1, &entries_count); if (entries_count > 1) { while(!sync_count); context_init(&cpu_ctx[0], CONTEXT_PRIVELEGED | CONTEXT_IRQDISABLE, cpu_idle, idle_stack, sizeof(idle_stack)); context_switch(&cpu_ctx_prev[0], &cpu_ctx[0]); } context_init(&cpu_ctx[1], CONTEXT_PRIVELEGED | CONTEXT_IRQDISABLE, e2k_kernel_start, &_stack_top, KERNEL_STACK_SZ); sync_count = __e2k_atomic32_add(1, &sync_count); context_switch(&cpu_ctx_prev[1], &cpu_ctx[1]); }
سأشرح فقط الآن أننا نستخدم كل من context_init () و context_switch () فقط لتبديل المكدس إلى الذاكرة في مساحة Embox. ونحن نفعل هذا لجميع النوى ، بما في ذلك تلك التي لا تستخدم.
منظمة MMU
الآن سأتحدث قليلاً عن تنظيم MMU في هندسة E2k.
بشكل عام ، تعتبر بنية MMU عادية تمامًا وتحتوي على جداول من أربعة مستويات (أو ثلاثة عند استخدام صفحة بحجم 4 ميجابايت).
هناك العديد من سجلات الخدمة في بنية E2k ؛ يتم الوصول إليها باستخدام أوامر الوصول إلى المساحات البديلة ، وكذلك إلى مساحة I / O الموصوفة لفترة وجيزة في المقال
"Embox يبدأ في تسلق Elbrus" .
سنحتاج إلى مثل هذه السجلات:
#define MMU_REG_CR 0x00 #define MMU_REG_CONT 0x10 #define MMU_REG_CR3_RG 0x20 #define MMU_REG_ELB_PTB 0x30 #define MMU_REG_ROOT_PTB 0x40 /
في الواقع ، هذا سجل تحكم ، سجل رقم سياق ، سجل جذر للجداول ، و MMU_REG_ELB_PTB غامض قليلاً. لنبدأ به ، يجب تعيين هذا السجل على بعض القيمة ، وسيتم استخدام 512 جيجابايت التالي من قبل المعالج لتلبية احتياجات الجهاز ، ولن تكون هذه العناوين متاحة للمبرمج. سأقدم توضيحات من خطاب أخصائي ICST ، بالكاد أستطيع أن أشرح بشكل أفضل:
على نظام Linux ، قمنا بتعيين MMU_ELB_PTB على 0xff1 << 39 ، ثم
الجزء العلوي من الذاكرة الظاهرية (0xff8000000000 - 0xffffffffffff)
محفوظة لاحتياجات المعدات ، وهي TLB. كل صفحة
يحصل جدول الصفحات (TS) على عنوانه الفريد في هذه المنطقة ،
علاوة على ذلك ، يمكن الحصول على هذه العناوين بسهولة من العنوان الذي يوجد به البرنامج
ناشد الذاكرة. ومنذ ذلك الحين يخزن TLB تعيينات العنوان الظاهري
المادية ، وهذا يسمح لك بالتخزين المؤقت في نفس المخزن المؤقت TLB
البث ليس فقط لعناوين المستخدمين ، ولكن أيضًا للسيارة نفسها.
في تلك المعالجات / البنى حيث يتم إنشاء TLBs منفصلة لمختلف
مستويات جدول الصفحات ، مثل هذه الخدعة تصبح غير ضرورية.
وبالتالي ، عندما تفوت TLB ، يصبح من الممكن عدم بدء البحث
من مستوى الصفر (pgd *) ، وتحقق على الفور من المستوى الأخير من السيارة (pte *).
لا يوجد أي متطلبات الأجهزة لتعيين هذه المنطقة نفسها ، Wirth. عناوين من
هناك حاجة إليه فقط كفهارس للبحث TLB. ومع ذلك ، في جوهرها في
هو مكتوب في الماضي pgd في مستوى الصفر من صفحة الجدول نات. عنوان هذا
معظم مستوى الصفر. نتيجة لذلك ، فقط
آخر 4 كيلوبايت من المنطقة ff80'0000'0000 - ffff'ffff'ffff - أي فقط صحيح
مستوى السيارة صفر. هذا يسمح بالوصول إلى pgd * بشكل عادي
قراءة / كتابة تعليمات العمل على عناوين افتراضية.
نتيجة لذلك ، تقرر ببساطة وضع قيمة كبيرة في هذا السجل ، والتي لن تزعجنا. بعد كل شيء ، يتيح لنا الحل المقترح تحسين البحث عن الصفحات ، لكننا لم نشارك بعد في التحسين. سلمت نفسها كما في لينكس.
الآن سجل السيطرة. تحتاج إلى تمكين MMU من خلال ذلك. البتات المعروفة تبدو كالتالي:
#define _MMU_CR_TLB_EN 0x0000000000000001 #define _MMU_CR_CD_MASK 0x0000000000000006 #define _MMU_CR_SET1 0x0000000000000008 #define _MMU_CR_SET2 0x0000000000000010 #define _MMU_CR_SET3 0x0000000000000020 #define _MMU_CR_CR0_PG 0x0000000000000040 #define _MMU_CR_CR4_PSE 0x0000000000000080 #define _MMU_CR_CR0_CD 0x0000000000000100 #define _MMU_CR_TLU2_EN 0x0000000000000200 #define _MMU_CR_LD_MPT 0x0000000000000400 #define _MMU_CR_IPD_MASK 0x0000000000000800 #define _MMU_CR_UPT_EN 0x0000000000001000
نحن مهتمون بالبت الأول ، والذي يتضمن ترجمة العناوين.
لقد قمنا أيضًا بتعيين _MMU_CR_SET3 ، لكننا لم نتوصل إلى معرفة الحالات التي ينبغي القيام فيها بذلك.
سجل المسابقة حسنًا ، إذا كان الأمر بسيطًا ، فهذا هو معرف العملية الخاص بالمساحة أو مساحة العنوان. أكثر تقنيًا ، هذا امتداد عنوان 11 بت. في حالتنا ، جعلنا كل الصفحات نووية ، من خلال تعيين جزء من العالمية في جميع صفحاتنا ، نستخدم نفس مساحة العنوان وبالتالي يمكننا استخدام الصفر في هذا السجل.
في سجل جدول الجذر ، يوجد مؤشر إلى العنوان الفعلي لبداية جدول الترجمة. يمكنك فقط الاحتيال عن طريق تعيين الجدول على العنوان المحدد في سجل MMU_REG_ELB_PTB ، ولكن كما قلت ، لم نركز على التحسين.
ماذا يمكنني أن أقول ، هيكل الجداول أمر عادي للغاية ، والأعلام هي كما يلي:
#define E2K_MMU_PAGE_P 0x0000000000000001ULL #define E2K_MMU_PAGE_W 0x0000000000000002ULL #define E2K_MMU_PAGE_UU2 0x0000000000000004ULL #define E2K_MMU_PAGE_PWT 0x0000000000000008ULL #define E2K_MMU_PAGE_CD1 0x0000000000000010ULL #define E2K_MMU_PAGE_A 0x0000000000000020ULL #define E2K_MMU_PAGE_D 0x0000000000000040ULL #define E2K_MMU_PAGE_HUGE 0x0000000000000080ULL #define E2K_MMU_PAGE_G 0x0000000000000100ULL #define E2K_MMU_PAGE_CD2 0x0000000000000200ULL #define E2K_MMU_PAGE_NWA 0x0000000000000400ULL #define E2K_MMU_PAGE_AVAIL 0x0000000000000800ULL #define E2K_MMU_PAGE_PFN 0x000000fffffff000ULL #define E2K_MMU_PAGE_VALID 0x0000010000000000ULL #define E2K_MMU_PAGE_PV 0x0000020000000000ULL #define E2K_MMU_PAGE_INT_PR 0x0000040000000000ULL #define E2K_MMU_PAGE_NON_EX 0x0000080000000000ULL #define E2K_MMU_PAGE_RES 0x0000f00000000000ULL #define E2K_MMU_PAGE_C_UNIT 0xffff000000000000ULL
بالنسبة للجدول ذي المستوى 4 ، فإن تحولات العنوان هي كما يلي:
#define __MMU_PGD_SHIFT (PAGE_SHIFT + 3 * (PAGE_SHIFT-3)) #define __MMU_PUD_SHIFT (PAGE_SHIFT + 2 * (PAGE_SHIFT-3)) #define __MMU_PMD_SHIFT (PAGE_SHIFT + 1 * (PAGE_SHIFT-3))
قليلا عن PCI
التواصل من خلال مساحات العناوين البديلة
قبل الانتقال إلى vidyaha وبطاقة الشبكة ، دعنا نعود لفترة قصيرة إلى PCI. تحدثنا بالفعل قليلاً عن هذا في الجزء الأول من
"Embox يبدأ تسلق جبل Elbrus .
" لقد أظهر وحدات الماكرو للتواصل مع مسافات العنوان البديلة:
#define _E2K_READ_MAS(addr, mas, type, size_letter, chan_letter) \ ({ \ register type res; \ asm volatile ("ld" #size_letter "," #chan_letter " \t0x0, [%1] %2, %0" \ : "=r" (res) \ : "r" ((__e2k_ptr_t) (addr)), \ "i" (mas)); \ res; \ }) #define _E2K_WRITE_MAS(addr, val, mas, type, size_letter, chan_letter) \ ({ \ asm volatile ("st" #size_letter "," #chan_letter " \t0x0, [%0] %2, %1" \ : \ : "r" ((__e2k_ptr_t) (addr)), \ "r" ((type) (val)), \ "i" (mas) \ : "memory"); \ })
وكان هناك إشارة إلى مبدأ مسافات العنوان. يتم تعريف مساحات العناوين المختلفة باستخدام MAS (محدد عنوان الذاكرة). على سبيل المثال ، للوصول إلى IO ، الذي يتم من خلاله الوصول إلى PCI ، تحتاج إلى استخدام 6 و MMU 7.
ولكن من خلال دراسة أكثر شمولية للماكرو ، يمكنك ملاحظة نوع من التغيير. وإذا نظرت إلى وصف أوامر e2k ، نجد
LDD ddd كلمة القراءة المزدوجة
ldd [عنوان] mas ، dst
هذا ، للوهلة الأولى ، لا توجد قنوات. ولكن إذا اتبعت الارتباطات ، فقد تبين أن رمز العملية المحددة ldd هو 67. لكن 67 هو رمز ldd فقط للقناتين AL0 / AL3 و AL2 / AL5 ، وبالنسبة للقنوات AL1 / AL4 ، يتوافق هذا الرمز مع العملية POPCNTd.
لذلك ، لم يكن من الممكن أن نفهم تماما ما هي القنوات في مصطلحات Elbrus. أود أن أقترح أن هذا مرتبط بالفعل بمبدأ vliw ، عندما يمكنك تحديد alu المستخدم ، لأن إحدى الميزات في هذا النوع من الهندسة هي وجود العديد من أجهزة الحوسبة المستقلة. يمكنني بالطبع أن أكون مخطئًا ، ولكن الحقيقة هي أنه للوصول إلى PCI أو MMU ، تحتاج إلى استخدام القناة الثانية أو الخامسة. وبالتالي ، فإن الأمر سيبدو مثل هذا:
ldd ، 2 0x0 ، [addr_in_mas] mas_id ،٪ reg
lspci
الآن سأقدم نتيجة إخراج الأمر lspci على الجهاز الذي لدينا:
الجذر @ embox: (خالية) # lspci
00: 0.0 (PCI dev E3E3: ABCD) [6 4]
جسر PCI إلى PCI: (خالية) جسر Elbrus PCIe (مراجعة 01)
00: 1.0 (PCI dev 8086: E3E3) [6 4]
جسر PCI إلى PCI: جسر Intel Corporation Elbrus Virt PCI (مراجعة 01)
01: 0.0 (PCI dev 1FFF: 8000) [6 4]
جسر PCI إلى PCI: (خالية) جسر Elbrus PCI (مراجعة 05)
01: 1.0 (PCI dev 8086: 4D45) [2 0]
وحدة تحكم Ethernet: Intel Corporation MCST ETH1000 شبكة جيجابت إيثرنت (مراجعة 01)
01: 2.0 (PCI dev 8086: 4D49) [1 1]
تحكم IDE: Intel Corporation MCST IDE (مراجعة 128)
01: 2.1 (PCI dev 8086: 0002) [7 2]
بالاتصالات بسيطة. التحكم: Intel Corporation (خالية) (مراجعة 05)
01: 2.2 (PCI dev 8086: 8000) [7 128]
بالاتصالات بسيطة. التحكم: جسر Intel Corporation Elbrus PCI (rev 00)
01: 2.3 (PCI dev 1013: 6005) [4 1]
جهاز الوسائط المتعددة: Cirrus Logic Crystal CS4281 PCI Audio (rev 01)
01: 3.0 (PCI dev 8086: 4748) [1 6]
وحدة التحكم في السعة التخزينية: Intel Corporation MCST SATA (rev 00)
01: 4.0 (PCI dev 8086: 554F) [12 3]
جهاز USB: Intel Corporation OHCI for Elbrus (rev 00)
01: 4.1 (PCI dev 8086: 5545) [12 3]
جهاز USB: Intel Corporation EHCI for Elbrus (rev 00)
02: 1.0 (PCI dev 126F: 0718) [3 0]
جهاز تحكم متوافق مع VGA: Silicon Motion، Inc. SM718 LynxSE + (مراجعة 160)
الجذر @ embox: (خالية) #
تعليق
01: 2.2 (PCI dev 8086: 8000) [7 128]
بالاتصالات بسيطة. التحكم: جسر Intel Corporation Elbrus PCI (rev 00)
في الواقع ، هو منفذ تسلسلي من MCST يشبه am85c30 ، على الأقل من خلال هذا الجهاز نتواصل من خلال minicom.
بطاقة الشبكة
الهيكل العام
الآن دعنا نصل إلى بطاقة الشبكة.
إذا فهمت بشكل صحيح ، فهذه هي بطاقة الشبكة الأصلية ، تشبه قليلاً في العملية إلى e1000 ، ولكن فقط في العملية (مثل وجود الواصفات في قوائم انتظار الاستلام والإرسال).
الآن المزيد عن النقاط المهمة التي واجهناها.
بطاقة PCI VID: PID 0x8086: 0x4D45. لا تتفاجأ من أن VID يطابق Intel ، فغالباً ما يستخدم MCST هذا VID بعينه ، انظر على الأقل إلى جهاز المنفذ التسلسلي المذكور أعلاه.
BAR0 يحتوي على قاعدة التسجيل. السجلات هي كما يلي:
#define L_E1000_E_CSR 0x00 #define L_E1000_MGIO_CSR 0x04 #define L_E1000_MGIO_DATA 0x08 #define L_E1000_E_BASE_ADDR 0x0c #define L_E1000_DMA_BASE_ADDR 0x10 #define L_E1000_PSF_CSR 0x14 #define L_E1000_PSF_DATA 0x18 #define L_E1000_INT_DELAY 0x1c
الثلاثة الأخيرة (L_E1000_PSF_CSR ، L_E1000_PSF_DATA ، L_E1000_INT_DELAY) لم نستخدمها ، لذلك لن نتحدث عنها. لنبدأ مع MGIO ، كل شيء بسيط: القراءة والكتابة باستخدام بروتوكول MII ، أي التواصل مع شريحة PHY. على وجه التحديد ، لدينا رقاقة DP83865.
الإجراءات ليست ملحوظة بشكل خاص ، وسأذكرها ببساطة.
القراءة:
static int e1000_mii_readreg(struct net_device *dev, int phy_id, int reg_num) { struct l_e1000_priv *ep = netdev_priv(dev); uint32_t rd; uint16_t val_out = 0; int i = 0; rd = 0; rd |= 0x2 << MGIO_CS_OFF; rd |= 0x1 << MGIO_ST_OF_F_OFF; rd |= 0x2 << MGIO_OP_CODE_OFF; rd |= (phy_id & 0x1f) << MGIO_PHY_AD_OFF; rd |= (reg_num & 0x1f) << MGIO_REG_AD_OFF; e1000_write_mgio_data(ep, rd); rd = 0; for (i = 0; i != 1000; i++) { if (e1000_read_mgio_csr(ep) & MGIO_CSR_RRDY) { rd = (uint16_t)e1000_read_mgio_data(ep); val_out = rd & 0xffff; log_debug("reg 0x%x >>> 0x%x", reg_num, val_out); return val_out; } usleep(100); } log_error("mdio_read: Unable to read from MGIO_DATA reg\n"); return val_out; }
تسجيل:
static void e1000_mii_writereg(struct net_device *dev, int phy_id, int reg_num, int val) { struct l_e1000_priv *ep = netdev_priv(dev); uint32_t wr; int i = 0; wr = 0; wr |= 0x2 << MGIO_CS_OFF; wr |= 0x1 << MGIO_ST_OF_F_OFF; wr |= 0x1 << MGIO_OP_CODE_OFF; wr |= (phy_id & 0x1f) << MGIO_PHY_AD_OFF; wr |= (reg_num & 0x1f) << MGIO_REG_AD_OFF; wr |= val & 0xffff; log_debug("reg 0x%x <<< 0x%x", reg_num, val); e1000_write_mgio_data(ep, wr); for (i = 0; i != 1000; i++) { if (e1000_read_mgio_csr(ep) & MGIO_CSR_RRDY) { return; } usleep(100); } log_error("Unable to write MGIO_DATA reg: val = 0x%x", wr); return; }
الآن L_E1000_DMA_BASE_ADDR و L_E1000_E_BASE_ADDR ، في الواقع يصفان معلمة واحدة ، عنوان كتلة وصف بطاقة الشبكة. بمعنى ، العنوان في Elbrus هو 64 بت ، والسجلات 32 بت.
في الواقع رمز:
init_block_addr_part = (uint32_t)((uintptr_t)ep->init_block & 0xffffffff); e1000_write_e_base_addr(ep, init_block_addr_part); log_debug("Init Block Low DMA addr: 0x%x", init_block_addr_part); init_block_addr_part = (uint32_t)(((uintptr_t)(ep->init_block) >> 32) & 0xffffffff); e1000_write_dma_base_addr(ep, init_block_addr_part); log_debug("Init Block High DMA addr: 0x%x", init_block_addr_part);
يمكن من خلاله ملاحظة أن L_E1000_DMA_BASE_ADDR هو الجزء العلوي ، وأن L_E1000_DMA_BASE_ADDR هو الجزء السفلي من عنوان كتلة تهيئة معينة (في الواقع كتلة وصف خريطة).
هيكل الوصف على النحو التالي:
struct l_e1000_init_block { uint16_t mode; uint8_t paddr[6]; uint64_t laddrf; uint32_t rdra; uint32_t tdra; } __attribute__((packed));
C laddrf - لم يفهم ، لسبب ما هو وضعه على الصفر ، فعلنا الشيء نفسه.
paddr - كما تعتقد ، فإن mac هو عنوان بطاقة الشبكة.
تحتوي rdra و tdra على عناوين حلقات واصفات الذاكرة ، ويتم تخصيص أقل 4 بتات لحجم الخاتم ، وهذا هو لوغاريتم الحجم. وهذا هو ، إذا كان هناك 8 ، فسيكون عدد الواصفات في الحلقة 2 ^ 8 (1 << 8 == 256).
الوضع هو طريقة تشغيل البطاقة ، البتات هي كما يلي:
#define DRX (1 << 0) #define DTX (1 << 1) #define LOOP (1 << 2) #define DTCR (1 << 3) #define COLL (1 << 4) #define DRTY (1 << 5) #define INTL (1 << 6) #define EMBA (1 << 7) #define EJMF (1 << 8) #define EPSF (1 << 9) #define FULL (1 << 10) #define PROM (1 << 15)
وهذا هو ، عندما يتم تكوين كل شيء ، تحتاج إلى تعيين بت 10. إذا كنت ترغب في وضع مختلط ، ثم أيضا 15.
واصفات الحزمة
الآن حول تنسيق واصفات الحزمة.
في الاستقبال:
struct l_e1000_rx_desc { uint32_t base; int16_t buf_length; int16_t status; int16_t msg_length; uint16_t reserved1; uint32_t etmr; } __attribute__((packed));
قاعدة - ربما نفهم أن هذا هو عنوان المخزن المؤقت للحزمة
buf_length - حجم المخزن المؤقت
msg_length - بعد الاستلام ، يحتوي على طول الحزمة المستلمة
حالة - حالة واصف. عند إعداد الحزمة وإعطاءها لـ DMA (البطاقة) ، تحتاج إلى ضبط البت 15 (RD_OWN). إذا كان كل شيء على ما يرام ، ثم بعد تلقي الحزمة في هذا الواصف ، سيتم إعادة تعيين هذا البت وسيتم تعيين 9 (RD_STP) و 8 (RD_ENP).
كل بتات الحالة كما يلي:
#define RD_OWN (1 << 15) #define RD_ERR (1 << 14) #define RD_FRAM (1 << 13) #define RD_OFLO (1 << 12) #define RD_CRC (1 << 11) #define RD_BUFF (1 << 10) #define RD_STP (1 << 9) #define RD_ENP (1 << 8) #define RD_PAM (1 << 6) #define RD_LAFM (1 << 4) #define RD_BAM (1 << 3)
عند النقل:
struct l_e1000_tx_desc { uint32_t base; int16_t buf_length; int16_t status; uint32_t misc; uint32_t etmr; } __attribute__((packed));
تقريبًا نفس حالة الاستلام ، تكون بتات الحالة كما يلي:
#define TD_OWN (1 << 15) #define TD_ERR (1 << 14) #define TD_AFCS (1 << 13) #define TD_NOINTR (1 << 13) #define TD_MORE (1 << 12) #define TD_ONE (1 << 11) #define TD_DEF (1 << 10) #define TD_STP (1 << 9) #define TD_ENP (1 << 8)
عند إرسال حزمة ، من الضروري تعيين 15 (TD_OWN) و 9 (TD_STP) و 8 (TD_ENP) وفقًا لذلك. البتة 8 تعني أن هذه هي آخر حزمة يتم معالجتها ، لذلك ، إذا تم إرسال الحزمة ، فأنت بحاجة إلى تثبيت فقط في الحزمة الأخيرة.
لقد نسيت أيضًا ميزة مهمة ، حيث يتم كتابة طول المخزن المؤقت في الواصفات بعلامة ناقص ، ربما برمز إضافي. حتى في endian قليلاً ، لكن بما أن Elbrus له نفس ترتيب البايت ، فمن المحتمل أن هذا ليس مهمًا.
سجل الإدارة
الآن نصف آخر سجل غير مفكك L_E1000_E_CSR:
#define E_CSR_ATME (1 << 24) #define E_CSR_TMCE (1 << 23) #define E_CSR_DRIN (1 << 22) #define E_CSR_DTIN (1 << 21) #define E_CSR_ESLE (1 << 20) #define E_CSR_SLVE (1 << 19) #define E_CSR_PSFI (1 << 18) #define E_CSR_SINT (1 << 16) #define E_CSR_ERR (1 << 15) #define E_CSR_BABL (1 << 14) #define E_CSR_CERR (1 << 13) #define E_CSR_MISS (1 << 12) #define E_CSR_MERR (1 << 11) #define E_CSR_RINT (1 << 10) #define E_CSR_TINT (1 << 9) #define E_CSR_IDON (1 << 8) #define E_CSR_INTR (1 << 7) #define E_CSR_INEA (1 << 6) #define E_CSR_RXON (1 << 5) #define E_CSR_TXON (1 << 4) #define E_CSR_TDMD (1 << 3) #define E_CSR_STOP (1 << 2) #define E_CSR_STRT (1 << 1) #define E_CSR_INIT (1 << 0)
التهيئة
يوجد تسلسل تهيئة غير عادي إلى حد ما:
STOP-> INIT-> IDON-> STRT
في هذه الحالة ، ترتفع بتات RXON و TXON بشكل مستقل.
مزيد من التفاصيل يمكن العثور عليها في سائقنا.
بطاقة الفيديو
كما ذكرنا سابقًا ، يستخدم الجهاز vidyah Silicon Motion يسمى SM718 LynxSE +. لذلك ، كل شيء بسيط ، هناك
مصادر برامج التشغيل في Linux ولا يوجد شيء يمكن وصفه بالفعل.
حسنًا ، فيما عدا أن الفيديو يظهر أنه تبين انخفاضًا في الثانية ، يبدو أنه يشبه الوصول البطيء إلى الذاكرة. ولكن هذا بدون تحسين برنامج التحويل البرمجي ، وبشكل عام ، ربما تكون هذه هي مشكلتنا المرتبطة بالاستخدام غير الصحيح للهيكل e2k.
حسنا ، ماذا أقول عن سخالين البروس؟
من حيث المبدأ ، فإن الطقس طبيعي :)
على ما يبدو ، Elbrus موجودة ، والعمل. أنا شخصياً أرى أن المشكلة الرئيسية لتطوير هذا العمارة المثيرة للاهتمام هي قربها. من الصعب تصديق أن شركة صغيرة نسبيًا يمكنها إنشاء معالج ومترجم وتقديم الدعم وكل شيء آخر. نعم ، بدأ مطورو برامج الجهات الخارجية في الظهور ، ونفس Basalt-SPO يدعم
Alt-Linux ، والذي يمكن تثبيته على Elbrus .
نعم ، كانت هناك تقارير تفيد بأن مطوري الطرف الثالث يصنعون الأجهزة بناءً على معالج Elbrus ، على سبيل المثال
Fastwel . ولكن كل هذه ليست سوى تقدم صغير نحو الانفتاح. مثال بسيط للغاية ، من أجل إعادة إنتاج ما قلناه
وبيانه هنا ، نحتاج إلى مترجم ، وفقط
MCST لديه ، المعلومات الواردة في المقالة هي إضافة إلى المعلومات التي وردت من ، مرة أخرى ، من
MCST ، وما زلت لا أقول أنه من غير المرجح العثور على قطعة من الحديد حتى في MCST. إنه قديم جدًا ، ويقدم
ICST طرازات أحدث.
ملاحظة: بطبيعة الحال ، يمكنك رؤية كل شيء في
مستودع Embox .
PPS تعال إلى قناة التلغراف الروسية عبر Embox (
https://t.me/embox_chat ).
قام PPS Embox بتحديث المكون الثاني في الإصدار ، والآن
0.4.0 الحالي