• 嵌入式系统移植三步曲 翟长伟


    嵌入式三部曲Bootloader移植-Linux移植根文件系统的移植

    一、                 Bootloader移植

       交叉编译器:arm-linux-gcc2.95.3

    1.解压u-boot-1.1.4.tar.bz2

    [root@localhost Desktop]# tar  -xjvf  u-boot-1.1.4.tar.bz2  -C  ./

    [root@localhost Desktop]# cd  u-boot-1.1.4

    2.编辑u-boot目录中的Makefile文件 [root@localhost u-boot-1.1.4]# gedit Makefile

    ifeq ($(ARCH),arm)

    CROSS_COMPILE = arm-linux-

    Endif

    改为

    ifeq ($(ARCH),arm)

    CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-

    endif

     

    smdk2410_config           :           unconfig

               @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

    后面添加

    ok2410_config           :           unconfig

               @./mkconfig $(@:_config=) arm arm920t ok2410 NULL s3c24x0

    3复制必要的文件,编辑ok2410.h头文件

    [root@localhost u-boot-1.1.4]# mkdir board/ok2410

    [root@localhost u-boot-1.1.4]# cp board/smdk2410/* board/ok2410/

    [root@localhost u-boot-1.1.4]# dir board/ok2410/

    [root@localhost u-boot-1.1.4]# mv board/ok2410/smdk2410.c board/ok2410/ok2410.c

    [root@localhost u-boot-1.1.4]# cp include/configs/smdk2410.h include/configs/ok2410.h

    [root@localhost u-boot-1.1.4]# gedit include/configs/ok2410.h

    4.编辑board/ok2410/Makefile文件

    [root@localhost u-boot-1.1.4]# gedit board/ok2410/Makefile

    5.配置、编译u-boot

    [root@localhost u-boot-1.1.4]# make ok2410_config

    Configuring for ok2410 board...

    [root@localhost u-boot-1.1.4]# make

    出现如下错误

    ......

    make -C examples all

    make[1]: Entering directory `/root/Desktop/u-boot-1.1.4/examples'

    /usr/local/arm/2.95.3/bin/arm-linux-gcc -g  -Os   -fno-strict-aliasing  -fno-common -ffixed-r8 -msoft-float  -D__KERNEL__ -DTEXT_BASE=0x33F80000 -I/root/Desktop/u-boot-1.1.4/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/include -pipe  -DCONFIG_ARM -D__ARM__ -march=armv4 -mabi=apcs-gnu -Wall -Wstrict-prototypes -c -o hello_world.o hello_world.c

    cc1: Invalid option `abi=apcs-gnu'

    make[1]: *** [hello_world.o] 错误 1

    make[1]: Leaving directory `/root/Desktop/u-boot-1.1.4/examples'

    make: *** [examples] 错误 2

    解决方法:

    [root@localhost u-boot-1.1.4]# gedit cpu/arm920t/config.mk

    PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)

    改成:

    PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu,))

    [root@localhost u-boot-1.1.4]# make

    接着出现了如下的错误

    ……

    /usr/local/arm/2.95.3/bin/arm-linux-ar crv libstubs.a  stubs.o

    a - stubs.o

    make[1]: *** 没有规则可以创建“all”需要的目标“hello_world.srec”。 停止。

    make[1]: Leaving directory `/root/Desktop/u-boot-1.1.4/examples'

    make: *** [examples] 错误 2

    解决方法:

    [root@localhost u-boot-1.1.4]# gedit examples/Makefile

    [root@localhost u-boot-1.1.4]# make

    [root@localhost u-boot-1.1.4]# ll u-boot*

    6.编辑skyeye.conf文件

    [root@localhost u-boot-1.1.4]# gedit skyeye.conf

    7.执行skyeye1.2.6

    [root@localhost u-boot-1.1.4]# skyeye1.2.6

    8开始移植nand

    [root@localhost u-boot-1.1.4]# gedit cpu/arm920t/start.S

    将从NOR Flash启动改成从NAND Flash启动。

    9修改board/ok2410/Makefile

    [root@localhost u-boot-1.1.4]# gedit board/ok2410/Makefile

    10创建board/ok2410/nand_read.c文件

    [root@localhost u-boot-1.1.4]# gedit board/ok2410/nand_read.c

    11.编辑include/configs/ok2410.h文件

    [root@localhost u-boot-1.1.4]# gedit include/configs/ok2410.h

    12.编译u-boot,然后测试u-boot是否可以从nand启动

    [root@localhost u-boot-1.1.4]# make

    [root@localhost u-boot-1.1.4]# ll u-boot*

    [root@localhost u-boot-1.1.4]# skyeye1.2.6                                    //再次执行skyeye1.2.6

    [root@localhost u-boot-1.1.4]# mknandflashdump u-boot.bin nand.dump 0

    [root@localhost u-boot-1.1.4]# ll nand.dump

    [root@localhost u-boot-1.1.4]# chmod 666 nand.dump

    [root@localhost u-boot-1.1.4]# skyeye1.2.6                                    //再次执行skyeye1.2.6

    13.编辑include/configs/ok2410.h文件

    [root@localhost u-boot-1.1.4]# gedit include/configs/ok2410.h

    再次修改修改在第11(编辑include/configs/ok2410.h文件)修改的内容

    14.编辑board/ok2410/ok2410.c文件

    [root@localhost u-boot-1.1.4]# gedit board/ok2410/ok2410.c

    15修改 common/cmd_nand.c文件

    [root@localhost u-boot-1.1.4]# gedit common/cmd_nand.c

    16编译、测试

    [root@localhost u-boot-1.1.4]# make

    [root@localhost u-boot-1.1.4]# ll u-boot*

    [root@localhost u-boot-1.1.4]# ./mknandflashdump u-boot.bin nand.dump 0

    出现错误:

    bash: ./mknandflashdump: is a directory

    解决方法

    将mknandflashdump文件 复制到当前目录下。

    然后执行skyeye1.2.6:

    [root@localhost u-boot-1.1.4]# skyeye1.2.6

     

    二、Linux移植

    1.解压linux-2.6.14.7.tar.bz2

    [root@localhost Desktop]# tar -xjvf linux-2.6.14.7.tar.bz2 -C ./

    2.编辑Makefile文件

    [root@localhost Desktop]# cd linux-2.6.14.7

    [root@localhost linux-2.6.14.7]# dir

    [root@localhost linux-2.6.14.7]# gedit Makefile

    3复制cs8900

    [root@localhost linux-2.6.14.7]# cp ../cs8900/cs8900.c drivers/net/arm/

    [root@localhost linux-2.6.14.7]# cp ../cs8900/cs8900.h drivers/net/arm/

    [root@localhost linux-2.6.14.7]# ls drivers/net/arm

    4修改drivers/net/arm/目录下的Kconfig文件

    [root@localhost linux-2.6.14.7]# gedit drivers/net/arm/Kconfig

    5修改drivers/net/arm/目录下的Makefile文件,

    [root@localhost linux-2.6.14.7]# gedit drivers/net/arm/Makefile

    6.编辑arch/arm/mach-s3c2410/mach-smdk2410.c文件

    [root@localhost linux-2.6.14.7]# gedit arch/arm/mach-s3c2410/mach-smdk2410.c

    7在include/asm-arm/arch-s3c2410/目录下创建smdk2410.h文件

    [root@localhost linux-2.6.14.7]# gedit include/asm-arm/arch-s3c2410/smdk2410.h

    8设置Flash分区

    (1)编辑devs.c文件

    [root@localhost linux-2.6.14.7]# gedit arch/arm/mach-s3c2410/devs.c

    (2)编辑mach-smdk2410.c文件指定启动时初始化kernel启动时依据对分区的设置进行初始化。

    [root@localhostlinux-2.6.14.7]# gedit arch/arm/mach-s3c2410/mach-smdk2410.c

    (3)编辑s3c2410.c文件

    [root@localhost linux-2.6.14.7]# gedit drivers/mtd/nand/s3c2410.c

    9配置内核

    (1)[root@localhost linux-2.6.14.7]# gedit fs/Kconfig

    (2)配置内核产生.config文件

    [root@localhost linux-2.6.14.7]# cp arch/arm/configs/smdk2410_defconfig .config

    [root@localhost linux-2.6.14.7]# make menuconfig                  //开始配置内核

    保存退出,产生.config文件

    10编译内核

    [root@localhost linux-2.6.14.7]# make

    出现错误:

           make: /usr/local/arm/3.4.1/bin/arm-linux-:命令未找到

           CHK     include/linux/version.h

           SPLIT   include/linux/autoconf.h -> include/config/*

           SYMLINK include/asm-arm/arch -> include/asm-arm/arch-s3c2410

    make[1]: “include/asm-arm/mach-types.h”是最新的。

           CC      arch/arm/kernel/asm-offsets.s

    /bin/sh: /usr/local/arm/3.4.1/bin/arm-linux-: 没有那个文件或目录

    make[1]: *** [arch/arm/kernel/asm-offsets.s] 错误 1

    make: *** [prepare0] 错误 2

    解决方法:

    修改第9步,[root@localhost linux-2.6.14.7]# gedit arch/arm/mach-s3c2410/devs.c

    然后将添加内容 添加到头文件后 。并将Makefile文件中的路径改为绝对路径。

    [root@localhost linux-2.6.14.7]# cp arch/arm/boot/compressed/vmlinux ../u-boot-1.1.4/tools/

    [root@localhost linux-2.6.14.7]# cd ../u-boot-1.1.4/tools/

    [root@localhost tools]# ./mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008000 -n linux-2.6.14.7 -d vmlinux uImage

    [root@localhost tools]# cp uImage  ../

    [root@localhost tools]# cp initrd.img  ../

    [root@localhost tools]# cp uImage /tftpboot/

    [root@localhost tools]# cp initrd.img /tftpboot/

    [root@localhost tools]# cp ../u-boot.bin /tftpboot/

    [root@localhost tools]# cp initrd.img /tmp/nfs/

    [root@localhost tools]#         

    [root@localhost tools]# cd ..

    11.执行skyeye1.2.6

    [root@localhost u-boot-1.1.4]# skyeye1.2.6

    出现错误:

    Starting kernel ...

    Uncompressing Linux........................................................................ done, booting the kernel.

    Error: unrecognized/unsupported machine ID (r1 = 0x00000000).

    Available machine support:

    ID (hex)        NAME

    000000c1        SMDK2410

    Please check your kernel config and/or bootloader.

    解决方法:

    修改内核的arch/arm/kernel/head.S

    首先,在u-boot命令行中执行bdinfo命令查看板卡信息

    OK2410 # bdinfo

    arch_number = 0x000000C1

    env_t       = 0x00000000

    boot_params = 0x30000100

    DRAM bank   = 0x00000000

    -> start    = 0x30000000

    -> size     = 0x04000000

    ethaddr     = 08:00:3E:26:0A:5B

    ip_addr     = 10.0.0.110

    baudrate    = 115200 bps

    OK2410 # 然后,编辑Linux内核的arch/arm/kernel/head.S文件,将s3c2410的参数赋给内核

    [root@localhost linux-2.6.14.7]# gedit arch/arm/kernel/head.S

    ENTRY(stext)

               /************ me add begin ************/

               mov r0, #0

               mov r1, #0xc1

               ldr r2, =0x30000100

               /************ me add end ************/

               msr           cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ ensure svc mode

                                                                      @ and irqs disabled

               bl           __lookup_processor_type                      @ r5=procinfo r9=cpuid

               movs           r10, r5                                            @ invalid processor (r5=0)?

               beq           __error_p                                            @ yes, error 'p'

               bl           __lookup_machine_type                      @ r5=machinfo

               movs           r8, r5                                            @ invalid machine (r5=0)?

               beq           __error_a                                 @ yes, error 'a'

    bl           __create_page_tables

     

    三、根文件系统的移植 1.解压busybox-1.13.4.tar.bz2到桌面

    [root@localhost Desktop]# tar -xjvf busybox-1.13.4.tar.bz2 -C ./

    [root@localhost Desktop]# cd busybox-1.13.4

    [root@localhost busybox-1.13.4]#

    2.编辑Makefile文件

    [root@localhost busybox-1.13.4]# gedit Makefile

    4.进行默认配置

    [root@localhost busybox-1.13.4]# make defconfig                 

    5.对配置信息进行修改

    [root@localhost busybox-1.13.4]# make menuconfig

    设置完毕后,保存、退出。

    6.编译

    [root@localhost busybox-1.13.4]# make

    [root@localhost busybox-1.13.4]# gedit networking/interface.c

    networking/interface.c文件的818行修改.type = -1”,然后再次编译。

    [root@localhost busybox-1.13.4]# make

    [root@localhost busybox-1.13.4]# ll busybox*

    [root@localhost busybox-1.13.4]# make install

    成功,出现如下信息:

    --------------------------------------------------

    You will probably need to make your busybox binary

    setuid root to ensure all configured applets will

    work properly.

    --------------------------------------------------

    解决办法是修改_install/bin/busybox文件的属性。

    [root@localhost busybox-1.13.4]# ll _install/bin/busybox

    [root@localhost busybox-1.13.4]# chmod 4755 ./_install/bin/busybox           //修改busybox属性

    [root@localhost busybox-1.13.4]# ll _install/bin/busybox

    [root@localhost busybox-1.13.4]# ll _install/

    [root@localhost busybox-1.13.4]# cd _install/

    [root@localhost _install]# pwd

    7.对配置信息进行修改

    (1)在/tmp/nfs中创建所需的目录

    [root@localhost nfs]# mkdir -p bin sbin lib/modules etc/init.d dev usr/bin usr/sbin usr/lib proc sys  home root boot mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp var/lib var/lock var/log var/run var/tmp tmp

    [root@localhost nfs]# chmod 1777 tmp

    [root@localhost nfs]# chmod 1777 var/tmp

    [root@localhost nfs]# cd dev/

    [root@localhost dev]# pwd

    [root@localhost dev]# mknod -m 600 console c 5 1

    [root@localhost dev]# mknod -m 666 null c 1 3

    2)复制文件到/tmp/nfs中

    [root@localhost _install]# pwd

    [root@localhost _install]# cp -a bin /tmp/nfs/

    [root@localhost _install]# cp -a sbin /tmp/nfs/

    [root@localhost _install]# ll linuxrc

    [root@localhost _install]# cp -a linuxrc /tmp/nfs/

    [root@localhost _install]# ll /tmp/nfs/linuxrc

    [root@localhost _install]# cd ..

    [root@localhost busybox-1.13.4]# pwd

    [root@localhost busybox-1.13.4]# cp -a examples/bootfloppy/etc/* /tmp/nfs/etc/

    [root@localhost busybox-1.13.4]# ls /tmp/nfs/etc/

    [root@localhost busybox-1.13.4]#

    8.创建配置文件

    1)编写etc/inittab文件、修改其权限

    [root@localhost nfs]# gedit etc/inittab

    [root@localhost nfs]# ll etc/inittab

    [root@localhost nfs]# chmod 755 etc/inittab

    2)编写etc/init.d/rcS文件、修改其权限

    [root@localhost nfs]# gedit etc/init.d/rcS

    [root@localhost nfs]# ll etc/init.d/rcS

    [root@localhost nfs]# chmod 755 etc/init.d/rcS

    3)编写etc/fstab文件、修改其权限

    [root@localhost nfs]# gedit etc/fstab

    [root@localhost nfs]# ll etc/fstab

    [root@localhost nfs]# chmod 755 etc/fstab

    4)编写etc/proflie文件、修改其权限

    [root@localhost nfs]# gedit etc/proflie

    5)创建密码文件、修改其权限

    [root@localhost nfs]# cp /etc/passwd etc/ ;cp /etc/shadow etc/ ;cp /etc/group etc/

    [root@localhost nfs]# chmod 600 etc/shadow

    [root@localhost nfs]# gedit etc/passwd

    内容是:root:x:0:0:root:/root:/bin/sh

    [root@localhost nfs]# gedit etc/shadow

    内容是:root:$1$zs2zr2N4$15U99ll5tUm3DwOvKnCVV1:14335:0:99999:7:::

    [root@localhost nfs]# gedit etc/group

    内容是:root:x:0:root

    6)为mdev创建配置文件

    [root@localhost nfs]# gedit etc/mdev.conf

    内容是:空

    [root@localhost nfs]# ll etc/

    7)删除备份文件

    [root@localhost nfs]# rm etc/*~ etc/init.d/*~

    9.复制常用的文件

    编写脚本文件copy_lib.sh

    [root@localhost nfs]# gedit copy_lib.sh

    [root@localhost nfs]# ll copy_lib.sh

    [root@localhost nfs]# chmod a+x copy_lib.sh

    [root@localhost nfs]# cp copy_lib.sh /usr/local/arm/3.4.1/arm-linux/lib/

    [root@localhost nfs]# cd /usr/local/arm/3.4.1/arm-linux/lib/

    [root@localhost lib]# ./copy_lib.sh

    [root@localhost lib]# cd -

    [root@localhost nfs]# ll lib

    [root@localhost nfs]#

    根文件系统(通过NFS挂载)构建完成。

    10.完整的启动过程(u-boot、内核、文件系统)

    (1)编辑/etc/xinetd.d/tftp文件

    [root@localhost Desktop]# gedit /etc/xinetd.d/tftp

    (2)重启tftp服务器

    [root@localhost Desktop]# service xinetd restart

    (3)编辑/etc/exports文件

    [root@localhost Desktop]# gedit /etc/exports

    (4)重启NFS服务器

    [root@localhost u-boot-1.1.4]# service nfs restart

    [root@localhost u-boot-1.1.4]# exportfs

    [root@localhost u-boot-1.1.4]# exportfs -ra                  //重新扫描配置文件

    (5)完整的启动过程(u-boot、内核、文件系统、用户程序),使用NFS文件系统

    [root@localhost u-boot-1.1.4]# skyeye1.2.6

    (6)完整的启动过程(u-boot、内核、文件系统),使用/dev/mtdblock2中的文件系统

     创建cramfs文件系统

    [root@localhost tmp]# pwd

    [root@localhost tmp]# mkfs.cramfs nfs ok2410.cramfs

    [root@localhost tmp]# ll ok2410.cramfs

    复制ok2410.cramfs到tftp服务器根目录

    [root@localhost tmp]# cp ok2410.cramfs /tftpboot/

    执行skyeye1.2.6,启动系统

    [root@localhost u-boot-1.1.4]# pwd

    [root@localhost u-boot-1.1.4]# skyeye1.2.6

        **************************** WARNING **********************************

    If you want to run ELF image, you should use -e option to indicate

    your elf-format image filename. Or you only want to run binary image,

    you need to set the filename of the image and its entry in skyeye.conf.

    ***********************************************************************

    ……                     //部分启动信息省略

    Hit any key to stop autoboot:  0

    OK2410 # run bootcmd

    TFTP from server 10.0.0.1; our IP address is 10.0.0.110

    Filename 'uImage'.

    Load address: 0x31000000

    Loading: checksum bad

    checksum bad

    #################################################################

             #################################################################

             #################################################################

             ################################

    done

    Bytes transferred = 1161416 (11b8c8 hex)

    ## Booting image at 31000000 ...

       Image Name:   linux-2.6.14.7

       Created:      2009-05-24  11:22:39 UTC

       Image Type:   ARM Linux Kernel Image (uncompressed)

       Data Size:    1161352 Bytes =  1.1 MB

       Load Address: 30008000

       Entry Point:  30008000

       Verifying Checksum ... OK

    OK

     

    Starting kernel ...

     

    Uncompressing Linux.......................................................................... done, booting the kernel.

    Linux version 2.6.14.7 (root@localhost.localdomain) (gcc version 3.4.1) #6 Sun May 24 19:22:08 CST 2009

    CPU: ARM920Tid(wb) [41009200] revision 0 (ARMvundefined/unknown)

    Machine: SMDK2410

    Memory policy: ECC disabled, Data cache writeback

    CPU S3C2410 (id 0x32410000)

    S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz

    S3C2410 Clocks, (c) 2004 Simtec Electronics

    CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on

    CPU0: D VIVT write-back cache

    CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

    CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

    Built 1 zonelists

    Kernel command line: noinitrd root=/dev/nfs rw nfsroot=10.0.0.1:/tmp/nfs ip=10.0.0.110:10.0.0.1:10.0.0.1:255.255.255.0 init=linuxrc console=ttySAC0,115200  mem=64M

    ……                     //部分启动信息省略

    Memory: 64MB = 64MB total

    Memory: 62464KB available (1888K code, 393K data, 92K init)

    ……                     //部分启动信息省略

    JFFS version 1.0, (C) 1999, 2000  Axis Communications AB

    JFFS2 version 2.2. (NAND) (C) 2001-2003 Red Hat, Inc.

    yaffs May 24 2009 19:21:42 Installing.

    Console: switching to colour frame buffer device 80x25

    fb0: Virtual frame buffer device, using 1024K of video memory

    ……                     //部分启动信息省略

    RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize

    Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410)

    eth0: CS8900A rev D at 0xe0000300 irq=53, no eeprom , addr: 08: 0:3E:26:0A:5B

    S3C24XX NAND Driver, (c) 2004 Simtec Electronics

    s3c2410-nand: mapped registers at c4980000

    s3c2410-nand: timing: Tacls 10ns, Twrph0 30ns, Twrph1 10ns

    NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)

    NAND_ECC_NONE selected by board driver. This is not recommended !!

    Scanning device for bad blocks

    Bad eraseblock 7 at 0x0001c000

    Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":

    0x00000000-0x00100000 : "bootloader"

    0x00100000-0x00400000 : "kernel"

    0x00400000-0x02c00000 : "root"

    0x02d00000-0x03c00000 : "user"

    mice: PS/2 mouse device common for all mice

    NET: Registered protocol family 2

    ……                     //部分启动信息省略

    IP-Config: Complete:

          device=eth0, addr=10.0.0.110, mask=255.255.255.0, gw=10.0.0.1,

         host=10.0.0.110, domain=, nis-domain=(none),

         bootserver=10.0.0.1, rootserver=10.0.0.1, rootpath=

    Looking up port of RPC 100003/2 on 10.0.0.1

    Looking up port of RPC 100005/1 on 10.0.0.1

    VFS: Mounted root (nfs filesystem).

    Mounted devfs on /dev

    Freeing init memory: 92K

    #mount all.......

    ******************************************************************

                       OK 2410 Rootfs made by zcw, 2011.06

    ******************************************************************

    zcwlogin:



    http://blog.chinaunix.net/space.php?uid=14735472&do=blog&id=110947





    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(402) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    springMVC入门
    【终极指南】图文详解Chrome插件离线安装方法
    IDM下载器使用方法详解:百度网盘下载,视频会员一网打尽!
    Mac下复制粘贴的快捷键是什么?随记
    华为手机维修点查询终于上线了
    如何将已经安装从chrome扩展程序导出备份为.CRX文件?
    Chrome浏览器 v68.0.3440.106 正式版怎么样?
    Postman插件如何安装
    分享一款非常好用的Fatkun图片批量下载工具
    上海苹果维修点分享苹果电脑MACBOOK故障维修常见案例
  • 原文地址:https://www.cnblogs.com/ztguang/p/12647567.html
Copyright © 2020-2023  润新知