
Die Northwestern Polytechnical University, der erste Preis (kein Sonderpreis) Eintrag für "National College Student Computer System Fähigkeitswettbewerb - Betriebssystem Designwettbewerb (National) - OS -Kernel -Realisierungsstrecke Loongson La2K1000 Punkte Track".
Teamname Quelle: Einflussreiche Npucore, drei Ausrufezeichen repräsentieren drei Mitglieder.
Der Kapitän, der weggenommen wurde: [Kerneldesign und Anpassung/Dokument] Yixu Feng ([email protected])
Super-Spieler: [Debug-Experte] Yifei Zhang ([email protected]), [Hardware-Meister] Hangen Zhang ([email protected]), [Support-Support] Huan Guo (persönlicher Blog)
An die Schüler der Xi'an University of Technology oder an andere Schulen, die am OS -Wettbewerb in Loongson Track teilgenommen haben: Wenn Sie dieses Lagerhaus sehen, bedeutet dies, dass Sie den richtigen Ort gefunden haben. Dies ist das originellste Lagerhaus unseres Npucore-Impact, eine Plus-Version, die auf NPUcore+LA basiert (wir haben später eine neue Version rekonstruiert, aber in diesem Lagerhaus nicht zu finden). NPUcore-FF Zweig dieses Repositorys ist der Zweig unserer Erstzeitpunkte ( fat32 Dateisystem), und der ext4 Zweig ist der experimentelle Zweig, den wir an das ext4 Dateisystem im Finale angepasst haben, aber bitte beachten Sie, dass ext4 Zweig nicht ausgeführt wird, weil es nicht die endgültige Version unseres Debugs ist !
Die Codeentscheidung für die letzte Phase unseres Finales (Online- ext4 + Second Stufe) ist der Öffentlichkeit nicht vollständig angekündigt, da syscall innerhalb der fünfzehn Tage vor dem Finale viele Anpassungen vorgenommen haben, wie z. Daher geben wir dieses Originallager nur öffentlich als Referenz offen. Hier sind meine empfohlenen Referenzlinks:
Wenn Sie die rust -Version von Arch crate in LA verwenden möchten, lesen Sie bitte: NPUCORE-LA2K1000-Arch
Wenn Sie über den Debug -Prozess unseres vorläufigen Wettbewerbs informiert werden möchten
Wenn Sie wissen möchten, was wir in der ersten Phase des Finales getan haben
Wenn Sie wissen möchten, was unsere endgültige Version NPUcore-IMPACT von anderen unterscheidet, lesen Sie bitte: Finale Verteidigung
Wenn Sie wissen möchten, was wir im Live -Wettbewerb gemacht haben, finden Sie unter: Live -Wettbewerb
Wenn Sie wissen möchten, wie wir endlich verteidigen
Wenn Sie unser logo verwenden und ändern möchten (müssen Sie lernen, wie Sie AE verwenden), finden Sie unter: Logo
Wenn Sie auf Schwierigkeiten stoßen, die wir während des Debugs nicht erwähnt haben, lesen Sie bitte: 2024 Preisträger: Npucore-Rebirth: Ich bin ein Caigou, 2022 erster Preis: RISCV Original Npucore, 2023 Second Prize-Npucore+LA
Wenn Sie den NPUcore Konstruktionsprozess kennenlernen möchten, lesen Sie bitte: Npucore-book
Wenn Sie unseren Code als baseline verwenden möchten, empfehlen wir die Verwendung (unserem geänderten NPUcore-重生之我是菜狗Team Code, einschließlich Teil ext4 ): Npucore-Lwext4
Wenn Sie sich auf unser Latex Dokumentformat und die Vorlage verweisen möchten
Wir haben Loongson Referenzdokument zusammengestellt: Baidu NetDisk: Passwort 1145
Unsere Beispiele für Wettbewerbstests: Testcases Quellcode, Testcasen Binärdatei
Unsere QEMU -Umgebung: Qemu
QEMU ist kein echter Lauf durch. (Der Hauptunterschied zwischen QEMU und Board ist die Adresszuordnung. Wenn ein Problem vorliegt, schauen Sie sich bitte in diese Richtung an.)uboot -Quellcode zweimal zu lesen und die Black Box nicht zu untersuchen.NPUcore von Grund auf neu schreiben, anstatt unsere alte Version zu verwenden. Ich hoffe, diese Version wird nur als Referenz für Sie verwendet.NPUcore während der Lernphase nicht direkt zu lernen, sondern dieses Experiment zuerst: XV6-LOONGARGARCHNPUcore-IMPACT nicht blind als Basislinie verwenden sollten und ihr Kopplungsgrad sehr, sehr hoch ist. Wir waren schon lange nutzlos, um es zu entkoppeln.FAT32 Version von NPUcore-IMPACT als Basislinie auswählen, lesen Sie alle unsere Dokumentationen und implementieren Sie zuerst vfs , entkoppeln Sie fs und fat32 vollständig und erwägen Sie dann ein neues Dateisystem (falls EXT4 im nächsten Jahr noch Mainstream ist) und Systemanrufe hinzuzufügen.NPUcore-IMPACT hat immer noch viele funktionale Mängel. Wenn Sie den ltp -Test nächstes Jahr noch ausführen müssen, müssen Sie weitere Systemanrufe hinzufügen (es wird gesagt, dass Sie dieses Jahr ein gutes Ranking erhalten müssen, und möglicherweise benötigen Sie 200 syscall ).NPUcore2022 optimiert cache hauptsächlich, führt aber auch zu vielen funktionellen Problemen. Wenn es später viele neue Fehler gibt, beachten Sie dies bitte. Bei Bedarf können Sie die vorherigen Highlights aufgeben.NPUcore-IMPACT geben Sie der Leistung bitte Priorität. Obwohl es noch viel Raum für die Optimierung in der Leistung gibt, führen die Funktionsfunktionen dazu, keinen einzigen Punkt zu erhalten.sudo apt-get install make
sudo apt-get install cmakeInstallieren Sie die Kompilierungskette von Rust für Loongarch
Installieren Sie Rustup (Rust's Installer + Version Manager)
rustup install nightly-2024-02-03 Die Installation der Rost-Toolchain seit der Kreuzkompilierung der Loongarch-Architektur wurde in den stromaufwärts gelegenen Fusionen nicht manuell installieren.
Im Makefile befindet sich ein automatisches Erkennungsskript, nur der nachfolgende Befehl make -Befehl ist erforderlich.
Installieren Sie das Cross-Compilation-Tool. Dieses Projekt verwendet ein Kompilierungstool, das Loongarch64 unter x86_64 generiert. 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)
Wenn ein Fehler beim Fehlen einiger Bibliotheksdateien und der Rostcode -Kompilierung vorliegt, wird empfohlen, zu versuchen, make clean , die Ladung im entsprechenden Ordner zu löschen. Versuchen Sie, die Versionsbegrenzung in Fracht zu löschen und dann neu zu kompilieren.
make es einfach direkt in der Befehlszeile der Root Directory. Es wird empfohlen, es zunächst auszuführen, um die Installation und Vertrautheit der Umgebung zu erleichtern.
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 finishBeenden Sie die Ausführung nach dem Drucken einer großen Anzahl von Testergebnissen.
Beachten Sie, dass das Hinzufügen von LOG = Trace nach dem Befehl alle Spuren und höher aktivieren kann. Die Protokolle sind in Trace, Debugg, Info, Warnung und Fehler von niedrig bis hoch unterteilt.
make run : Kompilieren Sie das System und führen Sie virtuelle Maschinentests durch
make gdb : Führen Sie den Debug -Modus aus (müssen mit GDB verwendet werden), starten Sie die virtuelle Maschine, aber nicht ausführen
make clean : Clean -up -kompilierte Projekte (einschließlich Benutzerprogramme, Systeme und Fettbilder)