PR_RISCV_SET_ICACHE_FLUSH_CTX(2const)

الاسم
PR_RISCV_SET_ICACHE_FLUSH_CTX - تمكين/تعطيل تعليمات مسح ذاكرة التخزين المؤقت للتعليمات (icache) في مساحة المستخدم

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <linux/prctl.h>  /* تعريف ثوابت PR_* */
#include <sys/prctl.h>

int prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX, unsigned long ctx,
          unsigned long scope);

الوصف
يمكن توفير السياق والنطاق باستخدام ctx و scope على التوالي.

عند ضبط scope على PR_RISCV_SCOPE_PER_PROCESS، يُسمح لجميع الخيوط في العملية بإصدار تعليمات مسح ذاكرة التخزين المؤقت للتعليمات. كلما تم ترحيل أي خيط في العملية، سيتم ضمان اتساق ذاكرة التخزين المؤقت للتعليمات للنواة المقابلة مع تخزين التعليمات. لا يفرض هذا أي ضمانات خارج الترحيل. إذا قام خيط بتعديل تعليمة قد يحاول خيط آخر تنفيذها، فلا يزال على الخيط الآخر إصدار تعليمة مسح ذاكرة التخزين المؤقت للتعليمات قبل محاولة تنفيذ التعليمة التي يحتمل تعديلها. يجب تنفيذ ذلك بواسطة برنامج مساحة المستخدم.

في سياق كل خيط (أي، ضبط scope على PR_RISCV_SCOPE_PER_THREAD)، يُسمح فقط للخيط الذي يستدعي هذه الدالة بإصدار تعليمات مسح ذاكرة التخزين المؤقت للتعليمات. عندما يتم ترحيل الخيط، سيتم ضمان اتساق ذاكرة التخزين المؤقت للتعليمات للنواة المقابلة مع تخزين التعليمات.

على النوى المكونة بدون SMP، يكون هذا الاستدعاء PR_RISCV_SET_ICACHE_FLUSH_CTX عديم التأثير حيث لن تحدث عمليات ترحيل عبر النوى.

يمكن تحديد القيم التالية لـ ctx:

PR_RISCV_CTX_SW_FENCEI_ON (منذ لينكس 6.10)
    السماح بـ fence.i في مساحة المستخدم.

PR_RISCV_CTX_SW_FENCEI_OFF (منذ لينكس 6.10)
    منع fence.i في مساحة المستخدم. ستتأثر جميع الخيوط في العملية عند ضبط scope على PR_RISCV_SCOPE_PER_PROCESS. لذلك، يجب توخي الحذر؛ استخدم هذه العلامة فقط عندما يمكنك ضمان عدم إصدار أي خيط في العملية لـ fence.i من هذه النقطة فصاعدًا.

يمكن تحديد القيم التالية لـ scope:

PR_RISCV_SCOPE_PER_PROCESS (منذ لينكس 6.10)
    ضمان اتساق ذاكرة التخزين المؤقت للتعليمات لأي خيط في هذه العملية مع تخزين التعليمات عند الترحيل.

PR_RISCV_SCOPE_PER_THREAD (منذ لينكس 6.10)
    ضمان اتساق ذاكرة التخزين المؤقت للتعليمات للخيط الحالي مع تخزين التعليمات عند الترحيل.

أمثلة
الملفات التالية مخصصة للترجمة والربط مع بعضها البعض. تستبدل الدالة modify_instruction() تعليمة إضافة مع صفر بإضافة مع واحد، مما يتسبب في تغيير تسلسل التعليمات في get_value() من إرجاع صفر إلى إرجاع واحد.

  مصدر البرنامج: cmodx.c
    #include <stdio.h>
    #include <sys/prctl.h>

    extern int get_value(void);
    extern void modify_instruction(void);

    int
    main(void)
    {
        int value = get_value();

        printf("القيمة قبل cmodx: %d\n", value);

        // استدعاء prctl قبل استدعاء أول fence.i
        prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX, PR_RISCV_CTX_SW_FENCEI_ON,
              PR_RISCV_SCOPE_PER_PROCESS);

        modify_instruction();

        // استدعاء prctl بعد استدعاء آخر fence.i في العملية
        prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX, PR_RISCV_CTX_SW_FENCEI_OFF,
              PR_RISCV_SCOPE_PER_PROCESS);

        value = get_value();
        printf("القيمة بعد cmodx: %d\n", value);
        return 0;
    }

  مصدر البرنامج: cmodx.S
    .option norvc

    .text
    .global modify_instruction
    modify_instruction:
    lw a0, new_insn
    lui a5,%hi(old_insn)
    sw  a0,%lo(old_insn)(a5)
    fence.i
    ret

    .section modifiable, "awx"
    .global get_value
    get_value:
    li a0, 0
    old_insn:
    addi a0, a0, 0
    ret

    .data
    new_insn:
    addi a0, a0, 1

  النتيجة المتوقعة
    القيمة قبل cmodx: 0
    القيمة بعد cmodx: 1

المعايير
لينكس. فقط RISC-V.

التاريخ

لينكس 6.10 (RISC-V).

انظر أيضًا
prctl(2)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.