diff --git a/loongArch.md b/loongArch.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/loongrCore/Cargo.lock b/loongrCore/Cargo.lock
index 01d0b7b846a50fb455569b44f02efb364da74c3c..686343b2a6e6f34ba2ce8c465b134149949250d3 100644
--- a/loongrCore/Cargo.lock
+++ b/loongrCore/Cargo.lock
@@ -8,6 +8,18 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 
+[[package]]
+name = "bit_field"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
 [[package]]
 name = "lazy_static"
 version = "1.4.0"
@@ -33,8 +45,15 @@ version = "0.1.0"
 dependencies = [
  "lazy_static",
  "spin 0.9.3",
+ "uart_16550",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f"
+
 [[package]]
 name = "scopeguard"
 version = "1.1.0"
@@ -55,3 +74,32 @@ checksum = "c530c2b0d0bf8b69304b39fe2001993e267461948b890cd037d8ad4293fa1a0d"
 dependencies = [
  "lock_api",
 ]
+
+[[package]]
+name = "uart_16550"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b074eb9300ad949edd74c529c0e8d451625af71bb948e6b65fe69f72dc1363d9"
+dependencies = [
+ "bitflags",
+ "rustversion",
+ "x86_64",
+]
+
+[[package]]
+name = "volatile"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3ca98349dda8a60ae74e04fd90c7fb4d6a4fbe01e6d3be095478aa0b76f6c0c"
+
+[[package]]
+name = "x86_64"
+version = "0.14.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "958cd5cb28e720db2f59ee9dc4235b5f82a183d079fb0e6caf43ad074cfdc66a"
+dependencies = [
+ "bit_field",
+ "bitflags",
+ "rustversion",
+ "volatile",
+]
diff --git a/loongrCore/Cargo.toml b/loongrCore/Cargo.toml
index 045a1b35f60d78bdbf163190caa2590a43f4a92e..f86bd96a905e95fada10bd481ab3a8790fdfbcae 100644
--- a/loongrCore/Cargo.toml
+++ b/loongrCore/Cargo.toml
@@ -7,6 +7,7 @@ edition = "2021"
 
 [dependencies]
 spin = "0.9.2"
+uart_16550 = "0.2.16"
 
 [dependencies.lazy_static]
 version = "1.4.0"
diff --git a/loongrCore/qemu-loongarch-runenv/run_loongarch.sh b/loongrCore/qemu-loongarch-runenv/run_loongarch.sh
index d2d477f8610bf6049f8dc362f3295949111a54be..9c05e1a1585a5a0fb348e2b84fd09b0ff218ba60 100755
--- a/loongrCore/qemu-loongarch-runenv/run_loongarch.sh
+++ b/loongrCore/qemu-loongarch-runenv/run_loongarch.sh
@@ -28,7 +28,7 @@ MEM="1G"
 # 1-4
 CPUS="1"
 #BIOS="./loongarch_bios_0310.bin"
-BIOS="./loongarch_bios_0310_debug.bin"
+BIOS="./loongarch_bios_0310.bin"
 KERNEL="./vmlinux"
 INITRD="busybox-rootfs.img"
 USE_GRAPHIC="no"
diff --git a/loongrCore/src/boot.S b/loongrCore/src/boot.S
index ecb3d2ae873ddabd45a46a3317ed47066f1451c4..592dbf537fcfc494d221dd15c857380749655abb 100644
--- a/loongrCore/src/boot.S
+++ b/loongrCore/src/boot.S
@@ -12,7 +12,6 @@ _start:
     csrwr $t0,0x181 #LOONGARCH_CSR_DMWIN1
 1:
     la.global $t0, _bss_start
-    #st.d $zero, $t0,0
     la.global $t1, _bss_end
     bgeu $t0, $t1, 3f   #bge如果前者大于等于后者则跳转
 2:
diff --git a/loongrCore/src/config.rs b/loongrCore/src/config.rs
index e2e598b120b5a5c404e40ca70e90546106dc64cc..14129f3d850fd3b2b9d68ae9c45fcc3d5fa95ba2 100644
--- a/loongrCore/src/config.rs
+++ b/loongrCore/src/config.rs
@@ -15,15 +15,3 @@ const LOONGARCH_CSR_DMWIN0: u32 = 0x180;
 const LOONGARCH_CSR_DMWIN1: u32 = 0x181;
 const LOONGARCH_CSR_DMWIN2: u32 = 0x182;
 const LOONGARCH_CSR_DMWIN3: u32 = 0x183;
-
-const DMW_PABITS:usize = 48;
-const CSR_DMW0_PLV0:usize = 1 << 0;
-const CSR_DMW0_VSEG:usize = 0x8000;
-const CSR_DMW0_BASE:usize = CSR_DMW0_VSEG << DMW_PABITS;
-const CSR_DMW0_INIT	:usize=	CSR_DMW0_BASE | CSR_DMW0_PLV0;
-
-const CSR_DMW1_PLV0:usize = 1 << 0;
-const CSR_DMW1_MAT:usize = 1 << 4;
-const CSR_DMW1_VSEG:usize = 0x9000;
-const CSR_DMW1_BASE:usize = CSR_DMW0_VSEG << DMW_PABITS;
-const CSR_DMW1_INIT	:usize=	CSR_DMW1_BASE|CSR_DMW1_MAT | CSR_DMW1_PLV0;
\ No newline at end of file
diff --git a/loongrCore/src/loong_arch/mod.rs b/loongrCore/src/loong_arch/mod.rs
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/loongrCore/src/main.rs b/loongrCore/src/main.rs
index 662af00950e2ba6c585d31785cc0c606ccff8e06..7e6e9c09ba560fdc2083c03c27aaf03753ff49e4 100644
--- a/loongrCore/src/main.rs
+++ b/loongrCore/src/main.rs
@@ -10,21 +10,24 @@ mod uart;
 mod print;
 mod lang_items;
 mod test;
+mod loong_arch;
 
+use uart_16550::MmioSerialPort;
 use config::FLAG;
 use core::arch::{global_asm};
 use crate::print::get_char;
 use test::color_output_test;
+use crate::config::UART;
+use crate::uart::Uart;
 
 global_asm!(include_str!("boot.S"));
 #[no_mangle]
 pub extern "C" fn main(){
     INFO!("{}",FLAG);
     color_output_test();
-    scanf();
+    panic!();
 }
 
-
 fn scanf(){
     const LF: u8 = 10; //换行键
     const CR: u8 = 13; //回车键
diff --git a/manual.md b/manual.md
new file mode 100644
index 0000000000000000000000000000000000000000..9fec9b9227265d92471e789f3a33344fd7c87d04
--- /dev/null
+++ b/manual.md
@@ -0,0 +1,158 @@
+# 实验手册
+
+实验手册用于记录实验过程中学习的相关知识和遇到的问题与解决方法
+
+[TOC]
+
+## UEFI与BIOS
+
+BIOS(Basic Input/Output System),即基本输入输出系统,亦称为ROM BIOS、System BIOS、PC BIOS,是在通电启动阶段执行硬件初始化,以及为操作系统提供运行时服务的固件。以前的BIOS主要位于ROM上,现在则主要位于flash中。其主要执行的任务有
+
+- 自检程序,用于检测硬件
+- 初始化系统的处理器核、内存、外设等在内的各个部分
+- 基本的I/O处理
+- 外设驱动管理
+
+在计算机按下电源键开机后,cpu将会跳转到某个固定的位置,即BIOS所在的位置,然后开始执行此位置的代码完成上述功能,在执行无误后,就会跳转到可以引导操作系统启动的Bootloader部分。
+
+UEFI(Unified Extensible Firmware Interface)中文统一可扩展固件接口,UEFI主要定义了操作系统和平台固件之间的接口,UEFI只是一种标准,具体的实现由其他公司或开源组成提供。UEFI与BIOS显著的区别就是UEFI是用模块化,C语言风格的参数堆栈传递方式,动态链接的形式构建的系统,较BIOS而言更易于实现,容错和纠错特性更强,缩短了系统研发的时间。两者在完成的功能上是大同小异的。
+
+UEFI系统从加电到关机分为7个阶段
+
+- SEC(安全验证)
+- PEI(EIF前期初始化)
+- DXE(驱动执行环境)
+- BDS(启动设备选择)
+- TSL(操作系统前期加载)
+- RT(运行时)
+- AL(系统灾难恢复期)
+
+
+
+## 操作系统的启动过程示意图
+
+龙芯平台上的操作系统启动过程
+
+![image-20220510212716244](sourcepicture/image-20220510212716244.png)
+
+
+
+UEFI bios装载内核时,会把从内核elf文件获取的入口点地址(可以用readelf -h或者-l vmlinux看到)抹去高32位使用。比如vmlinux链接的地址是0x9000000001034804,实际bios跳转的地址将是0x1034804,代码装载的位置也是物理内存0x1034804。BIOS这么做是因为它逻辑上相当于用物理地址去访问内存,高的虚拟地址空间没有映射不能直接用。
+
+内核启动入口代码需要做两件事:
+
+1. 设置一个直接地址映射窗口,把内核用到的64地址抹去高位映射到物理内存。目前linux内核是设置0x8000xxxx-xxxxxxxx和0x9000xxxx-xxxxxxxx地址抹去最高的8和9为其物理地址,前者用于uncache访问(即不通过高速缓存去load/store),后者用于cache访问。
+2. 做个代码自跳转,使得后续代码执行的PC和链接用的虚拟地址匹配。BIOS刚跳转到内核时,用的地址是抹去了高32位的地址(相当于物理地址),步骤1使得链接时的高地址可以访问到同样的物理内存,这里则换回到原始的虚拟地址。
+
+在linux源代码中可以得到入口代码如下所示:
+
+```gas
+SYM_CODE_START(kernel_entry)			# kernel entry point
+	la.abs		t0, 0f
+	jirl		zero, t0, 0 
+0:
+	la		t0, __bss_start		# clear .bss
+	st.d		zero, t0, 0
+	la		t1, __bss_stop - LONGSIZE
+1:
+	addi.d		t0, t0, LONGSIZE
+	st.d		zero, t0, 0
+	bne		t0, t1, 1b
+
+	#设置直接地址映射窗口
+	li.d		t0, CSR_DMW0_INIT	# UC, PLV0, 0x8000 xxxx xxxx xxxx
+	csrwr		t0, LOONGARCH_CSR_DMWIN0
+	li.d		t0, CSR_DMW1_INIT	# CA, PLV0, 0x9000 xxxx xxxx xxxx
+	csrwr		t0, LOONGARCH_CSR_DMWIN1
+	#开启页表
+	li.w		t0, 0xb0		# PLV=0, IE=0, PG=1
+	csrwr		t0, LOONGARCH_CSR_CRMD
+	li.w		t0, 0x04		# PLV=0, PIE=1, PWE=0
+	csrwr		t0, LOONGARCH_CSR_PRMD
+	li.w		t0, 0x00		# FPE=0, SXE=0, ASXE=0, BTE=0
+	csrwr		t0, LOONGARCH_CSR_EUEN
+
+	#设置栈空间
+	PTR_LI		sp, (_THREAD_SIZE - 32 - PT_SIZE)
+	PTR_ADDU	sp, sp, tp
+	set_saved_sp	sp, t0, t1
+	PTR_ADDIU	sp, sp, -4 * SZREG	# init stack pointer
+
+	#跳转到内核入口
+	bl		start_kernel
+
+SYM_CODE_END(kernel_entry)
+```
+
+虽然得到了入口代码,但此代码不能直接copy到rust的实现中,因为上面的代码中包含了许多宏定义,而且这里可以使用的指令在rust中也并不能使用,因此我们需要将得到的可执行文件反汇编,得到原始的汇编代码。使用命令
+
+```
+loongarch64-unknown-linux-gnu-objdump -d vmlinux > linux.S
+```
+
+通过查找linux内核代码相关文件,找到了CSR_DMW0_INIT的相关定义,其值为0x180,也即是DMW0寄存器的地址。因此可以在汇编代码中查找0x180所在位置,得到设置映射窗口的相关代码:
+
+```
+#初始化bss段
+90000000010347f4:       1c00d68c        pcaddu12i       $t0, 1716(0x6b4)
+90000000010347f8:       02d7318c        addi.d          $t0, $t0, 1484(0x5cc)
+90000000010347fc:       28c1e184        ld.d            $a0, $t0, 120(0x78)
+9000000001034800:       4c000020        jirl            $zero, $ra, 0
+9000000001034804:       1402068c        lu12i.w         $t0, 4148(0x1034)
+9000000001034808:       03a0618c        ori             $t0, $t0, 0x818
+900000000103480c:       1600000c        lu32i.d         $t0, 0
+9000000001034810:       0324018c        lu52i.d         $t0, $t0, -1792(0x900)
+9000000001034814:       4c000180        jirl            $zero, $t0, 0
+9000000001034818:       1c00c76c        pcaddu12i       $t0, 1595(0x63b)
+900000000103481c:       02dfa18c        addi.d          $t0, $t0, 2024(0x7e8)
+9000000001034820:       29c00180        st.d            $zero, $t0, 0
+9000000001034824:       1c00e7ad        pcaddu12i       $t1, 1853(0x73d)
+9000000001034828:       02fcf1ad        addi.d          $t1, $t1, -196(0xf3c)
+
+#bne if t0 < t1 则跳转
+#st.d 将 zero的内容写入内存中,内存地址由 t0+(0符号扩展)
+900000000103482c:       02c0218c        addi.d          $t0, $t0, 8(0x8)
+9000000001034830:       29c00180        st.d            $zero, $t0, 0
+9000000001034834:       5ffff98d        bne             $t0, $t1, -8(0x3fff8)
+
+#设置映射窗口
+9000000001034868:       0380040c        ori             $t0, $zero, 0x1
+900000000103486c:       0320018c        lu52i.d         $t0, $t0, -2048(0x800)
+9000000001034870:       0406002c        csrwr           $t0, 0x180
+9000000001034874:       0380440c        ori             $t0, $zero, 0x11
+9000000001034878:       0324018c        lu52i.d         $t0, $t0, -1792(0x900)
+900000000103487c:       0406042c        csrwr           $t0, 0x181
+```
+
+综合以上信息并查找相关资料,我们重写得到的内核入口代码如下所示:
+
+```
+.section .text.init
+.global _start
+
+_start:
+0:
+    #设置映射窗口
+    ori $t0, $zero,0x1
+    lu52i.d $t0, $t0, -2048 #加载立即数
+    csrwr $t0,0x180  #设置LOONGARCH_CSR_DMWIN0 #特权指令用于交换两个寄存器内容
+    ori $t0, $zero,0x11
+    lu52i.d $t0, $t0, -1792
+    csrwr $t0,0x181 #LOONGARCH_CSR_DMWIN1
+1:
+    la.global $t0, _bss_start
+    la.global $t1, _bss_end
+    bgeu $t0, $t1, 3f   #bge如果前者大于等于后者则跳转
+2:
+    st.d $zero, $t0,0
+    addi.d $t0, $t0, 8
+    bltu $t0, $t1, 2b
+3:
+    la.global $sp, _stack # _stack 在linker.ld文件中分配,这里用于分配栈空间
+    bl main #跳转到main入口开始执行
+```
+
+在实验中,需要使用串口打印信息以便于后期实验,在rCore第一章中使用的是SBI提高的运行时服务,这里由于调用UEFI提供的服务比较困难,因此我们尝试了使用uart_16550库提供的接口,但发现并不能正常使用,因此这里实现了一个简单的uart模块。在使用我们编写的串口输出后,可以正常显示和输入
+
+![image-20220510221257744](sourcepicture/image-20220510221257744.png)
+
diff --git a/sourcepicture/image-20220510212716244.png b/sourcepicture/image-20220510212716244.png
new file mode 100644
index 0000000000000000000000000000000000000000..91042448c191640d911df499a0bd537b96361900
Binary files /dev/null and b/sourcepicture/image-20220510212716244.png differ
diff --git a/sourcepicture/image-20220510221257744.png b/sourcepicture/image-20220510221257744.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9df81bf733a977a5d2af0a450ba2b81b64cd79c
Binary files /dev/null and b/sourcepicture/image-20220510221257744.png differ