Rockchip RK3399 - busybox 1.36.0制作根文件系统
在《Mini2440
之linux
根文件系统yaffs2
移植》文章中我们已经介绍了根文件系统的概念以及制作过程,不过当时是制作的是yaffs2
类型的根文件系统,适用于外部设备Nand Flash
,这一节我们将尝试制作ramdisk
、ext4
类型的根文件系统。
一、 编译busybox
1.1 下载源码
根文件系统是通过busybox
来制作的。下载地址:https://busybox.net/downloads/
。
这里我们以1.36.
0版本为例进行编译安装介绍:
注意:一般你使用什么版本的交叉编译器来编译linux
内核时,文件系统中的所有程序也要使用同样的交叉编译器来编译。
下载完成后解压:
root@ubuntu:/work/sambashare/rk3399# mkdir rootfs
root@ubuntu:/work/sambashare/rk3399# cd rootfs
root@ubuntu:/work/sambashare/rk3399/rootfs# wget https://busybox.net/downloads/busybox-1.36.0.tar.bz2
tar
root@ubuntu:/work/sambashare/rk3399/rootfs# tar -jxf busybox-1.36.0.tar.bz2
1.2 配置busybox
在路径busybox-1.36.0
下运行如下命令,使用默认配置:
root@ubuntu:/work/sambashare/rk3399/rootfs# cd busybox-1.36.0/
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox-1.36.0# make defconfig
然后进入图像化配置页面,修改配置 :
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox-1.36.0# make menuconfig
进入Busybox Settings
,配置如下参数:
Settings --->
(/usr/local/arm/12.2.1/bin/arm-linux-) Cross compile prefix
( -march=armv8-a) additional CFLAGS
( ) Path to sysroot # 根路径未指定
[ ] Build static binary (no shared libs)
[*] Build Shared libbusybox
(./_install) Destination path for 'make install'
编译方式有两种:
- 第一种是以静态方式编译,即生成的
busybox
不需要动态库的支持就能运行。这样做我们就不需要部署动态库了,缺点就是自己写的程序在这个根文件系统中是不能运行的,因为缺少动态库库的支持。 - 第二种方式使用动态编译,这样的话我们就需要部署动态库了,在
linux
动态库文件是以so
为后缀,而windows
下文件是以dll
为后缀。
这里我们指定了 arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu
交叉编译工具链的路径,有关交叉编译工具链的安装可以参考我们这两篇博客;
继续配置:
Linux System Utilities --->
[] nsenter
Coreutils --->
[] sync
Miscellaneous Utilities --->
自己选择
Networking Utilities --->
[*] Support /etc/networks
[*] udhcpc (24 kb)
[*] Verify that the offered address is free, using ARP ping
[*] Do not pass malformed host and domain names
(/usr/share/udhcpc/default.script) Absolute path to config script
(/usr/share/udhcpc/default6.script) Absolute path to config script for IPv6
Linux System Utilities --->
[*] mdev (17 kb)
[*] hexdump
Linux Module Utilities --->
[*] depmod (27 kb)
[*] Support module.aliases file
[*] Support module.symbols file
(/lib/modules) Default directory containing modules
(modules.dep) Default name of modules.dep
1.3 编译安装
运行命令:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox-1.36.0# make
然后查看当前路径下是否存在busybox
:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox-1.36.0# ll busybox
-rwxr-xr-x 1 root root 1119768 May 19 19:28 busybox*
执行make install
:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox-1.36.0# make install
make install
的目的就是将编译生成的可执行程序及其依赖的库文件、配置文件、头文件安装到当前系统中指定(一般都可以自己指定安装到哪个目录下,如果不指定一般都有个默认目录)的目录下,默认被安装到_install
目录下:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox-1.36.0# ll _install/
drwxr-xr-x 2 root root 4096 May 19 19:29 bin/
drwxr-xr-x 2 root root 4096 May 19 19:29 lib64/
-rwxr-xr-x 1 root root 67392 May 19 19:28 linuxrc*
drwxr-xr-x 2 root root 4096 May 19 19:29 sbin/
drwxr-xr-x 4 root root 4096 May 19 19:29 usr/
里面有5个文件:bin
、sbin
、usr
这三个目录里都是二进制命令工具,lib64
里面是库文件,这还不足以构成 一个可用的根文件系统,必须进行其它完善工作,才能构建一个可用的根文件系统。
二、 构建根文件系统
新建一个目录用来存放制作的根文件系统,可以命名为busybox_install
。将利用busybox
生成的二进制文件及目录,即_install
目录下的所有文件及目录复制到busybox_install
目录下。
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox-1.36.0# mkdir ../busybox_install
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox-1.36.0# cp -a _install/* ../busybox_install/
2.1 添加库文件
切换到busybox_install
路径下:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox-1.36.0# cd ../busybox_install
找到交叉编译工具里的动态库复制到lib
目录下:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# mkdir lib
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# cp -a /usr/local/arm/12.2.1/aarch64-none-linux-gnu/libc/lib/*so* ./lib/
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# cp -a /usr/local/arm/12.2.1/aarch64-none-linux-gnu/libc/lib64/*so* ./lib64/
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# cp -a /usr/local/arm/12.2.1/aarch64-none-linux-gnu/libc/usr/lib/*so* ./lib/
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# cp -a /usr/local/arm/12.2.1/aarch64-none-linux-gnu/libc/usr/lib64/*so* ./lib64/
-a
表示保留权限,复制软链接本身,递归复制。
查看库文件:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# ls ./lib
ld-linux-aarch64.so.1 libinproctrace.so
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# ls ./lib64/
libanl.so libcrypt.so.1 libhwasan.so.0.0.0 libnss_db.so.2 libstdc++.so.6.0.30-gdb.py
libanl.so.1 libc.so libitm.so libnss_dns.so.2 libthread_db.so
libasan.so libc.so.6 libitm.so.1 libnss_files.so.2 libthread_db.so.1
libasan.so.8 libdl.so.2 libitm.so.1.0.0 libnss_hesiod.so libtsan.so
libasan.so.8.0.0 libgcc_s.so liblsan.so libnss_hesiod.so.2 libtsan.so.2
libatomic.so libgcc_s.so.1 liblsan.so.0 libpcprofile.so libtsan.so.2.0.0
libatomic.so.1 libgfortran.so liblsan.so.0.0.0 libpthread.so.0 libubsan.so
libatomic.so.1.2.0 libgfortran.so.5 libmemusage.so libresolv.a libubsan.so.1
libBrokenLocale.so libgfortran.so.5.0.0 libm.so libresolv.so libubsan.so.1.0.0
libBrokenLocale.so.1 libgomp.so libm.so.6 libresolv.so.2 libutil.so.1
libbusybox.so.1.36.0 libgomp.so.1 libnsl.so.1 librt.so.1
libc_malloc_debug.so libgomp.so.1.0.0 libnss_compat.so libstdc++.so
libc_malloc_debug.so.0 libhwasan.so libnss_compat.so.2 libstdc++.so.6
libcrypt.so libhwasan.so.0 libnss_db.so libstdc++.so.6.0.30
这里只是拷贝动态链接库。一般开发程序使用动态编译需要板子上动态库的支持才能运行,所以拷贝动态库。
2.2 构建etc
目录
初始化配置脚本放在在/etc
目录下,用于系统启动所需的初始化配置脚本。
busybox
提供了一些初始化范例脚本,在examples/bootfloppy/etc/
目录下:
root@ubuntu:/work/sambashare/rk3399/rootfs# cd busybox-1.36.0/
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox-1.36.0# ll examples/bootfloppy/etc/
-rw-r--r-- 1 root root 33 Jan 3 22:17 fstab
drwxr-xr-x 2 root root 4096 Jan 3 22:17 init.d/
-rw-r--r-- 1 root root 100 Jan 3 22:17 inittab
-rw-r--r-- 1 root root 133 Jan 3 22:17 profile
在busybox_install
目录,创建etc
文件夹:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# mkdir etc
将这些配置文件复制到新制作的根文件系统etc
目录下。
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# cp -a ../busybox-1.36.0/examples/bootfloppy/etc/* ./etc
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# ll etc
-rw-r--r-- 1 root root 33 Jan 3 22:17 fstab
drwxr-xr-x 2 root root 4096 Jan 3 22:17 init.d/
-rw-r--r-- 1 root root 100 Jan 3 22:17 inittab
-rw-r--r-- 1 root root 133 Jan 3 22:17 profile
2.2.1 修改/etc/inittab
文件
/etc/inittab
文件是init
进程解析的配置文件,通过这个配置文件决定执行哪个进程,何时执行。
将文件修改为:
# 系统启动时
::sysinit:/etc/init.d/rcS
# 系统启动按下Enter键时
::askfirst:-/bin/sh
# 按下Ctrl+Alt+Del键时
::ctrlaltdel:/sbin/reboot
# 系统关机时
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
# 系统重启时
::restart:/sbin/init
以上内容定义了系统启动时,关机时,重启时,按下Ctrl+Alt+Del
键时执行的进程。
2.2.2 修改/etc/fstab
/etc/fstab
文件存放的是文件系统信息。在系统启动后执行/etc/init.d/rcS
文件里/bin/mount -a
命令时,自动挂载这些文件系统。
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
这里我们挂载的文件系统有三个proc
、sysfs
和tmpfs
,在内核中proc
和sysfs
默认都支持,而tmpfs
是没有支持的,我们需要添加tmpfs
的支持。
2.2.3 修改/etc/profile
文件
/etc/profile
文件作用是设置环境变量,每个用户登录时都会运行它,将文件内容修改为:
# 主机名
export HOSTNAME=NanoPC-T4 # NanoPC-T6
# 用户名
export USER=root
# 用户目录
export HOME=/root
# 终端默认提示符
export PS1="[$USER@$HOSTNAME:\$PWD]\# "
# 环境变量
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
# 动态库路径
export LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
2.2.4 新建 S40network
需要创建/etc/init.d/S40network
文件:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# vim etc/init.d/S40network
内容如下:
#!/bin/sh
#
# Start the network....
#
# Debian ifupdown needs the /run/network lock directory
mkdir -p /run/network
case "$1" in
start)
printf "Starting network: "
/sbin/ifup -a
[ $? = 0 ] && echo "OK" || echo "FAIL"
;;
stop)
printf "Stopping network: "
/sbin/ifdown -a
[ $? = 0 ] && echo "OK" || echo "FAIL"
;;
restart|reload)
"$0" stop
"$0" start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
2.2.5 udhcpc
配置
拷贝文件simple.script
到根文件系统的/usr/share/udhcpc/
目录下,更名为default.script
;
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# mkdir -p ./usr/share/udhcpc
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# cp ../busybox-1.36.0/examples/udhcp/simple.script ./usr/share/udhcpc
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# mv ./usr/share/udhcpc/simple.script ./usr/share/udhcpc/default.script
再将default.script
中RESOLV_CONF=”/etc/resolv.conf”
更改为RESOLV_CONF=”/tmp/resolv.conf”
;
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# vim ./usr/share/udhcpc/default.script
RESOLV_CONF="/tmp/resolv.conf"
......
我们配置一下网络DHCP
,这样系统启动以后就会自动设置好网络;
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# mkdir -p etc/network/interfaces.d
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# vim etc/network/interfaces
# interface file auto-generated by buildroot
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# mkdir etc/network/if-down.d
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# vim etc/network/if-down.d/dhcp-down.sh
#!/bin/sh
# This file is executed by ifupdown in pre-up, post-up, pre-down and
# post-down phases of network interface configuration.
# run this script only for interfaces which have dhcp-down option
[ -z "$IF_DHCP_DOWN" ] && exit 0
$IF_DHCP_DOWN $IFACE
exit 0
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# mkdir etc/network/if-up.d
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# vim etc/network/if-up.d/dhcp-up.sh
#!/bin/sh
# This file is executed by ifupdown in pre-up, post-up, pre-down and
# post-down phases of network interface configuration.
# run this script only for interfaces which have dhcp-up option
[ -z "$IF_DHCP_UP" ] && exit 0
$IF_DHCP_UP $IFACE&
exit 0
2.2.6 修改/etc/init.d/rcS
文件
#!/bin/sh
# 挂载 /etc/fstab 中定义的所有文件系统
/bin/mount -a
# 挂载虚拟的devpts文件系统用于用于伪终端设备
/bin/mkdir -p /dev/pts
/bin/mount -t devpts devpts /dev/pts
# 扫描并创建节点
/sbin/mdev -s
# 加载网卡驱动
/sbin/modprobe r8125
# 配置网络
/sbin/udhcpc
# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do
# Ignore dangling symlinks (if any).
[ ! -f "$i" ] && continue
case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set start
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i start
;;
esac
done
整个udhcpc
的框架是可执行文件/sbin/udhcpc
、脚本文件/usr/share/udhcpc/default.script
、DNS
配置文件/tmp/resolv.conf
。在rcS
中启动udhcpc
,默认使用default.script
脚本已达到自动配置ip
、route
等。
修改init.d
文件权限:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# chmod -R 777 etc/init.d/*
2.3 安装网卡驱动
从此我们以 NanoPC-T6
开发板为例介绍网卡驱动安装,首先我们需要给开发板烧录官方提供的debian-bullseye-desktop
系统,开发板启动后我们需要拷贝debian-bullseye-desktop
系统重网卡相关驱动和固件到busybox
文件系统;
root@ubuntu:/work/sambashare/rk3588/rootfs$ mkdir lib
在宿主机执行如下命令:
root@ubuntu:/work/sambashare/rk3588/rootfs$ scp -r pi@192.168.0.100:/lib/modules ./lib
root@ubuntu:/work/sambashare/rk3588/rootfs$ scp -r pi@192.168.0.100:/lib/firmware ./lib
查看文件:
root@ubuntu:/work/sambashare/rk3588/rootfs$ ls lib/modules/6.1.25/
cryptodev.ko modules.builtin.bin modules.softdep rtl8821CU.ko rtw_8723du.ko rtw_8822bs.ko rtw_sdio.ko
kernel modules.builtin.modinfo modules.symbols rtl8822bu.ko rtw_8821ce.ko rtw_8822ce.ko rtw_usb.ko
modules.alias modules.dep modules.symbols.bin rtl8822cs.ko rtw_8821c.ko rtw_8822c.ko
modules.alias.bin modules.dep.bin nft_fullcone.ko rtw_8723de.ko rtw_8821cs.ko rtw_8822cs.ko
modules.builtin modules.devname r8125.ko rtw_8723d.ko rtw_8822be.ko rtw_core.ko
modules.builtin.alias.bin modules.order rtl8812au.ko rtw_8723ds.ko rtw_8822b.ko rtw_pci.ko
zhengyang@ubuntu:/work/sambashare/rk3588$ ls lib/firmware/
brcm iwlwifi-cc-a0-59.ucode mediatek mt7662_rom_patch.bin regulatory.db.p7s rtl_bt rtw88
intel mali_csffw.bin mt7662.bin regulatory.db rockchip rtl_nic
由于lib
目录下文件比较多,如果都复制到我们制作的根文件系统中,那我们就得重新调整如下参数;
- 内核配置参数:
RAM disk size
; buildroot配置参数:
exact size
;- 分区表
parameter.txt
;
否则系统启动可能出现如下异常:
[ 6.323929] BUG: Bad page state in process kworker/u16:2 pfn:10400
[ 6.323943] page:(____ptrval____) refcount:0 mapcount:-128 mapping:0000000000000000 index:0x4 pfn:0x10400
[ 6.323953] flags: 0x0(zone=0) CMA
[ 6.323964] raw: 0000000000000000 dead000000000100 dead000000000122 0000000000000000
[ 6.323973] raw: 0000000000000004 000000000000000a 00000000ffffff7f 0000000000000000
[ 6.323978] page dumped because: nonzero mapcount
[ 6.323983] Modules linked in:
[ 6.323992] CPU: 4 PID: 71 Comm: kworker/u16:2 Not tainted 6.1.25 #4
[ 6.324001] Hardware name: FriendlyElec NanoPC-T6 (DT)
[ 6.324007] Workqueue: events_unbound async_run_entry_fn
[ 6.324020] Call trace:
[ 6.324025] dump_backtrace+0xdc/0x130
[ 6.324039] show_stack+0x1c/0x30
[ 6.324050] dump_stack_lvl+0x64/0x7c
[ 6.324061] dump_stack+0x14/0x2c
[ 6.324071] bad_page+0xe8/0x110
[ 6.324080] free_page_is_bad_report+0x84/0x8c
[ 6.324089] free_pcppages_bulk+0x1d0/0x284
[ 6.324098] free_unref_page_commit+0x168/0x1b0
[ 6.324107] free_unref_page+0x128/0x1a0
[ 6.324116] __free_pages+0xf8/0x104
[ 6.324125] free_reserved_area+0x88/0x14c
[ 6.324135] free_initrd_mem+0x48/0x54 # free_initrd_mem
[ 6.324144] do_populate_rootfs+0x12c/0x16c
[ 6.324151] async_run_entry_fn+0x3c/0x170
[ 6.324158] process_one_work+0x1c8/0x3d0
[ 6.324169] worker_thread+0x74/0x414
[ 6.324178] kthread+0xdc/0xe0
[ 6.324187] ret_from_fork+0x10/0x20
[ 6.324196] Disabling lock debugging due to kernel taint
为此,这里我们仅仅复制网卡驱动到/lib/modules
目录下。
接着我们需要将网卡驱动拷贝到/lib/modules
目录下;
root@ubuntu:/work/sambashare/rk3588/rootfs$ cd busybox_install
root@ubuntu:/work/sambashare/rk3588/rootfs/busybox_install$ mkdir -p ./lib/modules/6.1.25
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install$ cp -a ../lib/modules/6.1.25/*.ko ./lib/modules/6.1.25
注意:位于busybox
系统/lib/modules
目录下的驱动模块在内核启动的时候并不会自动加载,因此我们才在/etc/init.d/rcS
中使用modprobe
去加载了r8125.ko
驱动;
root@ubuntu:/work/sambashare/rk3588/rootfs$ ls busybox_install/lib/modules
cryptodev.ko rtl8812au.ko rtl8822cs.ko rtw_8723ds.ko rtw_8821c.ko rtw_8822b.ko rtw_8822c.ko rtw_pci.ko
nft_fullcone.ko rtl8821CU.ko rtw_8723de.ko rtw_8723du.ko rtw_8821cs.ko rtw_8822bs.ko rtw_8822cs.ko rtw_sdio.ko
r8125.ko rtl8822bu.ko rtw_8723d.ko rtw_8821ce.ko rtw_8822be.ko rtw_8822ce.ko rtw_core.ko rtw_usb.ko
root@ubuntu:/work/sambashare/rk3588/rootfs$ vim busybox_install/etc/init.d/rcS
......
# 加载网卡驱动
/sbin/modprobe r8125
......
2.4 构建dev
目录
在rootfs
目录,创建dev
文件夹:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# mkdir dev
创建终端文件:
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# mknod dev/console c 5 1
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# mknod dev/null c 1 3
2.5 构建其他文件
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# mkdir mnt proc tmp sys root
root@ubuntu:/work/sambashare/rk3399/rootfs/busybox_install# ll
drwxr-xr-x 2 root root 4096 May 19 19:29 bin/
drwxr-xr-x 2 root root 4096 May 19 20:33 dev/
drwxr-xr-x 3 root root 4096 May 19 20:32 etc/
drwxr-xr-x 2 root root 4096 May 19 20:20 lib/
drwxr-xr-x 2 root root 4096 May 19 20:21 lib64/
-rwxr-xr-x 1 root root 67392 May 19 19:28 linuxrc*
drwxr-xr-x 2 root root 4096 May 19 20:33 mnt/
drwxr-xr-x 2 root root 4096 May 19 20:33 proc/
drwxr-xr-x 2 root root 4096 May 19 20:33 root/
drwxr-xr-x 2 root root 4096 May 19 19:29 sbin/
drwxr-xr-x 2 root root 4096 May 19 20:33 sys/
drwxr-xr-x 2 root root 4096 May 19 20:33 tmp/
drwxr-xr-x 4 root root 4096 May 19 19:29 usr/
三、制作根文件系统镜像
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-05-29 嵌入式Linux编程之交叉编译
2021-05-29 嵌入式Linux开发环境搭建