Các cờ trong / Proc / cpuinfo có nghĩa là gì?


212

Làm cách nào để biết bộ xử lý của tôi có tính năng cụ thể không? (Tập lệnh 64 bit, ảo hóa có hỗ trợ phần cứng, máy gia tốc mật mã, v.v.) Tôi biết rằng tệp /proc/cpuinfochứa thông tin này, trong flagsdòng, nhưng tất cả những từ viết tắt mật mã này có ý nghĩa gì?

Ví dụ, được trích xuất sau đây /proc/cpuinfo, tôi có CPU 64 bit không? Tôi có ảo hóa phần cứng không?

model name      : Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz
…
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 lahf_lm tpr_shadow vnmi flexpriority

Câu trả lời:


275

x86

(32-bit aka i386, i686 và 64-bit aka amd64. Nói cách khác, máy trạm, máy tính xách tay hoặc máy chủ của bạn.)

Câu hỏi thường gặp: Tôi có có

  • 64-bit (x86_64 / AMD64 / Intel64)? lm
  • Ảo hóa phần cứng (VMX / AMD-V)? vmx(Intel), svm(AMD)
  • AES tăng tốc (AES-NI)? aes
  • TXT (TPM)? smx
  • một siêu giám sát (công bố như vậy)? hypervisor

Hầu hết các tính năng khác chỉ được các tác giả biên dịch hoặc kernel quan tâm.

Tất cả các cờ

Danh sách đầy đủ nằm trong nguồn kernel, trong tệp arch/x86/include/asm/cpufeatures.h.

Các tính năng CPU do Intel xác định, mức CPUID 0x00000001 (edx)

Xem thêm Wikipedia và bảng 2-27 trong Tài liệu tham khảo lập trình mở rộng vectơ nâng cao của Intel

Các tính năng CPU do AMD xác định, mức CPUID 0x80000001

Xem thêm Wikipedia và bảng 2-23 trong Tài liệu tham khảo lập trình mở rộng vectơ nâng cao của Intel

Các tính năng CPU được xác định bằng Transmeta, mức CPUID 0x80860001

  • recovery: CPU ở chế độ phục hồi
  • longrun: Điều khiển công suất dài
  • lrti: Giao diện bảng LongRun

Các tính năng khác, ánh xạ do Linux định nghĩa

  • cxmmx: Tiện ích mở rộng Cyrix MMX
  • k6_mtrr: MTRR không chuẩn AMD K6
  • cyrix_arr: ARrix ARR (= MTRR)
  • centaur_mcr: MCR Centaur (= MTRR)
  • constant_tsc: TSC đánh dấu ở một tốc độ không đổi
  • up: Nhân SMP chạy trên UP
  • art: Hẹn giờ luôn chạy
  • arch_perfmon: Intel Architecture PerfMon
  • pebs: Lấy mẫu dựa trên sự kiện chính xác
  • bts: Cửa hàng chi nhánh
  • rep_good: rep microcode hoạt động tốt
  • acc_power: Cơ chế tích lũy năng lượng của AMD
  • nopl: Hướng dẫn NOPL (0F 1F)
  • xtopology: phần mở rộng cấu trúc liên kết cpu
  • tsc_reliable: TSC được biết là đáng tin cậy
  • nonstop_tsc: TSC không dừng ở trạng thái C
  • cpuid: CPU có lệnh CPUID
  • extd_apicid: đã mở rộng APICID (8 bit)
  • amd_dcm: bộ xử lý đa nút
  • aperfmperf: APERFMPERF
  • eagerfpu: Khôi phục FPU không lười biếng
  • nonstop_tsc_s3: TSC không dừng ở trạng thái S3
  • tsc_known_freq: TSC có tần số đã biết
  • mce_recovery: CPU đã kiểm tra máy có thể phục hồi

Các tính năng CPU do Intel xác định, mức CPUID 0x00000001 (ecx)

Xem thêm Wikipedia và bảng 2-26 trong Tài liệu tham khảo lập trình mở rộng vectơ nâng cao của Intel

Các tính năng CPU do VIA / Cyrix / Centaur xác định, mức CPUID 0xC0000001

  • rng: Trình tạo số ngẫu nhiên hiện tại (xstore)
  • rng_en: Đã bật Trình tạo số ngẫu nhiên
  • ace: tiền điện tử trên CPU (xcrypt)
  • ace_en: bật mã hóa trên CPU
  • ace2: Công cụ mã hóa nâng cao v2
  • ace2_en: Đã bật ACE v2
  • phe: Công cụ băm PadLock
  • phe_en: Đã bật PHE
  • pmm: Hệ số nhân PadLock Montgomery
  • pmm_en: Đã bật PMM

Các cờ AMD mở rộng khác: cấp CPUID 0x80000001, ecx

  • lahf_lm: Tải AH từ Cờ (LAHF) và Lưu AH vào Cờ (SAHF) ở chế độ dài
  • cmp_legacy: Nếu có HyperThreading không hợp lệ
  • svm: “Bảo vệ máy ảo”: AMD-V
  • extapic: Không gian APIC mở rộng
  • cr8_legacy: CR8 ở chế độ 32 bit
  • abm: Thao tác bit nâng cao
  • sse4a: SSE-4A
  • misalignsse: cho biết nếu một ngoại lệ bảo vệ chung (#GP) được tạo khi một số lệnh SSE cũ hoạt động trên dữ liệu chưa được phân bổ. Cũng phụ thuộc vào CR0 và bit Kiểm tra căn chỉnh
  • 3dnowprefetch: Hướng dẫn tìm nạp trước 3DNow
  • osvw: cho biết OS Visible Workaround , cho phép HĐH hoạt động xung quanh bộ xử lý errata.
  • ibs: Lấy mẫu dựa trên hướng dẫn
  • xop: hướng dẫn AVX mở rộng
  • skinit: Hướng dẫn SKINIT / STGI
  • wdt: Đồng hồ bấm giờ
  • lwp: Hồ sơ trọng lượng nhẹ
  • fma4: 4 toán hạng MAC
  • tce: phần mở rộng bộ đệm dịch
  • nodeid_msr: MSode NodeId
  • tbm: Thao tác bit Trailing
  • topoext: Phần mở rộng cấu trúc liên kết Lá CPUID
  • perfctr_core: Phần mở rộng bộ đếm hiệu suất cốt lõi
  • perfctr_nb: Tiện ích mở rộng bộ đếm hiệu suất NB
  • bpext: mở rộng điểm ngắt dữ liệu
  • ptsc: bộ đếm thời gian hiệu suất
  • perfctr_l2: Phần mở rộng bộ đếm hiệu suất L2
  • mwaitx: MWAITphần mở rộng ( MONITORX/ MWAITX)

Cờ phụ: Linux được xác định - Dành cho các tính năng nằm rải rác ở các cấp CPUID khác nhau

  • ring3mwait: Đổ chuông 3 GIÁM SÁT / MWAIT
  • cpuid_fault: Lỗi CPU CPUID
  • cpb: Tăng cường hiệu năng lõi AMD
  • epb: Hỗ trợ IA32_ENERGY_PERF_BIAS
  • cat_l3: Công nghệ phân bổ bộ đệm L3
  • cat_l2: Công nghệ phân bổ bộ đệm L2
  • cdp_l3: Ưu tiên mã và dữ liệu L3
  • invpcid_single: hiệu quả invpcidCR4.PCIDE=1
  • hw_pstate: AMD CT-PState
  • proc_feedback: AMD ProcFeedbackInterface
  • sme: Mã hóa bộ nhớ an toàn AMD
  • pti: Cách ly bảng trang hạt nhân (Kaiser)
  • retpoline: Giảm thiểu retpoline cho biến thể Spectre 2 (các nhánh gián tiếp)
  • retpoline_amd: Giảm thiểu Retpoline AMD
  • intel_ppin: Số lượng hàng tồn kho của bộ xử lý Intel
  • avx512_4vnniw: Hướng dẫn về mạng nơ-ron AVX-512
  • avx512_4fmaps: Tích lũy nhân AVX-512 Độ chính xác đơn
  • mba: Phân bổ băng thông bộ nhớ
  • rsb_ctxsw: Điền RSB vào các công tắc ngữ cảnh

Cờ ảo hóa: Linux xác định

  • tpr_shadow: Bóng tối TPR của Intel
  • vnmi: Intel ảo NMI
  • flexpriority: Intel FlexP Warriority
  • ept: Bảng trang mở rộng của Intel
  • vpid: ID bộ xử lý ảo Intel
  • vmmcall: Thích VMMCALLđểVMCALL

Các tính năng CPU do Intel xác định, mức CPUID 0x00000007: 0 (ebx)

Các tính năng trạng thái mở rộng, mức CPUID 0x0000000d: 1 (eax)

  • xsaveopt: Tối ưu hóa XSAVE
  • xsavec: XSAVEC
  • xgetbv1: XGETBVvới ECX = 1
  • xsaves: XSAVES/XRSTORS

Lá con QoS CPU do Intel định nghĩa, mức CPUID 0x0000000F: 0 (edx)

  • cqm_llc: LLC QoS

Lá con QoS CPU do Intel định nghĩa, mức CPUID 0x0000000F: 1 (edx)

  • cqm_occup_llc: Giám sát chiếm chỗ LLC
  • cqm_mbm_total: LLC theo dõi tổng MBM
  • cqm_mbm_local: LLC giám sát MBM địa phương

Các tính năng CPU do AMD xác định, mức CPUID 0x80000008 (ebx)

  • clzero: CLZEROhướng dẫn
  • irperf: hướng dẫn truy cập hiệu suất đã nghỉ hưu
  • xsaveerptr: Luôn lưu / khôi phục con trỏ lỗi FP

Lá quản lý nhiệt và năng lượng, mức CPUID 0x00000006 (eax)

  • dtherm(trước đây dts): cảm biến nhiệt kỹ thuật số
  • ida: Tăng tốc động Intel
  • arat: Luôn luôn chạy APIC Timer
  • pln: Thông báo giới hạn năng lượng của Intel
  • pts: Trạng thái nhiệt gói Intel
  • hwp: Trạng thái P của Phần cứng Intel
  • hwp_notify: Thông báo CTNH
  • hwp_act_window: Cửa sổ hoạt động của HWP
  • hwp_epp: Ưu tiên hiệu suất năng lượng của HWP
  • hwp_pkg_req: Yêu cầu cấp gói HWP

Nhận dạng tính năng AMD SVM, mức CPUID 0x8000000a (edx)

  • npt: Hỗ trợ bảng AMD Nested Page
  • lbrv: Hỗ trợ ảo hóa AMD LBR
  • svm_lock: AMD SVM khóa MSR
  • nrip_save: AMD SVM next_rip lưu
  • tsc_scale: Hỗ trợ mở rộng AMD TSC
  • vmcb_clean: Hỗ trợ bit sạch AMD VMCB
  • flushbyasid: Hỗ trợ AMD flush-by-ASID
  • decodeassists: Hỗ trợ giải mã AMD hỗ trợ
  • pausefilter: AMD chặn lọc tạm dừng
  • pfthreshold: AMD tạm dừng ngưỡng bộ lọc
  • avic: Bộ điều khiển ngắt ảo
  • vmsave_vmload: VMLAVE VMLOAD ảo
  • vgif: GIF ảo

Các tính năng CPU do Intel xác định, mức CPUID 0x00000007: 0 (ecx)

  • avx512vbmi: Hướng dẫn thao tác bitcoin AVX512
  • umip: Bảo vệ hướng dẫn chế độ người dùng
  • pku: Khóa bảo vệ cho không gian người dùng
  • ospke: Bật khóa bảo vệ hệ điều hành
  • avx512_vbmi2: Hướng dẫn thao tác Bit Vector AVX512 bổ sung
  • gfni: Hướng dẫn mới của Galois Field
  • vaes: Vector AES
  • vpclmulqdq: Tứ giác nhân đôi ít mang
  • avx512_vnni: Hướng dẫn mạng nơ-ron Vector
  • avx512_bitalg: Hướng dẫn VPOPCNT [B, W] và VPSHUF-BITQMB
  • avx512_vpopcntdq: POPCNT cho vectơ của DW / QW
  • la57: Bảng trang 5 cấp
  • rdpid: Hướng dẫn RDPID

Các tính năng CPU do AMD xác định, mức CPUID 0x80000007 (ebx)

  • overflow_recov: Hỗ trợ phục hồi tràn MCA
  • succor: ngăn chặn và phục hồi lỗi không chính xác
  • smca: MCA có thể mở rộng

Đã phát hiện lỗi CPU (do Linux định nghĩa)

  • f00f: Intel F00F
  • fdiv: CPU FDIV
  • coma: Hôn mê Cyrix 6x86
  • amd_tlb_mmatch: tlb_mmatchAMD Erratum 383
  • amd_apic_c1e: apic_c1eAMD Erratum 400
  • 11ap: APIC xấu địa phương aka 11AP
  • fxsave_leak: FXSAVE rò rỉ FOP / FIP / FOP
  • clflush_monitor: Cần có AAI65, CLFLUSH trước MONITOR
  • sysret_ss_attrs: SYSRET không sửa lỗi SS attrs
  • espfix: "" IRET đến SS 16 bit làm hỏng các bit cao ESP / RSP
  • null_seg: Nulling một bộ chọn bảo vệ cơ sở
  • swapgs_fence: SWAPGS không có dep đầu vào trên GS
  • monitor: IPI cần thiết để đánh thức CPU từ xa
  • amd_e400: CPU nằm trong số bị ảnh hưởng bởi Erratum 400
  • cpu_meltdown: CPU bị ảnh hưởng bởi cuộc tấn công meltdown và cần cách ly bảng trang kernel
  • spectre_v1: CPU bị ảnh hưởng bởi cuộc tấn công biến thể 1 của Spectre với các nhánh có điều kiện
  • spectre_v2: CPU bị ảnh hưởng bởi cuộc tấn công biến thể 2 của Spectre với các nhánh gián tiếp
  • spec_store_bypass: CPU bị ảnh hưởng bởi lỗ hổng Specitive Store Bypass (biến thể Spectre 4).

PS Danh sách này được lấy từ arch/x86/include/asm/cpufeatures.hnguồn kernel. Các cờ được liệt kê theo thứ tự giống như mã nguồn. Vui lòng trợ giúp bằng cách thêm liên kết đến các mô tả về các tính năng khi chúng bị thiếu, bằng cách viết một mô tả ngắn về các tính năng có tên không ấn tượng và bằng cách cập nhật danh sách cho các phiên bản kernel mới. Danh sách hiện tại là từ Linux 4.15 cộng với một số bổ sung sau này.


1
Cảm ơn @Gilles và các biên tập viên cho một câu hỏi thông tin & câu trả lời tóm tắt và chi tiết của nó. Bây giờ, để kiểm tra bất kỳ khả năng CPU nào, tôi sử dụng các mục sau được lấy từ NixCraft, ví dụ: đối với CPU Intel : $ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u. Và còn có i-nex CLI / GUI xuất sắc .
tuk0z

Bộ sưu tập giải thích & liên kết xuất sắc; Cảm ơn những người đã đóng góp.
Paul Gear

Dữ liệu lỗi đến từ đâu? Nó dường như không được liệt kê trong tệp cpufeatures.h.
Drazisil

@Drazisil Theo tôi nhớ tất cả các mục từ phiên bản được chỉ định của cpufeatures.h. Các mô tả được chỉnh sửa để làm cho chúng dễ hiểu hơn và nhiều thông tin hơn, nơi ai đó đã nỗ lực để làm điều đó.
Gilles

@Gilles Đó dường như là trường hợp của tất cả trừ các lỗi. Đặt sang một bên rằng những người không featurestôi không nhìn thấy họ trong tập tin đó.
Drazisil

71

CÁNH TAY

Trên bộ xử lý ARM, một vài tính năng được đề cập trong features:dòng. Chỉ các tính năng liên quan trực tiếp đến kiến ​​trúc ARM được đề cập ở đó, không phải là các tính năng dành riêng cho nhà sản xuất silicon hoặc hệ thống trên chip.

Các tính năng thu được từ việc tra cứu id CPU read_cpuid()và tìm kiếm nó trong các định nghĩa loại bộ xử lý được biết tại thời điểm biên dịch trong đó các tính năng được thể hiện dưới dạng mặt nạ HWCAP_xxxcờ. Các chuỗi tương ứng là trong hwcap_strvv trongsetup.c .

Trong danh sách dưới đây, ARMv6 đã giới thiệu các hướng dẫn và kiểu dữ liệu SIMD. ARMv7 cung cấp các hướng dẫn và kiểu dữ liệu SIMD nâng cao. Trên các máy ARM 32 bit, neonbáo hiệu SIMD Nâng cao; trong khi asimdtín hiệu SIMD nâng cao trên máy tay 64 bit.

Ngoài ra, Hardware:dòng chỉ ra mô hình bộ xử lý. Tùy thuộc vào kiểu máy, có thể có thông tin khác trong các tệp khác trong /prochoặc /sys, hoặc trong các thông điệp nhật ký kernel thời gian khởi động. Thật không may, mỗi nhà sản xuất CPU ARM có phương pháp riêng để báo cáo các tính năng của bộ xử lý, nếu có.



11

x86

Tìm chính nó trong 4.1.3 x86 và hướng dẫn sử dụng Intel

arch/x86/include/asm/cpufeature.h chứa danh sách đầy đủ.

Các giá trị xác định là loại:

X*32 + Y

Ví dụ:

#define X86_FEATURE_FPU     ( 0*32+ 0) /* Onboard FPU */

Các cờ tính năng, được trích xuất từ ​​CPUID, được lưu trữ bên trong:

  • __u32 x86_capability[NCAPINTS + NBUGINTS]; cánh đồng
  • của struct cpuinfo_x86 boot_cpu_data
  • được định nghĩa tại x86/kernel/setup.c

được khởi tạo thông qua các __initchức năng.

Trường hợp mỗi x86_capabilityphần tử mảng đến từ:

| index | eax      | ecx | output | file        |
|-------|----------|-----|--------|-------------|
|     0 |        1 |   0 | edx    | common.c    |
|     1 | 80000001 |     | edx    | common.c    |
|     2 | 80860001 |     | edx    | transmeta.c |
|     3 |          |     |        |             |
|     4 |        1 |   0 | ecx    | common.c    |
|     5 | C0000001 |     | edx    | centaur.c   |
|     6 | 80000001 |     | ecx    | common.c    |
|     7 |          |     |        | scattered.c |
|     8 |          |     |        |             |
|     9 |        7 |   0 | ebx    | common.c    |
|    10 |        D |   1 | eax    | common.c    |
|    11 |        F |   0 | edx    | common.c    |
|    12 |        F |   1 | edx    | common.c    |

Ghi chú:

  • mục trống có nghĩa là: "từ nhiều nơi khác nhau" hoặc "không có sẵn"
  • index: là chỉ số của x86_capability, vdx86_capability[0]
  • eaxexc: là các giá trị đầu vào cho CPUID ở dạng hex. Các đầu vào sử dụng exc, ít hơn, gọi nó là subleaf (của cây 2 cấp có eaxgốc).
  • output: là thanh ghi mà đầu ra CPUID được lấy
  • file: là tệp nơi các trường được xác định. Đường dẫn có liên quan đến arch/x86/kernel/cpu/.
  • transmeta: là tên của nhà cung cấp CPU https://en.wikipedia.org/wiki/Transmeta được Novafora mua lại https://www.crunchbase.com/ Organization / nafafora
  • centaur: là tên của một nhà cung cấp CPU https://en.wikipedia.org/wiki/Centaur_T Technology được VIA https://en.wikipedia.org/wiki/VIA_Technology . Cyrix là một người khác.

Kết luận:

  • hầu hết các mục đến trực tiếp từ các thanh ghi đầu ra CPUID và được thiết lập common.cbởi một cái gì đó như:

    c->x86_capability[0] = edx;
    

    Chúng có thể dễ dàng tìm thấy hàng loạt trên sổ tay Intel cho CPUID.

  • những cái khác nằm rải rác trong nguồn và được thiết lập từng chút một set_cpu_cap.

    Để tìm thấy chúng, sử dụng git grep X86_FEATURE_XXXbên trong arch/x86.

    Bạn thường có thể suy ra bit CPUID tương ứng với mã xung quanh.

Những sự thật thú vị khác

  • Các cờ thực sự được in arch/x86/kernel/cpu/proc.cvới mã:

    seq_puts(m, "flags\t\t:");
    for (i = 0; i < 32*NCAPINTS; i++)
        if (cpu_has(c, i) && x86_cap_flags[i] != NULL)
            seq_printf(m, " %s", x86_cap_flags[i]);
    

    Ở đâu:

    • cpu_has kiểm tra chính cho các tính năng.
    • x86_cap_flags[i] chứa các chuỗi tương ứng với mỗi cờ.

    Điều này được thông qua như một cuộc gọi lại để procthiết lập hệ thống. Điểm vào là tại fs/proc/cpuinfo.c.

  • x86_cap_flagschuỗi được tạo bởi arch/x86/kernel/cpu/mkcapflags.htrực tiếp từ arch/x86/include/asm/cpufeature.h"phân tích" nó bằng sed...

    Đầu ra đi đến arch/x86/kernel/cpu/capflags.cthư mục build và mảng kết quả trông như sau:

    const char * const x86_cap_flags[NCAPINTS*32] = {
        [X86_FEATURE_FPU]        = "fpu",
        [X86_FEATURE_VME]        = "vme",
    

    vì vậy, ví dụ X86_FEATURE_FPUtương ứng với chuỗi "fpu"và như vậy.

  • cpu_has chia thành hai trường hợp với mã:

    #define cpu_has(c, bit)                         \
        (__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 :  \
        test_cpu_cap(c, bit))
    

    Họ đang:

    • __builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit): cờ được yêu cầu cho kernel chạy.

      Điều này được xác định bởi dữ liệu bên trong required-features.h, nhận xét:

      Define minimum CPUID feature set for kernel These bits are checked
      really early to actually display a visible error message before the
      kernel dies.  Make sure to assign features to the proper mask!
      

      Vì những cái đó được biết đến tại thời gian biên dịch (yêu cầu kernel), đã được kiểm tra khi khởi động, kiểm tra có thể được giải quyết tại thời gian biên dịch nếu bitđược biết tại thời gian biên dịch.

      Do __builtin_constant_p(bit)đó, kiểm tra nếu bitlà một hằng số thời gian biên dịch.

    • test_cpu_cap: điều này sử dụng hết CPUIDdữ liệu từ struct cpuinfo_x86 boot_cpu_datatoàn cầu


3
Bạn đã giải thích cách chuyển từ viết tắt sang tên dài hơn, nhưng thường thì tên dài hơn không dễ hiểu hơn nhiều và cpuidthực hiện theo cách thuận tiện hơn. Tôi đã hỏi câu hỏi đó để có một nơi ghi lại tên.
Gilles

@Gilles phần lớn dành cho những người muốn tạo các bảng / không thể tìm thấy tính năng của chúng trong bảng, như tôi :-) Nhưng, trong hầu hết các trường hợp, một khi bạn nhìn vào đúng điểm của nguồn, ánh xạ tới CPUID là ngay tức khắc.
Ciro Santilli 心 心

10

Hoặc ngoài ra, bạn có thể sử dụng cpuidchương trình, nó phải nằm trong kho lưu trữ debian. Nó bỏ mọi thông tin có thể có về CPU của bạn với một số giải thích, vì vậy bạn không nhận được những lá cờ tối nghĩa đó.


cpuidmở rộng các chữ viết tắt. Tôi sẽ không thực sự gọi giải thích đầu ra của nó . Biết điều đó htcó nghĩa là Hyper Hypering Threading giải thích nó ở một mức độ nào đó, nhưng biết điều đó mmxcó nghĩa là hướng dẫn MMX của bộ cài đặt, không quá nhiều, và điều đó mcacó nghĩa là hầu như không có nghĩa là Máy kiểm tra kiến ​​trúc.
Gilles

6
@Gilles ... và chưa hết, "Cấu trúc kiểm tra máy" chắc chắn là truy vấn Google tốt hơn "mca";)
Alois Mahdal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.