diff --git a/Makefile b/Makefile index 8ee581e7dd3d48263260a63513be7af68d7c4c79..e30c34dfbf5cb76e7729744efdb59fa540d10ea7 100644 --- a/Makefile +++ b/Makefile @@ -1407,7 +1407,7 @@ FILTER ?= .* VAR_FILTER ?= ^[ [\./_a-z0-9-]* \]|^ *[\_a-zA-Z0-9]* * define getboardvars -cat $(BOARD_MAKEFILE) | grep -E -v "^ *\#|ifeq|ifneq|else|endif|include |call |eval |_BASE|_PLUGIN|^$$" | tr -d '?: ' | cut -d '=' -f1 | uniq +cat $(BOARD_MAKEFILE) | grep -E -v "^ *\#|ifeq|ifneq|else|endif|include |call |eval |_BASE|_PLUGIN|override |^$$" | tr -d '?: ' | cut -d '=' -f1 | uniq endef define showboardvars @@ -2801,8 +2801,9 @@ root-dir-rebuild rootdir-rebuild: root-dir-clean $(ROOTDIR) FORCE PHONY += root-dir rootdir $(addsuffix -rebuild,root-dir rootdir) -# Install src/system +# Install src/system, src/overlay $(BSP_ROOT)/system and $(BSP_ROOT)/$(BUILDROOT)/system +ROOT_SYSTEM_OVERLAY := src/system $(wildcard src/overlay) $(wildcard $(BSP_ROOT)/overlay) $(wildcard $(BSP_ROOT)/$(BUILDROOT)/overlay) ROOT_INSTALL_TOOL := $(TOOL_DIR)/root/install.sh ifneq ($(wildcard $(KERNEL_BUILD)),) @@ -2811,8 +2812,8 @@ endif root-dir-install: root-dir-install-system $(ROOT_DIR_INSTALL_MODULES) -root-dir-install-system: src/system - $(Q)echo "LOG: Install system" && ROOTDIR=$(ROOTDIR) $(ROOT_INSTALL_TOOL) +root-dir-install-system: $(ROOT_SYSTEM_OVERLAY) + $(Q)echo "LOG: Install system" && ROOTDIR=$(ROOTDIR) SYSTEM="$(ROOT_SYSTEM_OVERLAY)" $(ROOT_INSTALL_TOOL) root-dir-install-modules: $(KERNEL_BUILD) $(Q)echo "LOG: Install modules" && make $(S) module-install || true @@ -2888,6 +2889,10 @@ KERNEL_CONFIG_DIR := $(KERNEL_ABS_SRC)/arch/$(ARCH)/configs KERNEL_CONFIG_EXTRAFLAG := M= KERNEL_CONFIG_EXTRACMDS := yes N | $(empty) KERNEL_CLEAN_DEPS := kernel-modules-clean +# Must be assigned before gengoals +ifneq ($(FEATURE),) +KERNEL_PATCH_EXTRAACTION := [ -n "$$(FEATURE)" ] && $$(KERNEL_FEATURE_PATCH_TOOL) $$(ARCH) $$(XARCH) $$(BOARD) $$(LINUX) $$(KERNEL_ABS_SRC) $$(KERNEL_BUILD) "$$(FEATURE)" || true; +endif kernel-oldnoconfig: kernel-olddefconfig @@ -2955,8 +2960,6 @@ endif kernel-feature: $(Q)[ $(FCS) -eq 1 ] && tools/board/config.sh FEATURE=$(FEATURE) $(BOARD_LABCONFIG) $(LINUX) || true -KERNEL_PATCH_EXTRAACTION := [ -n "$$(FEATURE)" ] && $$(KERNEL_FEATURE_PATCH_TOOL) $$(ARCH) $$(XARCH) $$(BOARD) $$(LINUX) $$(KERNEL_ABS_SRC) $$(KERNEL_BUILD) "$$(FEATURE)" || true; - ifneq ($(firstword $(MAKECMDGOALS)),list) feature: kernel-feature features: feature diff --git a/README.md b/README.md index 5dd6c9e18a10acf04a71c3d7b10499b3bfceae8e..4a3c365a9b177983f8922bae2516578d57efe525 100644 --- a/README.md +++ b/README.md @@ -202,11 +202,11 @@ Related Projects: * * RISC-V Lab - * Learning embedded RISC-V software development,merged in [Linux Lab Disk][029] + * Learning embedded RISC-V software development,merged in [Linux Lab Disk][029] for RISC-V * * ARM Lab - * Learning embedded ARM software development,merged in [Linux Lab Disk][029] + * Learning embedded ARM software development,merged in [Linux Lab Disk][029] for ARM * ## 1.3 Demonstration @@ -287,13 +287,15 @@ If really a Linux newbie or simply don't want to spend time on boring installati It supports: * Capacity - * From 32G to 512G and even 1T, 2T + * From 32G to 512G and even 1T, 2T, 4T +* Products + * High Speed U Disk, Solid U Disk, Portable disk, Solid disk (NVME / SATA) * Systems * Top6 Linux Distributions and even more based on your requirement - * Include Ubuntu 18.04-22.04, Deepin 20.5+, Fedora 34+, Mint 20.2+, Kali, Manjaro + * Include Ubuntu 18.04-22.04, Deepin 20.8+, Fedora 37+, Mint 21.1+, Kali, Manjaro * Features * Boot from any powered-off 64bit X86 Machine, include PC, Laptop and MacBook - * Boot from any running Windows, Linux and macOS and run in parallel with them + * Boot from any running Windows, Linux and run in parallel with them * Switch from or to any running Windows, Linux without poweroff * Multiple Linux Lab Disks can boot or switch from/to each other * Support timezone setting of different systems transparently, without manual setting @@ -304,6 +306,7 @@ It supports: * Merged in many labs, such as Linux Lab, Linux 0.11 Lab, be able to learn Linux kernel, embedded Linux, Uboot, Assembly, C, Python, Database, Network and so forth * Where to buy * [Taobao shop of TinyLab.org Community][023] + * [Bilibili Shop][025] * Product details * * Introduce and demonstrate the features, functions and usage of Linux Lab Disk @@ -729,7 +732,7 @@ Check the board specific configuration: ### 3.1.2.3 Buy one -All supported real hardware boards, virtual hardware boards support and the related Linux Lab Disk will be put in [TinyLab.org's Taobao Shop][024], after bought them, please contact with wechat: `tinylab` and join in the development group. +All supported real hardware boards, virtual hardware boards support and the related Linux Lab Disk will be put in [TinyLab.org's Taobao Shop][024] or [Bilibili Shop][025], after bought them, please contact with wechat: `tinylab` and join in the development group. ### 3.1.3 Using as plugins diff --git a/README_zh.md b/README_zh.md index 8001ecd4197a57c3888d4e4c5668cb3c9e988ca2..5dc61239c6c0f691a0aa2c51ad96af29911d8d81 100644 --- a/README_zh.md +++ b/README_zh.md @@ -215,11 +215,11 @@ Linux Lab 是一个开源软件,不提供任何保证,请自行承担使用 * * RISC-V Lab - * 用于学习嵌入式 RISC-V 软件开发,已集成到 [Linux Lab Disk][028],即泰晓 Linux 实验盘 + * 用于学习嵌入式 RISC-V 软件开发,已集成到 [Linux Lab Disk][028],即泰晓 RISC-V 实验盘 * * ARM Lab - * 用于学习嵌入式 ARM 软件开发,已集成到 [Linux Lab Disk][028],即泰晓 Linux 实验盘 + * 用于学习嵌入式 ARM 软件开发,已集成到 [Linux Lab Disk][028],即泰晓 ARM 实验盘 * ## 1.3 演示视频 @@ -523,23 +523,26 @@ Linux Lab 基于 Docker,对于已经安装 Docker 并配置了国内加速镜 『Linux Lab Disk - 泰晓 Linux 实验盘』已经支持如下功能: * 可选容量 - * 覆盖 32G, 64G, 128G, 256G, 512G, 1T, 2T 等,可按需定制任意容量 + * 覆盖 32G, 64G, 128G, 256G, 512G, 1T, 2T, 4T 等,可按需定制任意容量 +* 可选形态 + * 高速或固态 U 盘、Mini 移动硬盘、固态硬盘(含 NVME / SATA) * 可选系统 * 覆盖全球 Top6 发行版,可按需定制更多 Linux 发行版 - * Ubuntu 18.04-22.04, Deepin 20.05+, Fedora 34+, Mint 20.2+, Kali, Manjaro + * Ubuntu 18.04-22.04, Deepin 20.08+, Fedora 37+, Mint 21.1+, Kali, Manjaro * 主要特性 * 随身携带:支持在 64 位 X86 台式机、笔记本和 macBook 上即插即跑 - * 智能启动:在 Windows, Linux 和 macOS 系统下自动检测后并行启动 - * 智能切换:在 Windows, Linux 和 macOS 系统下自动检测并免关机切换系统 + * 智能启动:在 Windows, Linux 系统下自动检测后并行启动 + * 智能切换:在 Windows, Linux 系统下自动检测并免关机切换系统 * 相互套娃:多支盘可相互启动或来回切换,可同时使用多个不同的 Linux 系统发行版 * 时区兼容:自动兼容 Windows, MacOS 和 Linux 的时区设定,跟主系统来回任意切换后时间保持一致 * 自动共享:在 Windows 或 Linux 主系统下并行运行时,自动提供多种与主系统的文件与粘贴板共享方式 * 透明倍容:可用容量翻倍,128G 可以当 ~256G 左右使用 * 零损编译:扩大可用容量,提升编译速度,节省擦写寿命 - * 出厂恢复:在主系统出现某些故障的情况下,允许恢复出厂系统 + * 出厂恢复:在主系统出现某些故障的情况下,允许恢复出厂系统,也支持按需配置备份和还原功能 * 即时实验,集成多套自研实验环境,可在 1 分钟内开展 Linux 内核、嵌入式 Linux、U-Boot、汇编、C、Python、数据库、网络等实验 * 购买地址 - * [泰晓开源小店][022],该地址为目前唯一官方在线销售地址 + * [泰晓开源小店][022],该地址为目前泰晓社区官方唯一淘宝销售地址 + * 泰晓科技 B 站工房,关注 B 站的 [泰晓科技](https://space.bilibili.com/687228362) 账号,即可进工房选购 * 产品详情 * * 详细介绍了特性、功能与用法,配套了大量的演示视频 @@ -967,10 +970,12 @@ Linux Lab 是一套完备的嵌入式 Linux 开发环境,需要预留足够的 #### 3.1.2.3 如何选购 -所有适配过的开发板,包括真实开发板与虚拟开发板(即 Linux Lab BSP),都会统一放置在 [泰晓开源小店][023] 供大家选购,选购完毕后可以加微信号 `tinylab` 申请进入相应的技术群组。 +所有适配过的开发板,包括真实开发板与虚拟开发板(即 Linux Lab BSP),都会统一放置在 [泰晓开源小店][023] 或 [泰晓 B 站工房](https://space.bilibili.com/687228362) 供大家选购,选购完毕后可以加微信号 `tinylab` 申请进入相应的技术群组。 也可以直接在淘宝手机 App 内搜索 “泰晓 Linux” 后购买,可搭配店内的 “Linux Lab Disk” 一起使用,用上 “Linux Lab Disk” 后就完全不需要安装独立的 Linux 开发环境。 +为了便利大家开展不同架构处理器 Linux 内核与嵌入式 Linux 系统的学习,泰晓社区于近日推出了泰晓 RISC-V 实验盘、泰晓 ARM 实验盘、泰晓 X86 实验盘、泰晓 LoongArch 实验盘等特定架构实验盘,分别内置了特定架构的虚拟开发板。 + ### 3.1.3 以插件方式使用 Linux Lab 支持“插件”功能,允许在独立的 git 仓库中添加和维护开发板。采用独立的仓库维护可以确保 Linux Lab 在支持愈来愈多的开发板的同时,自身的代码体积不会变得太大。 diff --git a/boards/loongarch64/virt/Makefile b/boards/loongarch64/virt/Makefile index 08992dbf04c136aef1a7a95d5b22e02e54d201ee..0e09086d8956a0d7be74ebc0b2edadf6e62ee9e9 100644 --- a/boards/loongarch64/virt/Makefile +++ b/boards/loongarch64/virt/Makefile @@ -8,19 +8,24 @@ SERIAL ?= ttyS0,115200 QEMU ?= v8.0.2 -NETDEV_LIST ?= e1000 +NETDEV_LIST ?= e1000 e1000e ne2k_pci rtl8139 NETDEV ?= e1000 -LINUX ?= v6.5.4 +LINUX ?= v6.6 HOST_GCC := 9 # no buildroot support for loongarch currently, use nolibc initrd by default -NOLIBC := $(or $(NOLIBC),1) +NOLIBC := $(or $(NOLIBC),0) ROOTDEV_LIST := /dev/ram0 /dev/nfs ROOTDEV ?= /dev/ram0 +BUILDROOT ?= 2023.08.2 +ROOTFS ?= $(BSP_ROOT)/$(BUILDROOT)/rootfs.cpio.gz +FSTYPE ?= ext2 +HROOTFS ?= $(BSP_ROOT)/$(BUILDROOT)/rootfs.$(FSTYPE) + # download from https://github.com/loongson/Firmware/tree/main/LoongArchVirtMachine BIOS ?= $(BSP_BIOS)/edk2/edk2-loongarch64-code.fd diff --git a/boards/loongarch64/virt/README.md b/boards/loongarch64/virt/README.md index 03d988cd85b57d3bc93df87ba2aaf67c1142a27d..8a309261c1270d298bfc25e72270fb8c9e8ffeee 100644 --- a/boards/loongarch64/virt/README.md +++ b/boards/loongarch64/virt/README.md @@ -9,6 +9,10 @@ $ make boot +## Boot me with NFS rootfs + + $ make boot ROOTDEV=nfs + ## Debug with qemu Debug interactively: diff --git a/boards/riscv64/tiny-riscv-box/bsp b/boards/riscv64/tiny-riscv-box/bsp index 3ada334bc770d70527d6b940e57e88021b5d4922..50f29c4df56a667f28df12606aebd2b4d98d38df 160000 --- a/boards/riscv64/tiny-riscv-box/bsp +++ b/boards/riscv64/tiny-riscv-box/bsp @@ -1 +1 @@ -Subproject commit 3ada334bc770d70527d6b940e57e88021b5d4922 +Subproject commit 50f29c4df56a667f28df12606aebd2b4d98d38df diff --git a/src/examples/assembly/riscv64/riscv64-hello-reboot.s b/src/examples/assembly/riscv64/riscv64-hello-reboot.s new file mode 100644 index 0000000000000000000000000000000000000000..c298715fbb92c6db5c428467cc340128ec55a2d5 --- /dev/null +++ b/src/examples/assembly/riscv64/riscv64-hello-reboot.s @@ -0,0 +1,34 @@ +# +# Ref: https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md +# __NR_write, __NR_exit defined include/uapi/asm-generic/unistd.h, /usr/include/asm-generic/unistd.h +# + + .text + .globl _start +_start: + # write(1, msg, len) + li a0, 1 # write to stdout + la a1, msg # load msg + lw a2, len # length of the msg + + li a7, 64 # __NR_write + ecall + + # reboot, based on tools/include/nolibc/sys.h + li a0, 0xfffffffffee1dead + li a1, 0x28121969 + li a2, 0x4321fedc + li a3, 0 + li a7, 142 + ecall + + li a0, 0 # return 0 + li a7, 93 # __NR_exit + ecall + + .section .rodata +msg: + .string "Hello, RISC-V 64 and Poweroff!\n" + +len: + .word . - msg diff --git a/src/examples/assembly/riscv64/riscv64-hello.s b/src/examples/assembly/riscv64/riscv64-hello.s index 312e4050b6ecea8651d946eb5346df1baaa7e6dd..1a336f775356929ab92ec0b8a57fe0f036a37732 100644 --- a/src/examples/assembly/riscv64/riscv64-hello.s +++ b/src/examples/assembly/riscv64/riscv64-hello.s @@ -14,16 +14,6 @@ _start: li a7, 64 # __NR_write ecall -#ifdef __NOLIBC__ - # reboot, based on tools/include/nolibc/sys.h - li a0, 0xfffffffffee1dead - li a1, 0x28121969 - li a2, 0x4321fedc - li a3, 0 - li a7, 142 - ecall -#endif - li a0, 0 # return 0 li a7, 93 # __NR_exit ecall diff --git a/src/modules/ldt/Makefile b/src/modules/ldt/Makefile index dc6023d7b7cd2feafdd3a789b3e208804bd84033..48d6624dc3a255a27bbd3bb8fb7a5243cd746374 100644 --- a/src/modules/ldt/Makefile +++ b/src/modules/ldt/Makefile @@ -13,15 +13,15 @@ obj-m+= ldt.o #obj-m+= ldt_configfs_basic.o obj-m+= kthread_sample.o -KERNELDIR ?= /lib/modules/$(shell uname -r)/build +KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build all: modules dio modules: - $(MAKE) -C $(KERNELDIR) M=$$PWD modules + $(MAKE) -C $(KERNEL_SRC) M=$$PWD modules modules_install: - $(MAKE) -C $(KERNELDIR) M=$$PWD modules_install + $(MAKE) -C $(KERNEL_SRC) M=$$PWD modules_install clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules.order Module.symvers dio *.tmp *.log diff --git a/tools/kernel/feature-patch.sh b/tools/kernel/feature-patch.sh index 0c889c804456aa1e48fbfc68c3a398ef0aacef09..d173759fd82b11db9d12760668722108ab70540d 100755 --- a/tools/kernel/feature-patch.sh +++ b/tools/kernel/feature-patch.sh @@ -112,10 +112,11 @@ do [ $? -eq 0 ] && continue if [ -f "$p" ]; then - patch -r- -N -l -d ${KERNEL_SRC} -p1 < "$p" - if [ $? -ne 0 ]; then - grep -iq "GIT binary patch" $p - [ $? -eq 0 ] && pushd ${KERNEL_SRC} >/dev/null && git apply -p1 < "$p" && popd >/dev/null + grep -iq "GIT binary patch" $p + if [ $? -eq 0 ]; then + pushd ${KERNEL_SRC} >/dev/null && git apply -p1 < "$p" && popd >/dev/null + else + patch -r- -N -l -d ${KERNEL_SRC} -p1 < "$p" fi fi done #p diff --git a/tools/kernel/patch.sh b/tools/kernel/patch.sh index eade46429575a56a4190b0032856f2ba316beea4..26aa7bea6106f8dbc38623cb7cfc248b44bd59ec 100755 --- a/tools/kernel/patch.sh +++ b/tools/kernel/patch.sh @@ -44,10 +44,11 @@ do [ $? -eq 0 ] && continue if [ -f "$p" ]; then - patch -r- -N -l -d ${KERNEL_SRC} -p1 < "$p" - if [ $? -ne 0 ]; then - grep -iq "GIT binary patch" $p - [ $? -eq 0 ] && pushd ${KERNEL_SRC} >/dev/null && git apply -p1 < "$p" && popd >/dev/null + grep -iq "GIT binary patch" "$p" + if [ $? -eq 0 ]; then + pushd ${KERNEL_SRC} >/dev/null && git apply -p1 < "$p" && popd >/dev/null + else + patch -r- -N -l -d ${KERNEL_SRC} -p1 < "$p" fi fi done diff --git a/tools/qemu/patch.sh b/tools/qemu/patch.sh index 7ab23a15ea0df52a025a23a386169fe288d9cc32..aeaf91a3b95ca8af42a80dd18626f59fe2ee45e5 100755 --- a/tools/qemu/patch.sh +++ b/tools/qemu/patch.sh @@ -39,7 +39,12 @@ do [ $? -eq 0 ] && continue if [ -f "$p" ]; then - patch -r- -N -l -d ${QEMU_SRC} -p1 < "$p" + grep -iq "GIT binary patch" $p + if [ $? -eq 0 ]; then + pushd ${QEMU_SRC} >/dev/null && git apply -p1 < "$p" && popd >/dev/null + else + patch -r- -N -l -d ${QEMU_SRC} -p1 < "$p" + fi fi done diff --git a/tools/root/install.sh b/tools/root/install.sh index df7dea23c40c5d32745af72c995fe43b722d7721..aa0f9c7daa9caaf3e02bf82dc7b40e6ab29d5c16 100755 --- a/tools/root/install.sh +++ b/tools/root/install.sh @@ -9,16 +9,18 @@ TOP_DIR=$(cd $(dirname $0)/../../ && pwd) TOP_SRC=${TOP_DIR}/src [ -z "$SYSTEM" ] && SYSTEM=$TOP_SRC/system -echo "LOG: SYSTEM: $SYSTEM" -# The rootdir -#ROOTDIR=$1 -[ -z "$ROOTDIR" ] && echo "LOG: target ROOTDIR can not be empty" && exit 1 -echo "LOG: ROOTDIR: $ROOTDIR" - -for f in `find $SYSTEM -type f | sed -e "s%$SYSTEM%%g"` +# Override in this order: src/system src/overlay $(BSP_ROOT)/overlay $(BSP_ROOT)/$(BUILDROOT)/overlay +for sys in $SYSTEM do - dest=`dirname $f` - [ ! -d $ROOTDIR/$dest ] && mkdir -p $ROOTDIR/$dest - cp --remove-destination $SYSTEM/$f $ROOTDIR/$f + echo "LOG: SYSTEM: $sys" + + # The rootdir + [ -z "$ROOTDIR" ] && echo "LOG: target ROOTDIR can not be empty" && exit 1 + echo "LOG: ROOTDIR: $ROOTDIR" + + # Copy everything, including devices (recreate) + if [ -d "$sys" ]; then + sudo rsync -au $sys/* $ROOTDIR/ + fi done diff --git a/tools/root/patch.sh b/tools/root/patch.sh index ccb424b02231bdd97a5aab8566e8ba93d57a8cf5..b423570c72c0fcdab825ad01bda5787e51bbe45a 100755 --- a/tools/root/patch.sh +++ b/tools/root/patch.sh @@ -34,7 +34,12 @@ do [ $? -eq 0 ] && continue if [ -f "$p" ]; then - patch -r- -N -l -d ${ROOT_SRC} -p1 < "$p" + grep -iq "GIT binary patch" $p + if [ $? -eq 0 ]; then + pushd ${ROOT_SRC} >/dev/null && git apply -p1 < "$p" && popd >/dev/null + else + patch -r- -N -l -d ${ROOT_SRC} -p1 < "$p" + fi fi done diff --git a/tools/uboot/patch.sh b/tools/uboot/patch.sh index 010030b87b19264101d93fb4b5c110f8497a6010..89bd508a4a2b1f2befc844a8960bcc6f33c17c77 100755 --- a/tools/uboot/patch.sh +++ b/tools/uboot/patch.sh @@ -39,7 +39,12 @@ do [ $? -eq 0 ] && continue if [ -f "$p" ]; then - patch -r- -N -l -d ${UBOOT_SRC} -p1 < "$p" + grep -iq "GIT binary patch" $p + if [ $? -eq 0 ]; then + pushd ${UBOOT_SRC} >/dev/null && git apply -p1 < "$p" && popd >/dev/null + else + patch -r- -N -l -d ${UBOOT_SRC} -p1 < "$p" + fi fi done