From cf167deb92856ff3bfb7f2452238e09c362a1289 Mon Sep 17 00:00:00 2001 From: Jiajie Chen Date: Wed, 29 Jun 2022 00:46:22 +0800 Subject: [PATCH] Format spaces --- kernel/kern/evec.S | 6 +- kernel/kern/init.S | 67 ++++++++++----- kernel/kern/shell.S | 197 ++++++++++++++++++++++++++++---------------- kernel/kern/test.S | 21 ++--- kernel/kern/trap.S | 29 +++++-- 5 files changed, 206 insertions(+), 114 deletions(-) diff --git a/kernel/kern/evec.S b/kernel/kern/evec.S index 1de8d38..73205a9 100755 --- a/kernel/kern/evec.S +++ b/kernel/kern/evec.S @@ -1,6 +1,8 @@ -// 监控程序的入口点,.text.init 段放在内存的 0x80000000 位置,是最先执行的代码。 .p2align 2 .section .text.init -INITLOCATE: // 定位启动程序 + // 监控程序的入口点,是最先执行的代码 + // .text.init 段放在内存的 0x80000000 位置 +INITLOCATE: + // 跳转到 init.S:START la s10, START jr s10 diff --git a/kernel/kern/init.S b/kernel/kern/init.S index d046e4f..a4d678f 100755 --- a/kernel/kern/init.S +++ b/kernel/kern/init.S @@ -4,11 +4,15 @@ .section .bss .p2align 2 - .global TCBT // thread control block table + + // TCBT = Thread Control Block Table + .global TCBT TCBT: .dword 0 .dword 0 - .global current // current thread TCB address + + // 当前线程 TCB 地址 + .global current current: .dword 0 @@ -18,27 +22,34 @@ current: .global PAGE_TABLE // 一个页 4096 字节 = 2^12 .p2align 12 - // 预留空间,之后的代码里进行初始化 + // 预留空间,在之后的代码里进行初始化 PAGE_TABLE: .rept 1024 .long 0 .endr + + // RV64 的 Sv39 下页表比 Sv32 多了一级 #ifdef RV64 PAGE_TABLE_2: .rept 1024 .long 0 .endr #endif + + // 用户代码的页表 PAGE_TABLE_USER_CODE: .rept 1024 .long 0 .endr + #ifdef RV64 PAGE_TABLE_USER_CODE_2: .rept 1024 .long 0 .endr #endif + + // 内核代码的页表 PAGE_TABLE_KERNEL_CODE: #ifdef RV32 .long 0x200000fb // 0x80000000 -> 0x80000000 DAGUX-RV @@ -56,6 +67,8 @@ PAGE_TABLE_KERNEL_CODE: .dword 0 .endr #endif + + // 用户栈的页表 PAGE_TABLE_USER_STACK: .rept 1024 .long 0 @@ -72,8 +85,8 @@ PAGE_TABLE_USER_STACK_3: .endr #endif - // 启动时输出的信息 .section .rodata + // 启动时输出的信息 monitor_version: .asciz "MONITOR for RISC-V - initialized." @@ -108,8 +121,9 @@ bss_init_done: csrw mtvec, s0 mtvec_done: + // 打开时钟中断 li t0, MIE_MTIE - csrw mie, t0 // 打开时钟中断 + csrw mie, t0 #endif // 设置内核栈 @@ -141,7 +155,7 @@ mtvec_done: li t1, COM_LCR_CONFIG sb t1, %lo(COM_LCR_OFFSET)(t0) sb x0, %lo(COM_MCR_OFFSET)(t0) - // 开串口中断 + // 打开串口中断 li t1, COM_IER_RDI sb t1, %lo(COM_IER_OFFSET)(t0) #endif @@ -158,24 +172,31 @@ mtvec_done: la t0, TCBT STORE sp, 0(t0) - mv t6, sp // t6保存idle中断帧位置 + // t6 保存 idle 中断帧位置 + mv t6, sp + // 初始化栈空间 li t0, TF_SIZE .LC1: - addi t0, t0, -XLEN // 滚动计数器 - addi sp, sp, -XLEN // 移动栈指针 - STORE zero, 0(sp) // 初始化栈空间 - bne t0, zero, .LC1 // 初始化循环 + addi t0, t0, -XLEN + addi sp, sp, -XLEN + STORE zero, 0(sp) + bne t0, zero, .LC1 - la t0, TCBT // 载入TCBT地址 - STORE sp, XLEN(t0) // thread1(shell/user)的中断帧地址设置 - STORE sp, TF_sp(t6) // 设置idle线程栈指针(调试用?) + // 载入TCBT地址 + la t0, TCBT + // thread1(shell/user) 的中断帧地址设置 + STORE sp, XLEN(t0) + // 设置 idle 线程栈指针(调试用?) + STORE sp, TF_sp(t6) + // 取得 thread1 的 TCB 地址 la t2, TCBT + XLEN - LOAD t2, 0(t2) // 取得thread1的TCB地址 + LOAD t2, 0(t2) #ifdef ENABLE_INT - csrw mscratch, t2 // 设置当前线程为thread1 + // 设置当前线程为 thread1 + csrw mscratch, t2 #endif la t1, current @@ -183,10 +204,10 @@ mtvec_done: #ifdef ENABLE_PAGING #ifdef RV32 - // 一级页表,PAGE_TABLE 为一级页表 + // Sv32 是两级页表,PAGE_TABLE 为一级页表 la t0, PAGE_TABLE #else - // 三级页表,PAGE_TABLE 为一级页表,PAGE_TABLE_2为二级页表 + // Sv39 是三级页表,PAGE_TABLE 为一级页表,PAGE_TABLE_2为二级页表 la t0, PAGE_TABLE_2 la t1, PAGE_TABLE srli t0, t0, 2 @@ -330,6 +351,7 @@ mtvec_done: sw t1, 0(t2) #endif + // 让页表生效 la t0, PAGE_TABLE srli t0, t0, 12 #ifdef RV32 @@ -359,10 +381,13 @@ mtvec_done: #endif #endif - j WELCOME // 进入主线程 + // 进入主线程 + j WELCOME WELCOME: - la a0, monitor_version // 装入启动信息 + // 装入启动信息并打印 + la a0, monitor_version jal WRITE_SERIAL_STRING - j SHELL // 开始交互 \ No newline at end of file + // 开始交互 + j SHELL \ No newline at end of file diff --git a/kernel/kern/shell.S b/kernel/kern/shell.S index a3330be..c4e3693 100755 --- a/kernel/kern/shell.S +++ b/kernel/kern/shell.S @@ -15,12 +15,14 @@ uregs: /* * SHELL: 监控程序交互模块 * - * 用户空间寄存器:x1-x31依次保存在0x807F0000连续124字节 + * 用户空间寄存器:x1-x31依次保存在 0x807F0000 连续 124 字节 * 用户程序入口临时存储:0x807F0000 */ SHELL: - jal READ_SERIAL // 读操作符 + // 读操作符 + jal READ_SERIAL + // 根据操作符进行不同的操作 li t0, 'R' beq a0, t0, .OP_R li t0, 'D' @@ -32,11 +34,15 @@ SHELL: li t0, 'T' beq a0, t0, .OP_T - li a0, XLEN // 错误的操作符,输出 XLEN,用于区分 RV32 和 RV64 - jal WRITE_SERIAL // 把 XLEN 写给 term - j .DONE + // 错误的操作符,输出 XLEN,用于区分 RV32 和 RV64 + li a0, XLEN + // 把 XLEN 写给 term + jal WRITE_SERIAL + j .DONE -.OP_T: // 操作 - 打印页表 +.OP_T: + // 操作 - 打印页表 + // 保存寄存器 addi sp, sp, -3*XLEN STORE s1, 0(sp) STORE s2, XLEN(sp) @@ -51,96 +57,130 @@ SHELL: addi s1, sp, 2*XLEN li s2, XLEN .LC0: - lb a0, 0(s1) // 读取字节 - addi s2, s2, -1 // 滚动计数器 - jal WRITE_SERIAL // 写入串口 - addi s1, s1, 0x1 // 移动打印指针 - bne s2, zero, .LC0 // 打印循环 - + // 读取内存并写入串口 + lb a0, 0(s1) + addi s2, s2, -1 + jal WRITE_SERIAL + addi s1, s1, 0x1 + bne s2, zero, .LC0 + + // 恢复寄存器 LOAD s1, 0x0(sp) LOAD s2, XLEN(sp) addi sp, sp, 3*XLEN j .DONE -.OP_R: // 操作 - 打印用户空间寄存器 - addi sp, sp, -2*XLEN // 保存s1,s2 +.OP_R: + // 操作 - 打印用户空间寄存器 + // 保存 s1, s2 + addi sp, sp, -2*XLEN STORE s1, 0(sp) STORE s2, XLEN(sp) + // 打印 31 个寄存器 la s1, uregs - li s2, 31*XLEN // 计数器,打印 31 个寄存器 + li s2, 31*XLEN .LC1: - lb a0, 0(s1) // 读取字节 - addi s2, s2, -1 // 滚动计数器 - jal WRITE_SERIAL // 写入串口 - addi s1, s1, 0x1 // 移动打印指针 - bne s2, zero, .LC1 // 打印循环 - - LOAD s1, 0(sp) // 恢复s1,s2 + // 读取内存并写入串口 + lb a0, 0(s1) + addi s2, s2, -1 + jal WRITE_SERIAL + addi s1, s1, 0x1 + bne s2, zero, .LC1 + + // 恢复s1,s2 + LOAD s1, 0(sp) LOAD s2, XLEN(sp) addi sp, sp, 2*XLEN j .DONE -.OP_D: // 操作 - 打印内存num字节 - addi sp, sp, -2*XLEN // 保存s1,s2 +.OP_D: + // 操作 - 打印内存 num 个字节 + // 保存 s1, s2 + addi sp, sp, -2*XLEN STORE s1, 0(sp) STORE s2, XLEN(sp) + // 获得 addr jal READ_SERIAL_XLEN - or s1, a0, zero // 获得addr + or s1, a0, zero + // 获得 num jal READ_SERIAL_XLEN - or s2, a0, zero // 获得num + or s2, a0, zero .LC2: - lb a0, 0(s1) // 读取字节 - addi s2, s2, -1 // 滚动计数器 - jal WRITE_SERIAL // 写入串口 - addi s1, s1, 0x1 // 移动打印指针 - bne s2, zero, .LC2 // 打印循环 - - LOAD s1, 0(sp) // 恢复s1,s2 + // 读取内存并写入串口 + lb a0, 0(s1) + addi s2, s2, -1 + jal WRITE_SERIAL + addi s1, s1, 0x1 + bne s2, zero, .LC2 + + // 恢复 s1, s2 + LOAD s1, 0(sp) LOAD s2, XLEN(sp) addi sp, sp, 2*XLEN j .DONE -.OP_A: // 操作 - 写入内存num字节,num为4的倍数 - addi sp, sp, -2*XLEN // 保存s1,s2 +.OP_A: + // 操作 - 写入内存 num 字节,num 为 4 的倍数 + // 保存 s1, s2 + addi sp, sp, -2*XLEN STORE s1, 0(sp) STORE s2, 4(sp) + // 获得 addr jal READ_SERIAL_XLEN - or s1, a0, zero // 获得addr + or s1, a0, zero + + // 获得 num jal READ_SERIAL_XLEN - or s2, a0, zero // 获得num - srl s2, s2, 2 // num除4,获得字数 -.LC3: // 每次写入一字 - jal READ_SERIAL_WORD // 从串口读入一字 - sw a0, 0(s1) // 写内存一字 - addi s2, s2, -1 // 滚动计数器 - addi s1, s1, 4 // 移动写指针 - bne s2, zero, .LC3 // 写循环 + or s2, a0, zero + + // num 除 4,获得字数 + srl s2, s2, 2 + +.LC3: + // 每次写入一字 + // 从串口读入一字 + jal READ_SERIAL_WORD + // 写内存一字 + sw a0, 0(s1) + addi s2, s2, -1 + addi s1, s1, 4 + bne s2, zero, .LC3 #ifdef ENABLE_FENCEI - fence.i // 有 Cache 时让写入的代码生效 + // 有 Cache 时让写入的代码生效 + fence.i #endif - LOAD s1, 0(sp) // 恢复s1,s2 + // 恢复 s1, s2 + LOAD s1, 0(sp) LOAD s2, XLEN(sp) addi sp, sp, 2*XLEN j .DONE .OP_G: - jal READ_SERIAL_XLEN // 获取addr - mv s10, a0 // 保存到 s10 + // 操作 - 跳转到用户程序执行 + // 获取 addr + jal READ_SERIAL_XLEN + // 保存到 s10 + mv s10, a0 - li a0, SIG_TIMERSET // 写开始计时信号 - jal WRITE_SERIAL // 告诉终端用户程序开始运行 + // 写开始计时信号 + // 告诉终端用户程序开始运行 + li a0, SIG_TIMERSET + jal WRITE_SERIAL #ifdef ENABLE_INT - csrw mepc, s10 // 用户程序入口写入EPC + // 用户程序入口写入EPC + csrw mepc, s10 + + // 设置 MPP=0,对应 U-mode li a0, MSTATUS_MPP_MASK - csrc mstatus, a0 // 设置 MPP=0,对应 U-mode + csrc mstatus, a0 // 设置时钟中断,用于检测运行超时 #ifdef RV64 @@ -165,9 +205,12 @@ SHELL: #endif - la ra, uregs // 定位用户空间寄存器备份地址 - STORE sp, TF_ksp(ra) // 保存栈指针 + // 定位用户空间寄存器备份地址 + la ra, uregs + // 保存栈指针 + STORE sp, TF_ksp(ra) + // x1 就是 ra // LOAD x1, TF_ra(ra) LOAD sp, TF_sp(ra) LOAD gp, TF_gp(ra) @@ -193,6 +236,7 @@ SHELL: LOAD s7, TF_s7(ra) LOAD s8, TF_s8(ra) LOAD s9, TF_s9(ra) + // s10 用来保存用户程序地址 // LOAD s10, TF_s10(ra) LOAD s11, TF_s11(ra) LOAD t3, TF_t3(ra) @@ -202,10 +246,13 @@ SHELL: .ENTER_UESR: #ifdef ENABLE_INT - la ra, .USERRET_USER // ra写入返回地址 - mret // 进入用户程序 + // ra 写入返回地址 + la ra, .USERRET_USER + // 进入用户程序 + mret #else - la ra, .USERRET2 // ra写入返回地址 + // ra 写入返回地址 + la ra, .USERRET2 jr s10 #endif @@ -215,35 +262,43 @@ SHELL: .global USERRET_TIMEOUT USERRET_TIMEOUT: - li a0, SIG_TIMEOUT // 发送超时信号 - jal WRITE_SERIAL // 告诉终端用户程序结束运行 + // 发送超时信号 + // 告诉终端用户程序结束运行 + li a0, SIG_TIMEOUT + jal WRITE_SERIAL j 0f .global USERRET_MACHINE USERRET_MACHINE: - li a0, SIG_TIMETOKEN // 发送停止计时信号 - jal WRITE_SERIAL // 告诉终端用户程序结束运行 + // 发送停止计时信号 + // 告诉终端用户程序结束运行 + li a0, SIG_TIMETOKEN + jal WRITE_SERIAL + // 复制寄存器数据 0: la s1, uregs - li s2, TF_SIZE // 计数器 + li s2, TF_SIZE .LC4: lw a0, 0(sp) sw a0, 0(s1) - addi s2, s2, -4 // 滚动计数器 + addi s2, s2, -4 addi s1, s1, 0x4 addi sp, sp, 0x4 bne s2, zero, .LC4 + // 重新获得当前监控程序栈顶指针 la s1, uregs - LOAD sp, TF_ksp(s1) // 重新获得当前监控程序栈顶指针 + LOAD sp, TF_ksp(s1) j .DONE #endif .USERRET2: - la ra, uregs // 定位用户空间寄存器备份地址 + // 定位用户空间寄存器备份地址 + la ra, uregs + // 不能先恢复 ra //STORE ra, TF_ra(ra) STORE sp, TF_sp(ra) STORE gp, TF_gp(ra) @@ -276,15 +331,19 @@ USERRET_MACHINE: STORE t5, TF_t5(ra) STORE t6, TF_t6(ra) - LOAD sp, TF_ksp(ra) // 重新获得当前监控程序栈顶指针 + // 重新获得当前监控程序栈顶指针 + LOAD sp, TF_ksp(ra) mv a0, ra la ra, .USERRET2 STORE ra, TF_ra(a0) - li a0, SIG_TIMETOKEN // 发送停止计时信号 - jal WRITE_SERIAL // 告诉终端用户程序结束运行 + // 发送停止计时信号 + li a0, SIG_TIMETOKEN + // 告诉终端用户程序结束运行 + jal WRITE_SERIAL j .DONE .DONE: - j SHELL // 交互循环 + // 交互循环 + j SHELL diff --git a/kernel/kern/test.S b/kernel/kern/test.S index 10b6c0e..d8ccb90 100755 --- a/kernel/kern/test.S +++ b/kernel/kern/test.S @@ -9,10 +9,8 @@ #define TESTLOOP64 0x04000000 /* 64M约6.7千万次 */ #define TESTLOOP32 0x02000000 /* 32M约3.4千万次 */ #define TESTLOOP16 0x01000000 /* 16M约1.7千万次 */ - - //.set noreorder - //.set noat + .section .text.utest .p2align 2 @@ -20,13 +18,12 @@ UTEST_SIMPLE: addi t5, t5, 0x1 jr ra -/* 性能标定程序(1) + /* 性能标定程序(1) * 这段程序一般没有数据冲突和结构冲突,可作为性能标定。 - * 若执行延迟槽,执行这段程序需至少384M指令,384M/time可算得频率。 - * 不执行延迟槽,执行这段程序需至少320M指令,320M/time可算得频率。 + * 执行这段程序需至少 384M 指令,384M/time 可算得频率。 */ UTEST_1PTB: - li t0, TESTLOOP64 // 装入64M + li t0, TESTLOOP64 // 装入 64M .LC0: addi t0, t0, -1 // 滚动计数器 li t1, 0 @@ -37,8 +34,7 @@ UTEST_1PTB: /* 运算数据冲突的效率测试(2) * 这段程序含有大量数据冲突,可测试数据冲突对效率的影响。 - * 执行延迟槽,执行这段程序需至少192M指令。 - * 不执行延迟槽,执行这段程序需至少176M指令。 + * 执行这段程序需至少 192M 指令。 */ UTEST_2DCT: lui t0, %hi(TESTLOOP16) // 装入16M @@ -61,8 +57,7 @@ UTEST_2DCT: /* 控制指令冲突测试(3) * 这段程序有大量控制冲突。 - * 无延迟槽执行需要至少256M指令; - * 有延迟槽需要224M指令。 + * 执行需要至少 256M 指令。 */ UTEST_3CCT: lui t0, %hi(TESTLOOP64) // 装入64M @@ -78,8 +73,7 @@ UTEST_3CCT: /* 访存相关数据冲突测试(4) * 这段程序反复对内存进行有数据冲突的读写。 - * 不执行延迟槽需要至少192M指令。 - * 执行延迟槽,需要至少224M指令。 + * 需要至少执行 192M 指令。 */ UTEST_4MDCT: lui t0, %hi(TESTLOOP32) // 装入32M @@ -91,6 +85,7 @@ UTEST_4MDCT: sw t1, 0(sp) lw t0, 0(sp) bne t0, zero, .LC3 + addi sp, sp, 4 jr ra diff --git a/kernel/kern/trap.S b/kernel/kern/trap.S index a7f2b27..97fd115 100644 --- a/kernel/kern/trap.S +++ b/kernel/kern/trap.S @@ -6,10 +6,12 @@ #ifdef ENABLE_INT EXCEPTION_HANDLER: - csrrw sp, mscratch, sp // 交换 mscratch 和 sp ,保存上下文 + // 交换 mscratch 和 sp ,保存上下文 + csrrw sp, mscratch, sp STORE ra, TF_ra(sp) - csrrw ra, mscratch, sp // 读出原来的 sp + // 读出原来的 sp + csrrw ra, mscratch, sp STORE ra, TF_sp(sp) STORE gp, TF_gp(sp) STORE tp, TF_tp(sp) @@ -43,6 +45,7 @@ EXCEPTION_HANDLER: csrr t0, mepc STORE t0, TF_epc(sp) + // 根据 mcause 调用不同的异常处理例程 csrr t0, mcause li t1, EX_INT_FLAG | EX_INT_MODE_MACHINE | EX_INT_TYPE_TIMER beq t1, t0, .HANDLE_TIMER @@ -81,11 +84,15 @@ EXCEPTION_HANDLER: j FATAL .HANDLE_TIMER: + // 读取 mstatus.MPP csrr t0, mstatus li t1, MSTATUS_MPP_MASK - and t0, t0, t1 // 读取 mstatus.MPP - bne t0, zero, CONTEXT_SWITCH // 来自 M 态的中断,直接返回 - j USERRET_TIMEOUT // 处理用户程序超时 + and t0, t0, t1 + // 来自 M 态的中断,直接返回 + bne t0, zero, CONTEXT_SWITCH + + // 处理用户程序超时 + j USERRET_TIMEOUT CONTEXT_SWITCH: LOAD t0, TF_epc(sp) @@ -141,9 +148,12 @@ EXCEPTION_HANDLER: j HALT #endif -FATAL: // 严重问题,重启 - li a0, SIG_FATAL // 错误信号 - jal WRITE_SERIAL // 发送 +FATAL: + // 严重问题,重启 + // 错误信号 + li a0, SIG_FATAL + // 发送 + jal WRITE_SERIAL #ifdef ENABLE_INT csrrs a0, mepc, zero @@ -159,5 +169,6 @@ FATAL: // 严重问题,重启 jal WRITE_SERIAL_XLEN #endif - la a0, START // 重启地址 + // 重启地址 + la a0, START jr a0