
노스 웨스턴 다색 대학교 (Northwestern Polytechnical University), "National College Student Computer System Ability Competition- 운영 체제 설계 경쟁 (National) - OS 커널 실현 트랙 Loongson LA2K1000 포인트 트랙"에 대한 최초의 상금 (특별상 없음).
팀 이름 출처 : 영향력있는 NPUCORE, 3 개의 느낌표가 3 명의 회원을 나타냅니다.
가져간 선장 : [커널 디자인 및 적응/문서] yixu feng ([email protected])
슈퍼 플레이어 : [디버그 전문가] Yifei Zhang ([email protected]), [하드웨어 마스터] Hanchen Zhang ([email protected]), [오프 필드 지원] Huan Guo (개인 블로그)
Xi'an University of Technology 또는 Loongson Track의 OS 대회에 참여한 다른 학교 학생들에게 :이 창고가 보이면 올바른 위치를 찾았다는 것을 의미합니다. NPUCORE-IMPACT의 가장 독창적 인 창고로 NPUcore+LA 기반으로 한 플러스 버전입니다 (나중에 새 버전을 재구성했지만이 창고에서는 찾을 수 없습니다). 이 저장소의 NPUcore-FF 브랜치는 우리의 첫 번째 전체 점수 ( fat32 파일 시스템)의 지점이며, ext4 브랜치는 결승전에서 ext4 파일 시스템에 적응 한 실험 분기이지만 ext4 분기는 디버그의 최종 버전이 아니기 때문에 실행할 수 없습니다 !
최종 최종 단계 (온라인 매치 + 2 단계)에 대한 코드 결정은 최종 전 15 일 이내에 많은 조정을했기 때문에 ext4 같이 성공적으로 조정하고 새로운 syscall 추가하는 것과 같은 많은 조정을했기 때문에 대중에게 전적으로 발표되지 않았습니다. 그러나 가격은 타이트한 일이라는 것이 단지 우리의 코드가 우리가 쫓아내는 모든 사람을 보여주고 싶지 않다는 것입니다. 따라서 우리는 귀하의 참조를 위해이 원래 창고 만 공개적으로 공개합니다. 권장 참조 링크는 다음과 같습니다.
LA 기반 아치 crate 의 rust 버전을 사용하려면 다음을 참조하십시오. NPUCORE-LA2K1000-ARCH
예비 경쟁의 디버그 과정에 대해 알고 싶다면 LA 예비 경쟁 테스트 수리를 참조하십시오.
결승전의 첫 번째 단계에서 우리가 한 일을 알고 싶다면 다음을 참조하십시오. Finals Phase 1 Documentation
NPUcore-IMPACT 최종 버전을 다른 사람과 차별화하는 것을 알고 싶다면 다음을 참조하십시오. 최종 방어
라이브 대회에서 우리가 한 일을 알고 싶다면 다음을 참조하십시오 : 라이브 경쟁
우리가 마지막으로 어떻게 변호했는지 알고 싶다면 다음을 참조하십시오 : 최종 초안
logo 사용하고 수정하려면 (AE를 사용하는 방법을 배워야 함) : 로고를 참조하십시오.
디버그 중에 언급하지 않은 어려움에 직면한다면 다음을 참조하십시오.
NPUcore 건설 과정을 배우려면 다음을 참조하십시오 : NPUCORE-Book
우리의 코드를 baseline 으로 사용하려면 (수정 된 NPUcore-重生之我是菜狗Team Code, Part ext4 ) : npucore-lwext4를 사용하는 것이 좋습니다.
Latex 문서 형식 및 템플릿을 참조하려면 다음을 참조하십시오.
Loongson 참조 문서 : Baidu Netdisk : Password 1145를 컴파일했습니다
경쟁 테스트 예 : 테스트 케이스 소스 코드, 테스트 케이스 이진 파일
우리의 QEMU 환경 : QEMU
QEMU 를 통과하는 것은 실제가 아닙니다. ( QEMU 와 보드의 주요 차이점은 주소 매핑입니다. 문제가 있으면이 방향으로 살펴보십시오).uboot 소스 코드를 두 번 읽고 블랙 박스를 연구하지 않는 것이 좋습니다.NPUcore 쓸 수 있기를 바랍니다. 이 버전이 귀하를위한 참조로만 사용되기를 바랍니다.NPUcore 직접 배우지 않는 것이 가장 좋습니다. 그러나이 실험을 먼저 수행하십시오 : xv6-loongarchNPUcore-IMPACT 버전을 기준으로 맹목적으로 사용해서는 안되며 커플 링 정도는 매우 높습니다. 우리는 오랫동안 쓸모가 없었습니다.NPUcore-IMPACT 의 FAT32 버전을 귀하의 기준으로 선택한 경우 모든 문서를 참조하고 먼저 vfs 구현하고 fs 및 fat32 완전히 해제 한 다음 새 파일 시스템 (내년에 여전히 EXT4 인 경우) 및 시스템 호출을 추가하십시오.NPUcore-IMPACT 에는 여전히 많은 기능적 단점이 있습니다. 내년에 여전히 ltp 테스트를 실행 해야하는 경우 더 많은 시스템 통화를 추가해야합니다 (올해는 좋은 순위를 얻어야한다고 말하며 200 개의 syscall 필요할 수 있습니다).NPUcore2022 주로 cache 최적화하지만 많은 기능적 문제로 이어집니다. 나중에 많은 새로운 버그가 있으면이를 고려하십시오. 필요한 경우 이전 하이라이트를 포기할 수 있습니다.NPUcore-IMPACT 의 경우 성능에 우선 순위를 부여하십시오. 성능 최적화의 여지가 여전히 많지만 기능의 결함은 단일 점을 얻지 못할 것입니다.sudo apt-get install make
sudo apt-get install cmakeLoongarch 용 Rust의 컴파일 체인을 설치하십시오
Rustup 설치 (Rust의 설치 프로그램 + 버전 관리자)
rustup install nightly-2024-02-03 Rust Toolchain 설치 Loongarch 아키텍처의 교차 컴파일이 업스트림으로 병합되었으므로 현재 수동으로 설치할 필요가 없습니다.
Makefile 에는 자동 감지 스크립트가 있으며 후속 MAKE 명령 만 필요합니다.
교차 컴파일 도구를 설치하십시오. 이 프로젝트는 x86_64에 따라 loongarch64를 생성하는 컴파일 도구를 사용합니다. 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)
일부 라이브러리 파일과 Rust 코드 컴파일이 누락 된 오류가 있으면 make clean 해당 폴더에서 Cargo.lock을 삭제하는 것이 좋습니다. Cargo.toml에서 버전 제한을 삭제 한 다음 다시 컴파일하십시오.
루트 디렉토리 명령 줄에서 직접 make . 환경의 설치 및 친숙 함을 촉진하기 위해 먼저 실행하는 것이 좋습니다.
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 finish많은 수의 테스트 결과를 인쇄 한 후 실행을 종료하십시오.
명령 후 log = 추적을 추가하면 추적 이상의 모든 로그를 활성화 할 수 있습니다. 로그는 트레이스, 디버그, 정보, 경고, 오류로 나뉘어 진로 나뉩니다.
make run : 시스템을 컴파일하고 가상 기계 테스트를 수행하십시오.
make gdb : 디버그 모드 실행 (GDB와 함께 사용해야 함), 가상 머신을 시작하지만 실행되지 않음
make clean : 컴파일 된 프로젝트 정리 (사용자 프로그램, 시스템 및 지방 이미지 포함)