Lưu ý
Mục đích của file này là để độc giả tiếng Việt có thể đọc và hiểu tài liệu nhân kernel dễ dàng hơn, không phải để tạo ra một nhánh tài liệu riêng. Nếu bạn có bất kỳ nhận xét hoặc cập nhật nào cho file này, vui lòng thử cập nhật file tiếng Anh gốc trước. Nếu bạn thấy có sự khác biệt giữa bản dịch và bản gốc, hoặc có vấn đề về bản dịch, vui lòng gửi góp ý hoặc patch cho người dịch của file này, hoặc nhờ người bảo trì và người review tài liệu tiếng Việt giúp đỡ.
- Bản gốc:
- Người dịch:
Google Translate (machine translation)
- Phiên bản gốc:
8541d8f725c6
Cảnh báo
Tài liệu này được dịch tự động bằng máy và chưa được review bởi người dịch. Nội dung có thể không chính xác hoặc khó hiểu ở một số chỗ. Khi có sự khác biệt với bản gốc, bản gốc luôn là chuẩn. Bản dịch chất lượng cao (được review) được đặt trong thư mục vi_VN/.
1. Giới thiệu về LoongArch¶
LoongArch là RISC ISA mới, hơi giống MIPS hoặc RISC-V. có hiện có 3 biến thể: phiên bản 32 bit rút gọn (LA32R), phiên bản 32 bit tiêu chuẩn phiên bản (LA32S) và phiên bản 64-bit (LA64). Có 4 cấp độ đặc quyền (PLV) được xác định trong LoongArch: PLV0~PLV3, từ cao đến thấp. Hạt nhân chạy ở PLV0 trong khi các ứng dụng chạy ở PLV3. Tài liệu này giới thiệu các thanh ghi, cơ bản tập lệnh, bộ nhớ ảo và một số chủ đề khác của LoongArch.
1.1. Đăng ký¶
Các thanh ghi LoongArch bao gồm các thanh ghi mục đích chung (GPR), dấu phẩy động thanh ghi (FPR), thanh ghi vectơ (VR) và thanh ghi trạng thái điều khiển (CSR) được sử dụng ở chế độ đặc quyền (PLV0).
1.1.1. GPR¶
LoongArch có 32 GPR ( ZZ0000ZZ ~ ZZ0001ZZ ); mỗi cái rộng 32 bit trong LA32 và rộng 64-bit trong LA64. ZZ0002ZZ được nối cứng về 0 và các thanh ghi khác không có kiến trúc đặc biệt. (Ngoại trừ ZZ0003ZZ, có dây cứng như thanh ghi liên kết của lệnh BL.)
Hạt nhân sử dụng một biến thể của quy ước đăng ký LoongArch, như được mô tả trong thông số psABI của LoongArch ELF, trong ZZ0000ZZ:
Lưu ý
The register $r21 is reserved in the ELF psABI, but used by the Linux
kernel for storing the percpu base address. It normally has no ABI name,
but is called $u0 in the kernel. You may also see $v0 or $v1
in some old code,however they are deprecated aliases of $a0 and $a1
respectively.
1.1.2. FPR¶
LoongArch có 32 FPR ( ZZ0000ZZ ~ ZZ0001ZZ ) khi có FPU. Mỗi người là Độ rộng 64-bit trên lõi LA64.
Quy ước đăng ký dấu phẩy động giống như được mô tả trong Thông số LoongArch ELF psABI:
Lưu ý
You may see $fv0 or $fv1 in some old code, however they are
deprecated aliases of $fa0 and $fa1 respectively.
1.1.3. VR¶
Hiện tại có 2 phần mở rộng vector cho LoongArch:
LSX (Loongson SIMD eXtension) với vectơ 128-bit,
LASX (Loongson Advanced SIMD eXtension) với vectơ 256-bit.
LSX mang ZZ0000ZZ ~ ZZ0001ZZ trong khi LASX mang ZZ0002ZZ ~ ZZ0003ZZ làm vectơ sổ đăng ký.
Các VR trùng lặp với FPR: ví dụ: trên lõi triển khai LSX và LASX, 128 bit thấp hơn của ZZ0000ZZ được chia sẻ với ZZ0001ZZ và 64 bit thấp hơn của ZZ0002ZZ được chia sẻ với ZZ0003ZZ; tương tự với tất cả các VR khác.
1.1.4. CSR¶
CSR chỉ có thể được truy cập từ chế độ đặc quyền (PLV0):
Address |
Full Name |
Abbrev Name |
|---|---|---|
0x0 |
Current Mode Information |
CRMD |
0x1 |
Pre-exception Mode Information |
PRMD |
0x2 |
Extension Unit Enable |
EUEN |
0x3 |
Miscellaneous Control |
MISC |
0x4 |
Exception Configuration |
ECFG |
0x5 |
Exception Status |
ESTAT |
0x6 |
Exception Return Address |
ERA |
0x7 |
Bad (Faulting) Virtual Address |
BADV |
0x8 |
Bad (Faulting) Instruction Word |
BADI |
0xC |
Exception Entrypoint Address |
EENTRY |
0x10 |
TLB Index |
TLBIDX |
0x11 |
TLB Entry High-order Bits |
TLBEHI |
0x12 |
TLB Entry Low-order Bits 0 |
TLBELO0 |
0x13 |
TLB Entry Low-order Bits 1 |
TLBELO1 |
0x18 |
Address Space Identifier |
ASID |
0x19 |
Page Global Directory Address for Lower-half Address Space |
PGDL |
0x1A |
Page Global Directory Address for Higher-half Address Space |
PGDH |
0x1B |
Page Global Directory Address |
PGD |
0x1C |
Page Walk Control for Lower- half Address Space |
PWCL |
0x1D |
Page Walk Control for Higher- half Address Space |
PWCH |
0x1E |
STLB Page Size |
STLBPS |
0x1F |
Reduced Virtual Address Configuration |
RVACFG |
0x20 |
CPU Identifier |
CPUID |
0x21 |
Privileged Resource Configuration 1 |
PRCFG1 |
0x22 |
Privileged Resource Configuration 2 |
PRCFG2 |
0x23 |
Privileged Resource Configuration 3 |
PRCFG3 |
0x30+n (0≤n≤15) |
Saved Data register |
SAVEn |
0x40 |
Timer Identifier |
TID |
0x41 |
Timer Configuration |
TCFG |
0x42 |
Timer Value |
TVAL |
0x43 |
Compensation of Timer Count |
CNTC |
0x44 |
Timer Interrupt Clearing |
TICLR |
0x60 |
LLBit Control |
LLBCTL |
0x80 |
Implementation-specific Control 1 |
IMPCTL1 |
0x81 |
Implementation-specific Control 2 |
IMPCTL2 |
0x88 |
TLB Refill Exception Entrypoint Address |
TLBRENTRY |
0x89 |
TLB Refill Exception BAD (Faulting) Virtual Address |
TLBRBADV |
0x8A |
TLB Refill Exception Return Address |
TLBRERA |
0x8B |
TLB Refill Exception Saved Data Register |
TLBRSAVE |
0x8C |
TLB Refill Exception Entry Low-order Bits 0 |
TLBRELO0 |
0x8D |
TLB Refill Exception Entry Low-order Bits 1 |
TLBRELO1 |
0x8E |
TLB Refill Exception Entry High-order Bits |
TLBEHI |
0x8F |
TLB Refill Exception Pre-exception Mode Information |
TLBRPRMD |
0x90 |
Machine Error Control |
MERRCTL |
0x91 |
Machine Error Information 1 |
MERRINFO1 |
0x92 |
Machine Error Information 2 |
MERRINFO2 |
0x93 |
Machine Error Exception Entrypoint Address |
MERRENTRY |
0x94 |
Machine Error Exception Return Address |
MERRERA |
0x95 |
Machine Error Exception Saved Data Register |
MERRSAVE |
0x98 |
Cache TAGs |
CTAG |
0x180+n (0≤n≤3) |
Direct Mapping Configuration Window n |
DMWn |
0x200+2n (0≤n≤31) |
Performance Monitor Configuration n |
PMCFGn |
0x201+2n (0≤n≤31) |
Performance Monitor Overall Counter n |
PMCNTn |
0x300 |
Memory Load/Store WatchPoint Overall Control |
MWPC |
0x301 |
Memory Load/Store WatchPoint Overall Status |
MWPS |
0x310+8n (0≤n≤7) |
Memory Load/Store WatchPoint n Configuration 1 |
MWPnCFG1 |
0x311+8n (0≤n≤7) |
Memory Load/Store WatchPoint n Configuration 2 |
MWPnCFG2 |
0x312+8n (0≤n≤7) |
Memory Load/Store WatchPoint n Configuration 3 |
MWPnCFG3 |
0x313+8n (0≤n≤7) |
Memory Load/Store WatchPoint n Configuration 4 |
MWPnCFG4 |
0x380 |
Instruction Fetch WatchPoint Overall Control |
FWPC |
0x381 |
Instruction Fetch WatchPoint Overall Status |
FWPS |
0x390+8n (0≤n≤7) |
Instruction Fetch WatchPoint n Configuration 1 |
FWPnCFG1 |
0x391+8n (0≤n≤7) |
Instruction Fetch WatchPoint n Configuration 2 |
FWPnCFG2 |
0x392+8n (0≤n≤7) |
Instruction Fetch WatchPoint n Configuration 3 |
FWPnCFG3 |
0x393+8n (0≤n≤7) |
Instruction Fetch WatchPoint n Configuration 4 |
FWPnCFG4 |
0x500 |
Debug Register |
DBG |
0x501 |
Debug Exception Return Address |
DERA |
0x502 |
Debug Exception Saved Data Register |
DSAVE |
ERA, TLBRERA, MERRERA và DERA đôi khi còn được gọi là EPC, TLBREPC, MERREPC và DEPC tương ứng.
1.2. Bộ hướng dẫn cơ bản¶
1.2.1. Định dạng hướng dẫn¶
Lệnh LoongArch rộng 32 bit, thuộc 9 lệnh cơ bản định dạng (và các biến thể của chúng):
Rd là toán hạng thanh ghi đích, trong khi Rj, Rk và Ra (“a” là viết tắt của “bổ sung”) là toán hạng thanh ghi nguồn. I8/I12/I14/I16/I21/I26 là toán hạng ngay lập tức có chiều rộng tương ứng. I21 và I26 được lưu trữ càng lâu phân biệt phần trên và phần dưới trong từ lệnh, ký hiệu là chữ “L” và hậu tố “H”.
1.2.2. Danh sách hướng dẫn¶
Để ngắn gọn, chỉ có tên lệnh (ghi nhớ) được liệt kê ở đây; xin vui lòng xem ZZ0000ZZ để biết chi tiết.
Hướng dẫn tính toán:
- ADD.W SUB.W ADDI.W ADD.D SUB.D ADDI.D
SLT SLTU SLTI SLTUI AND HOẶC NOR XOR ANDN ORN ANDI ORI XORI MUL.W MULH.W MULH.WU DIV.W DIV.WU MOD.W MOD.WU MUL.D MULH.D MULH.DU DIV.D DIV.DU MOD.D MOD.DU PCADDI PCADDU12I PCADDU18I LU12I.W LU32I.D LU52I.D ADDU16I.D
Hướng dẫn dịch chuyển bit:
- SLL.W SRL.W SRA.W ROTR.W SLLI.W SRLI.W SRAI.W ROTRI.W
SLL.D SRL.D SRA.D ROTR.D SLLI.D SRLI.D SRAI.D ROTRI.D
Hướng dẫn thao tác bit:
- EXT.W.B EXT.W.H CLO.W CLO.D SLZ.W CLZ.D CTO.W CTO.D CTZ.W CTZ.D
BYTEPICK.W BYTEPICK.D BSTRINS.W BSTRINS.D BSTRPICK.W BSTRPICK.D REVB.2H REVB.4H REVB.2W REVB.D REVH.2W REVH.D BITREV.4B BITREV.8B BITREV.W BITREV.D MASKEQZ MASKNEZ
Hướng dẫn chi nhánh:
BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL
Hướng dẫn tải/lưu trữ:
- LD.B LD.BU LD.H LD.HU LD.W LD.WU LD.D ST.B ST.H ST.W ST.D
LDX.B LDX.BU LDX.H LDX.HU LDX.W LDX.WU LDX.D STX.B STX.H STX.W STX.D LDPTR.W LDPTR.D STPTR.W STPTR.D PRELD PRELDX
Hướng dẫn vận hành nguyên tử:
- LL.W SC.W LL.D SC.D
AMSWAP.W AMSWAP.D AMADD.W AMADD.D AMAND.W AMAND.D AMOR.W AMOR.D AMXOR.W AMXOR.D AMMAX.W AMMAX.D AMMIN.W AMMIN.D
Hướng dẫn rào cản:
IBAR DBAR
Hướng dẫn đặc biệt:
- SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W RDTIME.D
ASRTLE.D ASRTGT.D
Hướng dẫn đặc quyền:
- CSRRD CSRWR CSRXCHG
IOCSRRD.B IOCSRRD.H IOCSRRD.W IOCSRRD.D IOCSRWR.B IOCSRWR.H IOCSRWR.W IOCSRWR.D CACOP TLBP(TLBSRCH) TLBRD TLBWR TLBFILL TLBCLR TLBFLUSH INVTLB LDDIR LDPTE
1.3. Bộ nhớ ảo¶
LoongArch hỗ trợ bộ nhớ ảo được ánh xạ trực tiếp và bộ nhớ ảo được ánh xạ trang.
Bộ nhớ ảo được ánh xạ trực tiếp được cấu hình bởi CSR.DMWn (n=0~3), nó có cấu hình đơn giản mối quan hệ giữa địa chỉ ảo (VA) và địa chỉ vật lý (PA):
VA = PA + Offset cố định
Bộ nhớ ảo được ánh xạ trang có mối quan hệ tùy ý giữa VA và PA, trong đó được ghi lại trong TLB và các bảng trang. TLB của LoongArch bao gồm một kết hợp đầy đủ MTLB (Kích thước nhiều trang TLB) và STLB liên kết theo tập hợp (Kích thước một trang TLB).
Theo mặc định, toàn bộ không gian địa chỉ ảo của LA32 được cấu hình như sau:
Chế độ người dùng (PLV3) chỉ có thể truy cập UVRANGE. Đối với KPRANGE0 được ánh xạ trực tiếp và KPRANGE1, PA bằng VA khi bit30~31 bị xóa. Ví dụ: không được lưu vào bộ nhớ đệm VA được ánh xạ trực tiếp của 0x00001000 là 0x80001000 và được ánh xạ trực tiếp vào bộ nhớ đệm VA của 0x00001000 là 0xA0001000.
Theo mặc định, toàn bộ không gian địa chỉ ảo của LA64 được cấu hình như sau:
Chế độ người dùng (PLV3) chỉ có thể truy cập XUVRANGE. Đối với XSPRANGE được ánh xạ trực tiếp và XKPRANGE, PA bằng VA với các bit 60~63 bị xóa và thuộc tính bộ đệm được cấu hình bởi các bit 60~61 trong VA: 0 dành cho bộ đệm có thứ tự mạnh, 1 là đối với bộ nhớ đệm nhất quán và 2 dành cho bộ nhớ đệm có thứ tự yếu.
Hiện tại chúng tôi chỉ sử dụng XKPRANGE để lập bản đồ trực tiếp và XSPRANGE được bảo lưu.
Để thực hiện điều này: VA được ánh xạ trực tiếp không được lưu vào bộ đệm được sắp xếp theo thứ tự mạnh (trong XKPRANGE) của 0x00000000_00001000 là 0x80000000_00001000, bộ nhớ đệm nhất quán VA được ánh xạ trực tiếp (trong XKPRANGE) của 0x00000000_00001000 là 0x90000000_00001000, và VA được ánh xạ trực tiếp không được lưu vào bộ nhớ đệm theo thứ tự yếu (trong XKPRANGE) là 0x00000000 _00001000 là 0xA0000000_00001000.
1.4. Mối quan hệ của Loongson và LoongArch¶
LoongArch là RISC ISA khác với bất kỳ phiên bản hiện có nào khác, trong khi Loongson là một gia đình xử lý. Loongson bao gồm 3 series: Loongson-1 là dòng bộ xử lý 32-bit, Loongson-2 là dòng bộ xử lý 64-bit cấp thấp, và Loongson-3 là dòng vi xử lý 64-bit cao cấp. Old Loongson dựa trên MIPS, trong khi Loongson mới dựa trên LoongArch. Lấy Loongson-3 làm ví dụ: Loongson-3A1000/3B1500/3A2000/3A3000/3A4000 tương thích với MIPS, trong khi Loongson- 3A5000 (và các bản sửa đổi trong tương lai) đều dựa trên LoongArch.
1.5. Tài liệu tham khảo¶
Trang web chính thức của Loongson Technology Corp. Ltd.:
ZZ0000ZZ
Trang web dành cho nhà phát triển của Loongson và LoongArch (Phần mềm và Tài liệu):
ZZ0000ZZ
ZZ0000ZZ
ZZ0000ZZ
Tài liệu của LoongArch ISA:
ZZ0000ZZ (bằng tiếng Trung Quốc)
ZZ0000ZZ (bằng tiếng Anh)
Tài liệu của LoongArch ELF psABI:
ZZ0000ZZ (bằng tiếng Trung Quốc)
ZZ0000ZZ (bằng tiếng Anh)
Kho kernel Linux của Loongson và LoongArch:
ZZ0000ZZ