程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

Rockchip RK3399 - busybox 1.36.0制作根文件系统

在《Mini2440linux根文件系统yaffs2移植》文章中我们已经介绍了根文件系统的概念以及制作过程,不过当时是制作的是yaffs2类型的根文件系统,适用于外部设备Nand Flash,这一节我们将尝试制作ramdiskext4类型的根文件系统。

一、 编译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个文件:binsbinusr这三个目录里都是二进制命令工具,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

这里我们挂载的文件系统有三个procsysfstmpfs,在内核中procsysfs默认都支持,而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.scriptRESOLV_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.scriptDNS配置文件/tmp/resolv.conf。在rcS中启动udhcpc,默认使用default.script脚本已达到自动配置iproute等。

修改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-30I*B1
2024-01-28*兴20
2024-02-01QYing20
2024-02-11*督6
2024-02-18一*x1
2024-02-20c*l18.88
2024-01-01*I5
2024-04-08*程150
2024-04-18*超20
2024-04-26.*V30
2024-05-08D*W5
2024-05-29*辉20
2024-05-30*雄10
2024-06-08*:10
2024-06-23小狮子666
2024-06-28*s6.66
2024-06-29*炼1
2024-06-30*!1
2024-07-08*方20
2024-07-18A*16.66
2024-07-31*北12
2024-08-13*基1
2024-08-23n*s2
2024-09-02*源50
2024-09-04*J2
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-26B*h10
2024-09-3010
2024-10-02M*i1
2024-10-14*朋10
2024-10-22*海10
2024-10-23*南10
2024-10-26*节6.66
2024-10-27*o5
2024-10-28W*F6.66
2024-10-29R*n6.66
2024-11-02*球6
2024-11-021*鑫6.66
2024-11-25*沙5
2024-11-29C*n2.88
posted @   大奥特曼打小怪兽  阅读(1724)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-05-29 嵌入式Linux编程之交叉编译
2021-05-29 嵌入式Linux开发环境搭建
如果有任何技术小问题,欢迎大家交流沟通,共同进步

公告 & 打赏

>>

欢迎打赏支持我 ^_^

最新公告

程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)。

了解更多

点击右上角即可分享
微信分享提示