
Northwestern Polytechnical University, la entrada del primer premio (sin premio especial) para "Competencia de habilidad del sistema informático de estudiantes universitarios de la universidad - Competencia de diseño del sistema operativo (National) - Track de realización del kernel OS Loongson LA2K1000 Puntos Track".
Fuente del nombre del equipo: NPUCORE influyente, tres marcos de exclamación representan tres miembros.
El capitán que fue llevado: [Diseño y adaptación/documento del núcleo] Yixu Feng ([email protected])
SUPER JUGADORES: [EXPERTO DE DEBUG] YIFEI ZHANG ([email protected]), [Hardware Master] Hanchen Zhang ([email protected]), [Soporte fuera del campo] Huan Guo (blog personal)
A los estudiantes de la Universidad Tecnológica de Xi'an u otras escuelas que participaron en la competencia del sistema operativo en Loongson Track: si ve este almacén, significa que ha encontrado la ubicación correcta. Este es el almacén más original de nuestro impacto NPucore, que es una versión más basada en NPUcore+LA (luego reconstruimos una nueva versión, pero no se puede encontrar en este almacén). NPUcore-FF de este repositorio es la rama de nuestra puntuación completa por primera vez (sistema de archivos fat32 ), y la rama ext4 es la rama experimental que adaptamos al sistema de archivos ext4 en las finales, pero tenga en cuenta que ext4 no puede ejecutar porque no es la versión final de nuestra depuración !
La decisión del código para la etapa final de nuestra final (partido en línea + segunda etapa) no se anuncia completamente al público porque hicimos muchos ajustes dentro de los quince días antes de la final, como: adaptando con éxito ext4 y agregando muchas syscall nuevas ... pero el precio es que el tiempo es apretado, nuestro código es solo un gran bulto, y realmente no queremos mostrar a todos el código de baja calidad de baja calidad. Por lo tanto, solo revelamos públicamente este almacén original para su referencia. Aquí están mis enlaces de referencia recomendados:
Si desea utilizar la versión rust de Arch crate con sede en LA, consulte: NPUCORE-LA2K1000-ARCH
Si desea saber sobre el proceso de depuración de nuestra competencia preliminar, consulte: Reparación de prueba de competencia preliminar de La
Si desea saber qué hicimos en la primera fase de la final, consulte: Documentación de Finales Fase 1
Si desea saber qué diferencia a nuestra versión final NPUcore-IMPACT de otros, consulte: Defensa final
Si quieres saber qué hicimos en la competencia en vivo, consulte: Competencia en vivo
Si desea saber cómo finalmente defendimos, consulte: Borrador de la final
Si desea usar y modificar nuestro logo (necesita aprender a usar AE), consulte: Logotipo
Si encuentra dificultades que no mencionamos durante la depuración, consulte: 2024 Segundo premio: Npucore-ReBirth: Soy un Caigou, 2022 Primer premio: Riscv original NPUCORE, 2023 SEGUNDO NPUCORE+LA
Si desea aprender el proceso de construcción NPUcore , consulte: NPUCORE-BOOK
Si desea utilizar nuestro código como baseline , recomendamos usar (nuestro NPUcore-重生之我是菜狗Team Code, incluida la Parte ext4 ): NPucore-Lwext4
Si desea consultar nuestro formato de documento Latex y plantilla, consulte: npucore-impact-doc
Compilamos el documento de referencia de Loongson: Baidu NetDisk: Contraseña 1145
Nuestros ejemplos de pruebas de competencia: Código fuente de TestCass, TestCass Binary Archives
Nuestro entorno QEMU : QEMU
QEMU no es una carrera real. (La principal diferencia entre QEMU y la Junta es el mapeo de direcciones. Si hay algún problema, busque en esta dirección)uboot dos veces, y no estudie la caja negra.NPUcore desde cero en lugar de usar nuestra versión anterior. Espero que esta versión solo se use como referencia para usted.NPUcore durante la etapa de aprendizaje, pero primero haga este experimento: xv6-loongarchNPUcore-IMPACT como su línea de base, y su grado de acoplamiento es muy, muy alto. Hemos sido inútiles durante mucho tiempo para desacoplarlo.FAT32 de NPUcore-IMPACT como su línea de base, consulte toda nuestra documentación e implemente vfs primero, decepcione por completo fs y fat32 , y luego considere agregar un nuevo sistema de archivos (si EXT4 todavía es convencional el próximo año) y llamadas del sistema.NPUcore-IMPACT todavía tiene muchas deficiencias funcionales. Si aún necesita ejecutar la prueba ltp el próximo año, debe agregar más llamadas al sistema (se dice que necesita obtener una buena clasificación este año, y es posible que necesite 200 syscall ).NPUcore2022 optimiza principalmente cache , pero también conduce a muchos problemas funcionales. Si hay muchos errores nuevos más tarde, asegúrese de considerar esto. Si es necesario, puede abandonar los aspectos más destacados anteriores.NPUcore-IMPACT actual, da prioridad al rendimiento. Aunque todavía hay mucho espacio para la optimización en el rendimiento, las imperfecciones en la función conducirán a no obtener un solo punto.sudo apt-get install make
sudo apt-get install cmakeInstale la cadena de compilación de Rust para Loongarch
Instale Rustup (Installer de Ruster + Administrador de versiones)
rustup install nightly-2024-02-03 Instalación de la cadena de herramientas de óxido Desde que la compilación cruzada de la arquitectura de Loongarch se ha fusionado en la corriente aguas arriba, no necesitamos instalarla manualmente en la actualidad.
Hay un script de detección automático en Makefile , solo se necesita el comando de marca posterior.
Instale la herramienta de compilación cruzada. Este proyecto utiliza una herramienta de compilación que genera Loungarch64 bajo x86_64. Loong Arch GCC 13: https://github.com/loongsonlab/oscomp-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)
Si hay un error al faltar algunos archivos de la biblioteca y la compilación de código de óxido, se recomienda intentar que make clean , elimine la carga.
Simplemente make directamente en la línea de comando del directorio raíz. Se recomienda ejecutarlo primero para facilitar la instalación y la familiaridad del entorno.
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 finishSalga de ejecución después de imprimir una gran cantidad de resultados de prueba.
Tenga en cuenta que agregar log = traza después del comando puede habilitar todos los registros de rastreo y arriba. Los registros se dividen en traza, depuración, información, advertencia, error de bajo a alto.
make run : compilar el sistema y realizar pruebas de máquina virtual
make gdb : ejecutar el modo de depuración (debe usarse con GDB), iniciar la máquina virtual pero no ejecutar
make clean : Limpiar proyectos compilados (incluidos programas de usuarios, sistemas e imágenes de grasa)