
Northwestern Polytechnical University, entri Hadiah Pertama (Tanpa Hadiah Khusus) untuk "Kompetisi Kemampuan Sistem Komputer Mahasiswa Nasional - Kompetisi Desain Sistem Operasi (Nasional) - Lagu realisasi kernel OS Loongson LA2K1000 Points Track".
Sumber Nama Tim: Npucore yang berpengaruh, tiga tanda seru mewakili tiga anggota.
Kapten yang dibawa pergi: [desain kernel dan adaptasi/dokumen] yixu feng ([email protected])
Pemain Super: [Pakar Debug] Yifei Zhang ([email protected]), [Master Perangkat Keras] Hanchen Zhang ([email protected]), [Dukungan Luar Ladang] Huan Guo (Blog Pribadi)
Kepada para siswa dari Universitas Teknologi Xi'an atau sekolah lain yang berpartisipasi dalam kompetisi OS di jalur Loongson: Jika Anda melihat gudang ini, itu berarti Anda telah menemukan lokasi yang tepat. Ini adalah gudang paling asli dari npucore-dampak kami, yang merupakan versi plus berdasarkan NPUcore+LA (kami kemudian merekonstruksi versi baru, tetapi tidak dapat ditemukan di gudang ini). Cabang NPUcore-FF dari repositori ini adalah cabang skor penuh pertama kami (sistem file fat32 ), dan cabang ext4 adalah cabang eksperimental yang kami beradaptasi dengan sistem file ext4 di final, tetapi harap dicatat bahwa cabang ext4 tidak dapat berjalan karena ini bukan versi final dari debug kami !
Keputusan kode untuk tahap akhir dari final kami (pertandingan online + tahap kedua) tidak sepenuhnya diumumkan kepada publik karena kami membuat banyak penyesuaian dalam lima belas hari sebelum final, seperti: berhasil beradaptasi ext4 dan menambahkan banyak syscall baru ... tetapi harganya low-nya. Karena itu, kami hanya mengungkapkan gudang asli ini secara terbuka untuk referensi Anda. Berikut adalah tautan referensi yang saya rekomendasikan:
Jika Anda ingin menggunakan versi rust dari LA Arch crate , silakan merujuk ke: NPUCORE-LA2K1000-Arch
Jika Anda ingin tahu tentang proses debug kompetisi pendahuluan kami, silakan merujuk ke: LA Perbaikan Tes Kompetisi Pendahuluan
Jika Anda ingin tahu apa yang kami lakukan di fase pertama final, silakan merujuk ke: Finals Fase 1 Dokumentasi
Jika Anda ingin tahu apa yang membedakan versi akhir NPUcore-IMPACT dari orang lain, silakan merujuk ke: pertahanan akhir
Jika Anda ingin tahu apa yang kami lakukan di kompetisi langsung, silakan merujuk ke: kompetisi langsung
Jika Anda ingin tahu bagaimana kami akhirnya bertahan, silakan merujuk ke: draft final
Jika Anda ingin menggunakan dan memodifikasi logo kami (perlu mempelajari cara menggunakan AE), silakan merujuk ke: Logo
Jika Anda mengalami kesulitan yang tidak kami sebutkan selama debug, silakan merujuk ke: 2024 hadiah kedua: npucore-rebirth: Saya seorang caigou, 2022 hadiah pertama: riscv asli npucore, 2023 hadiah kedua-npucore+la
Jika Anda ingin mempelajari proses konstruksi NPUcore , silakan merujuk ke: npucore-book
Jika Anda ingin menggunakan kode kami sebagai baseline , kami sarankan untuk menggunakan ( NPUcore-重生之我是菜狗Team Code, termasuk bagian ext4 ): NPUCORE-LWEXT4
Jika Anda ingin merujuk ke format dan template dokumen Latex kami, silakan merujuk ke: npucore-impact-doc
Kami menyusun Dokumen Referensi Loongson: Baidu Netdisk: Kata Sandi 1145
Contoh Tes Kompetisi Kami: Kode Sumber TestCases, File Biner TestCases
Lingkungan QEMU kami: QEMU
QEMU bukanlah menjalankan yang nyata. (Perbedaan utama antara QEMU dan papan adalah pemetaan alamat. Jika ada masalah, silakan lihat ke arah ini)uboot dua kali, dan jangan mempelajari kotak hitam.NPUcore baru dari awal alih -alih menggunakan versi lama kami. Saya harap versi ini hanya digunakan sebagai referensi untuk Anda.NPUcore selama tahap pembelajaran, tetapi lakukan percobaan ini terlebih dahulu: xv6-loongarchNPUcore-IMPACT ini sebagai baseline Anda, dan derajat koplingnya sangat, sangat tinggi. Kami sudah lama tidak berguna untuk memisahkannya.FAT32 kami dari NPUcore-IMPACT sebagai baseline Anda, silakan merujuk ke semua dokumentasi kami dan mengimplementasikan vfs terlebih dahulu, sepenuhnya Decouple fs dan fat32 , dan kemudian pertimbangkan untuk menambahkan sistem file baru (jika EXT4 masih menjadi arus utama tahun depan) dan panggilan sistem.NPUcore-IMPACT masih memiliki banyak kekurangan fungsional. Jika Anda masih perlu menjalankan tes ltp tahun depan, Anda harus menambahkan lebih banyak panggilan sistem (dikatakan bahwa Anda perlu mendapatkan peringkat yang baik tahun ini, dan Anda mungkin memerlukan 200 syscall ).NPUcore2022 terutama mengoptimalkan cache , tetapi juga mengarah pada banyak masalah fungsional. Jika ada banyak bug baru nanti, pastikan untuk mempertimbangkan ini. Jika perlu, Anda dapat meninggalkan sorotan sebelumnya.NPUcore-IMPACT kami saat ini, harap beri prioritas untuk kinerja. Meskipun masih ada banyak ruang untuk optimasi dalam kinerja, ketidaksempurnaan dalam fungsi akan menyebabkan tidak mendapatkan satu poin tunggal.sudo apt-get install make
sudo apt-get install cmakePasang rantai kompilasi Rust untuk Loongarch
Instal Rustup (Rust's Installer + Version Manager)
rustup install nightly-2024-02-03 Menginstal rust toolchain sejak kompilasi silang arsitektur Loongarch telah digabungkan ke hulu, kami tidak perlu menginstalnya secara manual saat ini.
Ada skrip deteksi otomatis di Makefile , hanya perintah Make berikutnya yang diperlukan.
Pasang alat kompilasi silang. Proyek ini menggunakan alat kompilasi yang menghasilkan loongarch64 di bawah x86_64. Loong Arch GCC 13: https://github.com/loongsonlab/oscompi-toolchains-for-oskernel
wget https://github.com/LoongsonLab/oscomp-toolchains-for-oskernel/releases/download/gcc-13.2.0-loongarch64/gcc-13.2.0-loongarch64-linux-gnu.tgz
tar zxf gcc-13.2.0-loongarch64-linux-gnu.tgz
# 在.bashrc中增加交叉编译器路径。假设当前路径为:/opt/gcc-13.2.0-loongarch64-linux-gnu
export PATH=${PATH}:/opt/gcc-13.2.0-loongarch64-linux-gnu/bin
# 如果配置正确,输入如下命令
loongarch64-linux-gnu-gcc -v
#会显示如下:
Using built-in specs.
COLLECT_GCC=loongarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/home/airxs/local/gcc-13.2.0-loongarch64-linux-gnu/bin/../libexec/gcc/loongarch64-linux-gnu/13.2.0/lto-wrapper
Target: loongarch64-linux-gnu
Configured with: ../configure --prefix=/home/airxs/user/gnu/cross-tools --build=x86_64-cross-linux-gnu --host=x86_64-cross-linux-gnu --target=loongarch64-linux-gnu --with-sysroot=/home/airxs/user/gnu/cross-tools/sysroot --with-mpfr=/home/airxs/user/gnu/cross-tools --with-gmp=/home/airxs/user/gnu/cross-tools --with-mpc=/home/airxs/user/gnu/cross-tools --enable-__cxa_atexit --enable-threads=posix --with-system-zlib --enable-libstdcxx-time --enable-checking=release --enable-default-pie --enable-languages=c,c++,fortran,objc,obj-c++,lto
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 13.2.0 (GCC)
Jika ada kesalahan dalam kehilangan beberapa file perpustakaan dan kompilasi kode karat, disarankan untuk mencoba make clean , hapus kargo.lock di folder yang sesuai, cobalah untuk menghapus batas versi dalam cargo.toml dan kemudian kompilasi ulang.
make saja langsung di baris perintah direktori root. Dianjurkan untuk melaksanakannya terlebih dahulu untuk memfasilitasi pemasangan dan keakraban lingkungan.
ram=0x1f17f00
length=852992 must be 16777216 bytes,run command:
trucate -s 16777216 file
to resize file
oobsize = 64
_ __ __ _ _ ___ ___ __ _ _ / ___ __
| | | | | | | | __ [__ | | | | | | __ | |
| ___ | __ | | __ | | | | __] ___] | __ | | | | __] | __/ /
Trying to boot from SPI
U-Boot 2022.04 (Jan 26 2024 - 15:42:00 +0800)
CPU: LA264
Speed: Cpu @ 900 MHz/ Mem @ 400 MHz/ Bus @ 125 MHz
Model: loongson-2k1000
Board: LS2K1000-DP
DRAM: 1 GiB
Core: 74 devices, 20 uclasses, devicetree: board
cam_disable:1, vpu_disable:1, pcie0_enable:0, pcie1_enable:1
Loading Environment from SPIFlash... SF: Detected gd25q128 with page size 256 Bytes, erase size 4 KiB, total 16 MiB
*** Warning - bad CRC, using default environment
Cannot get ddc bus
In: serial
Out: serial
Err: serial vidconsole
eth0: using random MAC address - f2:ef:a7:28:76:cd
eth1: using random MAC address - 82:98:7e:f2:f8:e4
Net: Could not get PHY for mdio@0: addr 0
Could not get PHY for mdio@1: addr 0
3No ethernet found.
************************** Notice **************************
Press c to enter u-boot console, m to enter boot menu
************************************************************
Bus otg@40000000: dwc2_usb otg@40000000: Core Release: 0.000
dwc2_usb otg@40000000: SNPSID invalid (not DWC2 OTG device): 00000000
Port not available.
Bus ehci@40060000: USB EHCI 1.00
Bus ohci@40070000: USB OHCI 1.0
scanning bus ehci@40060000 for devices... 3 USB Device(s) found
scanning bus ohci@40070000 for devices... 1 USB Device(s) found
init ls_trigger_boot and set it default value
init ls_trigger_u_kernel and set it default value
init ls_trigger_u_rootfs and set it default value
init ls_trigger_u_uboot and set it default value
Saving Environment to SPIFlash... Erasing SPI flash...Writing to SPI flash...done
OK
Autoboot in 0 seconds
SF: Detected gd25q128 with page size 256 Bytes, erase size 4 KiB, total 16 MiB
device 0 offset 0xf0000, size 0x10000
SF: 65536 bytes @ 0xf0000 Read: OK
Reset SCSI
scanning bus for devices...
Target spinup took 0 ms.
Target spinup took 0 ms.
Target spinup took 0 ms.
SATA link 3 timeout.
SATA link 4 timeout.
SATA link 5 timeout.
AHCI 0001.0000 32 slots 6 ports 1.5 Gbps 0x3f impl SATA mode
flags: 64bit ncq only
Device 0: (0:0) Vendor: ATA Prod.: QEMU HARDDISK Rev: 2.5+
Type: Hard Disk
Capacity: 100.0 MB = 0.0 GB (204800 x 512)
Device 1: (1:0) Vendor: ATA Prod.: QEMU HARDDISK Rev: 2.5+
Type: Hard Disk
Capacity: 1024.0 MB = 1.0 GB (2097152 x 512)
Device 2: (2:0) Vendor: ATA Prod.: QEMU HARDDISK Rev: 2.5+
Type: Hard Disk
Capacity: 1024.0 MB = 1.0 GB (2097152 x 512)
** No partition table - scsi 0 **
Couldn ' t find partition scsi 0:1
Can ' t set block device
Wrong Image Format for bootm command
ERROR: can ' t get kernel image!
Bootcmd="setenv bootargs ${bootargs} root=/dev/sda${syspart} mtdparts=${mtdparts} video=${video}; sf probe;sf read ${fdt_addr} dtb;scsi reset;ext4load scsi 0:${syspart} ${loadaddr} /boot/uImage;bootm "
Boot Kernel failed. Kernel not found or bad.
=>
=>
=>
=> fatload scsi 0 ${loadaddr} /kernel.bin;go ${loadaddr};
47739944 bytes read in 761 ms (59.8 MiB/s)
## Starting application at 0x9000000090000000 ...
[kernel] NPUcore-IMAPCT!!! ENTER!
[kernel] UART address: 0x1fe20000
[bootstrap_init] PRCfg1 { SAVE reg. number: 8, Timer bits: 48, max vector entry spacing: 7 }
[kernel] Console initialized.
last 37479 Physical Frames.
.text [0x90000000, 0x90069000)
.rodata [0x90069000, 0x90075000)
.data [0x90081000, 0x92d88000)
.bss [0x92d88000, 0x96d99000)
mapping .text section
mapping .rodata section
mapping .data section
mapping .bss section
mapping physical memory
mapping memory-mapped registers
[get_timer_freq_first_time] clk freq: 100000000(from CPUCFG)
[CPUCFG 0x0] 1351680
[CPUCFG 0x1] 66253566
[CPUCFG 0x2] 6341127
[CPUCFG 0x3] 3327
[CPUCFG 0x4] 100000000
[CPUCFG 0x5] 65537
[CPUCFG 0x6] 0
[CPUCFG 0x10] 11325
[CPUCFG 0x11] 0
[CPUCFG 0x12] 0
[CPUCFG 0x13] 0
[CPUCFG 0x14] 0
Misc { 32-bit addr plv(1,2,3):: false,false,false, rdtime allowed for plv(1,2,3):: false,false,false, Disable dirty bit check for plv(0,1,2):: false,false,false, Misalignment check for plv(0,1,2,4):: false,false,false,false }
RVACfg { rbits: 0 }
[machine_init] MMAP_BASE: 0xffffff8000000000
[kernel] Hello, world!
Testing execve :
========== START test_execve ==========
I am test_echo.
execve success.
========== END main ==========
Testing brk :
========== START test_brk ==========
Before alloc,heap pos: 12288
After alloc,heap pos: 12352
Alloc again,heap pos: 12416
========== END test_brk ==========
Testing chdir :
========== START test_chdir ==========
chdir ret: 0
current working dir : /test_chdir
========== END test_chdir ==========
Testing clone :
========== START test_clone ==========
Child says successfully!
clone process successfully.
pid:3
========== END test_clone ==========
Testing close :
========== START test_close ==========
close 3 success.
========== END test_close ==========
Testing dup2 :
========== START test_dup2 ==========
from fd 100
========== END test_dup2 ==========
Testing dup :
========== START test_dup ==========
new fd is 3.
========== END test_dup ==========
Testing exit :
========== START test_exit ==========
exit OK.
========== END test_exit ==========
Testing fork :
========== START test_fork ==========
child process.
parent process. wstatus:0
========== END test_fork ==========
Testing fstat :
========== START test_fstat ==========
fstat ret: 0
fstat: dev: 2048, inode: 5784, mode: 33279, nlink: 1, size: 52, atime: 0, mtime: 0, ctime: 0
========== END test_fstat ==========
Testing getcwd :
========== START test_getcwd ==========
getcwd: / successfully!
========== END test_getcwd ==========
Testing getdents :
========== START test_getdents ==========
open fd:3
getdents fd:456
getdents success.
lib
========== END test_getdents ==========
Testing getpid :
========== START test_getpid ==========
getpid success.
pid = 2
========== END test_getpid ==========
Testing getppid :
========== START test_getppid ==========
getppid success. ppid : 1
========== END test_getppid ==========
Testing gettimeofday :
========== START test_gettimeofday ==========
gettimeofday success.
start:12098, end:12163
interval: 65
========== END test_gettimeofday ==========
Testing mkdir_ :
========== START test_mkdir ==========
mkdir ret: -17
mkdir success.
========== END test_mkdir ==========
Testing mmap :
========== START test_mmap ==========
file len: 27
mmap content: Hello, mmap successfully!
========== END test_mmap ==========
Testing mount :
========== START test_mount ==========
Mounting dev:/dev/vdb to ./mnt
mount return: 0
mount successfully
umount return: 0
========== END test_mount ==========
Testing munmap :
========== START test_munmap ==========
file len: 27
munmap return: 0
munmap successfully!
========== END test_munmap ==========
Testing open :
========== START test_open ==========
Hi, this is a text file.
syscalls testing success!
========== END test_open ==========
Testing openat :
========== START test_openat ==========
open dir fd: 3
openat fd: 4
openat success.
========== END test_openat ==========
Testing pipe :
========== START test_pipe ==========
cpid: 3
cpid: 0
Write to pipe successfully.
========== END test_pipe ==========
Testing read :
========== START test_read ==========
Hi, this is a text file.
syscalls testing success!
========== END test_read ==========
Testing sleep :
========== START test_sleep ==========
sleep success.
========== END test_sleep ==========
Testing times :
========== START test_times ==========
mytimes success
{tms_utime:274200, tms_stime:0, tms_cutime:0, tms_cstime:0}
========== END test_times ==========
Testing umount :
========== START test_umount ==========
Mounting dev:/dev/vda2 to ./mnt
mount return: 0
umount success.
return: 0
========== END test_umount ==========
Testing uname :
========== START test_uname ==========
Uname: Linux debian 5.10.0-7-riscv64 #1 SMP Debian 5.10.40-1 (2021-05-28) riscv64
========== END test_uname ==========
Testing unlink :
========== START test_unlink ==========
unlink success!
========== END test_unlink ==========
Testing wait :
========== START test_wait ==========
This is child process
wait child success.
wstatus: 0
========== END test_wait ==========
Testing waitpid :
========== START test_waitpid ==========
This is child process
waitpid successfully.
wstatus: 3
========== END test_waitpid ==========
Testing write :
========== START test_write ==========
Hello operating system contest.
========== END test_write ==========
Testing yield :
========== START test_yield ==========
I am child process: 3. iteration 0.
I am child process: 4. iteration 1.
I am child process: 3. iteration 0.
I am child process: 4. iteration 1.
I am child process: 5. iteration 2.
I am child process: 3. iteration 0.
I am child process: 4. iteration 1.
I am child process: 5. iteration 2.
I am child process: 3. iteration 0.
I am child process: 4. iteration 1.
I am child process: 5. iteration 2.
I am child process: 3. iteration 0.
I am child process: 4. iteration 1.
I am child process: 5. iteration 2.
I am child process: 5. iteration 2.
========== END test_yield ==========
[initproc] test finishKeluar dari eksekusi setelah mencetak sejumlah besar hasil tes.
Perhatikan bahwa menambahkan log = jejak setelah perintah dapat mengaktifkan semua log jejak dan di atas. Log dibagi menjadi jejak, debug, info, peringatan, kesalahan dari rendah ke tinggi.
make run : Kompilasi sistem dan lakukan tes mesin virtual
make gdb : Jalankan Mode Debug (perlu digunakan dengan GDB), mulai mesin virtual tetapi tidak dijalankan
make clean : Bersihkan proyek yang dikompilasi (termasuk program pengguna, sistem, dan gambar lemak)