
Northwestern Polytechnical University, The First Prize (pas de prix spécial) pour "Concours de la capacité du système informatique des étudiants du National College - Concours de conception du système d'exploitation (National) - Piste de réalisation du noyau OS Loongson LA2K1000 Points Track".
Nom de l'équipe Source: Npucore influent, trois notes d'exclamation représentent trois membres.
Le capitaine qui a été emmené: [conception du noyau et adaptation / document] Yixu Feng (yixu [email protected])
Super Players: [Debug Expert] Yifei Zhang ([email protected]), [Hardware Master] Hanchen Zhang ([email protected]), [support hors champ] Huan Guo (blog personnel)
Aux étudiants de l'Université de technologie de Xi'an ou d'autres écoles qui ont participé au concours OS à Loongson Track: Si vous voyez cet entrepôt, cela signifie que vous avez trouvé le bon emplacement. Il s'agit de l'entrepôt le plus original de notre impact Npucore, qui est une version plus basée sur NPUcore+LA (nous avons ensuite reconstruit une nouvelle version, mais elle ne peut pas être trouvée dans cet entrepôt). NPUcore-FF de ce référentiel est la branche de notre premier score complet (Système de fichiers fat32 ), et la branche ext4 est la branche expérimentale que nous avons adaptée au système de fichiers ext4 en finale, mais veuillez noter que ext4 ne peut pas fonctionner car ce n'est pas la version finale de notre débogage !
La décision de code pour la phase finale de notre finale (match en ligne + deuxième étape) n'est pas entièrement annoncée au public parce que nous avons fait beaucoup d'ajustements dans les quinze jours avant la finale, comme: nous adapter avec succès ext4 et ajouter beaucoup de nouveaux syscall ... mais le prix est que le temps est serré, notre code est juste un gros morceau, et nous ne voulons vraiment pas montrer à tous le code faible en qualité que nous avons retiré. Par conséquent, nous ne divulguons publiquement cet entrepôt d'origine pour votre référence. Voici mes liens de référence recommandés:
Si vous souhaitez utiliser la version rust de crate d'arc basée à Los Angeles, veuillez vous référer à: npucore-la2k1000-arch
Si vous voulez connaître le processus de débogage de notre concours préliminaire, veuillez vous référer à: la réparation préliminaire du test de compétition
Si vous voulez savoir ce que nous avons fait dans la première phase de la finale, veuillez vous référer à: Finales Phase 1 Documentation
Si vous voulez savoir ce qui différencie notre version finale NPUcore-IMPACT des autres, veuillez vous référer à: Défense finale
Si vous voulez savoir ce que nous avons fait sur la compétition en direct, veuillez vous référer à: Concours live
Si vous voulez savoir comment nous avons finalement défendu, veuillez vous référer à: Braft of the Final
Si vous souhaitez utiliser et modifier notre logo (devez apprendre à utiliser AE), veuillez vous référer à: Logo
Si vous rencontrez des difficultés que nous n'avons pas mentionnées pendant le débogage, veuillez vous référer à: 2024 Deuxième prix: Npucore-Rebirth: I Am a Caigou, 2022 Premier prix: RISCV Original Npucore, 2023 Second Prize-Npucore + La
Si vous souhaitez apprendre le processus de construction NPUcore , veuillez vous référer à: Npucore-book
Si vous souhaitez utiliser notre code comme baseline , nous vous recommandons d'utiliser (notre NPUcore-重生之我是菜狗Team Code, y compris Part ext4 ): npucore-lwext4
Si vous souhaitez vous référer à notre format et modèle de document Latex , veuillez vous référer à: npucore-impact-doc
Nous avons compilé le document de référence Loongson: Baidu NetDisk: Mot de passe 1145
Nos exemples de test de compétition: Code source de tests, fichier binaire de tests de test
Notre environnement QEMU : Qemu
QEMU n'est pas une véritable course. (La principale différence entre QEMU et Board est la cartographie d'adresse. S'il y a un problème, veuillez regarder dans ce sens)uboot deux fois et de ne pas étudier la boîte noire.NPUcore à partir de zéro au lieu d'utiliser notre ancienne version. J'espère que cette version est uniquement utilisée comme référence pour vous.NPUcore pendant la phase d'apprentissage, mais faites d'abord cette expérience: xv6-loongarchNPUcore-IMPACT comme votre ligne de base, et son degré de couplage est très, très élevé. Nous sommes inutiles depuis longtemps pour le découpler.FAT32 de NPUcore-IMPACT comme votre ligne de base, veuillez vous référer à toutes nos documents et implémenter d'abord vfs , découpez complètement fs et fat32 , puis envisagez d'ajouter un nouveau système de fichiers (si EXT4 est toujours courant l'année prochaine) et des appels système.NPUcore-IMPACT a encore de nombreuses lacunes fonctionnelles. Si vous avez toujours besoin d'exécuter le test ltp l'année prochaine, vous devez ajouter plus d'appels système (il est dit que vous devez obtenir un bon classement cette année, et vous pourriez avoir besoin de 200 syscall ).NPUcore2022 optimise principalement cache , mais il conduit également à de nombreux problèmes fonctionnels. S'il y a beaucoup de nouveaux bugs plus tard, assurez-vous de considérer cela. Si nécessaire, vous pouvez abandonner les points forts précédents.NPUcore-IMPACT actuel, veuillez donner la priorité aux performances. Bien qu'il y ait encore beaucoup de place à l'optimisation des performances, les imperfections de la fonction conduiront à ne pas obtenir un seul point.sudo apt-get install make
sudo apt-get install cmakeInstallez la chaîne de compilation de Rust pour Loongarch
Installez Rustup (Rust's Installer + Version Manager)
rustup install nightly-2024-02-03 L'installation de la chaîne d'outils de rouille depuis la compilation croisée de l'architecture Loongarch a été fusionnée en amont, nous n'avons pas besoin de l'installer manuellement à l'heure actuelle.
Il y a un script de détection automatique dans Makefile , seule la commande de Make suivante est nécessaire.
Installez l'outil de compilation croisée. Ce projet utilise un outil de compilation qui génère Loongarch64 sous 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)
S'il y a une erreur en manquant des fichiers de bibliothèque et de la compilation de code de rouille, il est recommandé d'essayer de make clean , de supprimer le cargo.cloc dans le dossier correspondant, essayez de supprimer la limite de version dans cargo.toml puis de recompile.
make simplement dire directement dans la ligne de commande du répertoire racine. Il est recommandé de l'exécuter d'abord pour faciliter l'installation et la familiarité de l'environnement.
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 finishSortez l'exécution après imprimer un grand nombre de résultats de test.
Notez que l'ajout de log = trace après la commande peut activer tous les journaux de trace et supérieurs. Les journaux sont divisés en trace, débogage, informations, avertissement, erreur de faible à haut.
make run : compilez le système et effectuez des tests de machine virtuelle
make gdb : Exécuter le mode de débogage (doit être utilisé avec GDB), démarrez la machine virtuelle mais pas exécuter
make clean : nettoyez les projets compilés (y compris les programmes d'utilisateurs, les systèmes et les images de graisse)