成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Linux內(nèi)核移植入門

tomorrowwu / 1423人閱讀

摘要:表示,不是用壓縮的。兩者的不同之處在于,解壓縮內(nèi)核到低端內(nèi)存第一個(gè),解壓縮內(nèi)核到高端內(nèi)存以上。如果內(nèi)核比較小,那么采用或都行,如果比較大應(yīng)該用。使得內(nèi)核可以啟動(dòng)文件的拷貝或指向的鏈接。

基本概念

linux內(nèi)核特性:

1.可移植性,支持的硬件平臺(tái)廣泛
2.超強(qiáng)的網(wǎng)絡(luò)功能
3.多任務(wù)多用戶系統(tǒng)
4.模塊化的設(shè)計(jì)

五大子系統(tǒng):

1.進(jìn)程管理子系統(tǒng)
2.內(nèi)存管理子系統(tǒng)
3.文件系統(tǒng)子系統(tǒng)
4.網(wǎng)絡(luò)協(xié)議子系統(tǒng)
5.設(shè)備管理子系統(tǒng)

獲取linux內(nèi)核:

1.內(nèi)核官方發(fā)布點(diǎn)
2.芯片廠商提供

內(nèi)核源碼目錄結(jié)構(gòu)

內(nèi)核配置

  1. Makefile 和 make

由主目錄 Makefile 和 子目錄 Makefile 共同指定內(nèi)核的編譯規(guī)則

2.通過 make menuconfig 及 Kconfig 修改內(nèi)核的配置單,從而自動(dòng)完成內(nèi)核配置

選擇哪些文件被編譯進(jìn)內(nèi)核

主目錄Makefile

Makefile文件位置: linux-3.0.8/Makefile

以下為Makefile文件中的部分代碼,根據(jù)arch平臺(tái),配置包含子目錄的頭文件目錄和子目錄的Makefile

根據(jù)SUBARCH配置 SRCARCH,SUBARCH默認(rèn) X86

export KBUILD_BUILDHOST := $(SUBARCH)ARCH            ?= $(SUBARCH)CROSS_COMPILE   ?= $(CONFIG_CROSS_COMPILE:"%"=%) // 交叉編譯器設(shè)置# Architecture as present in compile.hUTS_MACHINE     := $(ARCH)SRCARCH         := $(ARCH)# Additional ARCH settings for x86ifeq ($(ARCH),i386)        SRCARCH := x86endififeq ($(ARCH),x86_64)        SRCARCH := x86endif

包含子目錄的頭文件目錄 arch/arm/include:

-I$(srctree)/arch/$(hdr-arch)/include 

包含子目錄 arch/arm/Makefile 文件:

include $(srctree)/arch/$(SRCARCH)/Makefile

SRCARCH = arm
hdr-arch arm

各子目錄Makefile

obj-y : 編譯進(jìn)內(nèi)核
obj- : 不編譯進(jìn)去
obj-m : 以模塊形式編譯

如何配置內(nèi)核?

1. 配置倉(cāng)庫(kù)選取

1、SUBARCH 默認(rèn)就是X86的,內(nèi)容默認(rèn)配置安裝X86
ARCH 這個(gè)變量改為 arm 單詞

交叉編譯 CROSS_COMPILE:在一種計(jì)算機(jī)環(huán)境中運(yùn)行的編譯程序,能編譯出在另外一種環(huán)境下運(yùn)行的代碼

2、哪些文件會(huì)被編譯?

這些文件是否被編譯是由子目錄中的Makfile文件中 CONFIG_xxx 變量是否被定義而決定(obj-y編譯進(jìn)內(nèi)核,obj-m以模塊形式編譯)

主Makefile是如何將這些文件引入到我們的整個(gè)環(huán)境變量中?通過配置單 中定義的 CONFIG_xxx

3、配置單: 由芯片商提供BSP時(shí)會(huì)提供參考配置單,能夠大大簡(jiǎn)化我們的配置過程

cs@cspc:/mnt/d/linux/linux-3.0.8/arch/arm$ ls # arm架構(gòu)下的子目錄Kconfig        common   mach-at91      mach-dove        mach-gemini      mach-iop32x   mach-kirkwood  mach-mmp      mach-netx     mach-orion5x   mach-s3c2400  mach-s3c2443  mach-s5pv210   mach-spear6xx  mach-versatile  nwfpe         plat-omap     plat-samsung    vfpKconfig-nommu  configs  mach-bcmring   mach-ebsa110     mach-h720x       mach-iop33x   mach-ks8695    mach-msm      mach-nomadik  mach-pnx4008   mach-s3c2410  mach-s3c24a0  mach-sa1100    mach-tcc8k     mach-vexpress   oprofile      plat-orion    plat-spearKconfig.debug  include  mach-clps711x  mach-ep93xx      mach-imx        mach-ixp2000 mach-l7200     mach-mv78xx0  mach-nuc93x   mach-pxa       mach-s3c2412  mach-s3c64xx  mach-shark     mach-tegra     mach-vt8500     plat-iop      plat-pxa      plat-tccMakefile       kernel   mach-cns3xxx   mach-exynos4     mach-integrator  mach-ixp23xx  mach-loki      mach-mx5      mach-omap1    mach-realview  mach-s3c2416  mach-s5p64x0  mach-shmobile  mach-u300      mach-w90x900    plat-mxc      plat-s3c24xx  plat-versatileboot           lib      mach-davinci   mach-footbridge  mach-iop13xx     mach-ixp4xx   mach-lpc32xx   mach-mxs      mach-omap2    mach-rpc       mach-s3c2440  mach-s5pc100  mach-spear3xx  mach-ux500     mm              plat-nomadik  plat-s5p      toolscs@cspc:/mnt/d/linux/linux-3.0.8/arch/arm$ cd configs/cs@cspc:/mnt/d/linux/linux-3.0.8/arch/arm/configs$ ls  # 配置單所在目錄 configsacs5k_defconfig        at91sam9260ek_defconfig  cerfcube_defconfig        cpu9g20_defconfig      exynos4_defconfig     h7202_defconfig       ixp4xx_defconfig      magician_defconfig   mx3_defconfig        nuc960_defconfig        pxa168_defconfig        s3c2410_defconfig     spear3xx_defconfig    usb-a9260_defconfigacs5k_tiny_defconfig   at91sam9261_defconfig    cm_x2xx_defconfig         da8xx_omapl_defconfig  ezx_defconfig         hackkit_defconfig     jornada720_defconfig  mainstone_defconfig  mx51_defconfig       omap1_defconfig         pxa255-idp_defconfig    s3c6400_defconfig     spear6xx_defconfig    versatile_defconfigafeb9260_defconfig     at91sam9263_defconfig    cm_x300_defconfig         davinci_all_defconfig  footbridge_defconfig  imote2_defconfig      kirkwood_defconfig    mini2440_defconfig   mxs_defconfig        omap2plus_defconfig     pxa3xx_defconfig        s5p64x0_defconfig     spitz_defconfig       vexpress_defconfigag5evm_defconfig       at91sam9g20ek_defconfig  cns3420vb_defconfig       dove_defconfig         fortunet_defconfig    integrator_defconfig  ks8695_defconfig      mmp2_defconfig       neponset_defconfig   orion5x_defconfig       pxa910_defconfig        s5pc100_defconfig     stamp9g20_defconfig   viper_defconfigam200epdkit_defconfig  at91sam9rlek_defconfig   colibri_pxa270_defconfig  ebsa110_defconfig      g3evm_defconfig       iop13xx_defconfig     lart_defconfig        msm_defconfig        netwinder_defconfig  palmz72_defconfig       qil-a9260_defconfig     s5pv210_defconfig     tct_hammer_defconfig  xcep_defconfigap4evb_defconfig       at91x40_defconfig        colibri_pxa300_defconfig  edb7211_defconfig      g4evm_defconfig       iop32x_defconfig      loki_defconfig        mv78xx0_defconfig    netx_defconfig       pcm027_defconfig        raumfeld_defconfig      sam9_l9260_defconfig  tegra_defconfig       zeus_defconfigassabet_defconfig      badge4_defconfig         collie_defconfig          em_x270_defconfig      h3600_defconfig       iop33x_defconfig      lpd270_defconfig      mx1_defconfig        nhk8815_defconfig    pcontrol_g20_defconfig  realview-smp_defconfig  shannon_defconfig     trizeps4_defconfigat91cap9adk_defconfig  bcmring_defconfig        corgi_defconfig           ep93xx_defconfig       h5000_defconfig       ixp2000_defconfig     lubbock_defconfig     mx21_defconfig       nuc910_defconfig     pleb_defconfig          realview_defconfig      shark_defconfig       u300_defconfigat91rm9200_defconfig   cam60_defconfig          cpu9260_defconfig         eseries_pxa_defconfig  h7201_defconfig       ixp23xx_defconfig     mackerel_defconfig    mx27_defconfig       nuc950_defconfig     pnx4008_defconfig       rpc_defconfig           simpad_defconfig      u8500_defconfig

配置單文件的后綴 “_defconfig” 表示默認(rèn)配置,且每個(gè)配置單對(duì)應(yīng) arm 架構(gòu)下的目錄,如 “ixp2000_defconfig” 對(duì)應(yīng)
“mach-ixp2000”

配置單內(nèi)容如下(為y則代表其對(duì)應(yīng)的文件會(huì)被編譯進(jìn)內(nèi)核):

cs@cspc:/mnt/d/linux/linux-3.0.8/arch/arm/configs$ cat s5pv210_defconfigCONFIG_EXPERIMENTAL=yCONFIG_SYSFS_DEPRECATED_V2=yCONFIG_BLK_DEV_INITRD=yCONFIG_KALLSYMS_ALL=yCONFIG_MODULES=yCONFIG_MODULE_UNLOAD=y# CONFIG_BLK_DEV_BSG is not set...

我們將將配置單導(dǎo)出到內(nèi)核的主目錄下 .config

4、修改defconfig 配置單變成適應(yīng)于板子的文件

2.交叉編譯器的修改

回到內(nèi)核的主目錄,修改Makefile

修改以下兩行:

ARCH            ?= $(SUBARCH)  # 設(shè)置架構(gòu)體系, 如直接設(shè) arm;也可以在make中修改CROSS_COMPILE   ?= $(CONFIG_CROSS_COMPILE:"%"=%)  # 設(shè)置交叉編譯器

修改后的結(jié)果如:

ARCH            ?= arm   CROSS_COMPILE   ?= /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-
3.體系結(jié)構(gòu)體的選擇

將要移植的平臺(tái)的參考配置單文件拷貝到主目錄下:

cs@cspc:/mnt/d/linux/linux-3.0.8$ cp arch/arm/configs/s5pv210_defconfig .configcs@cspc:/mnt/d/linux/linux-3.0.8$ ls -a.  ..  .config  .gitignore  .mailmap  COPYING  CREDITS  Documentation  Kbuild  Kconfig  MAINTAINERS  Makefile  README  REPORTING-BUGS  arch  block  crypto  drivers  firmware  fs  include  init  ipc  kernel  lib  mm  net  samples  scripts  security  sound  tools  usr  virt
4.修改配置文件

可以使用 make menuconfig 以桌面窗口形式對(duì).config 文件進(jìn)行修改, 這比以文本方式修改.config更方便

關(guān)系: make menuconfig —解析Kconfig后修改—> .config —作用于—> Makefile
而且 make menuconfig中出現(xiàn)大量字符串,其來(lái)自解析的 Kconfig 文件

內(nèi)核編譯

  1. 將芯片廠商提供的配置單文件名更改為 .config
  2. 查看 Makefile中的交叉編譯器是否設(shè)置正確
  3. make menuconfig 設(shè)置 .config

4.make編譯文件
內(nèi)核編譯(make)之后會(huì)生成兩個(gè)文件,一個(gè)Image,一個(gè)zImage,

其中Image為內(nèi)核映像文件,而zImage為內(nèi)核的一種映像壓縮文件,Image大約為4M,而zImage不到2M

uImage又是什么的?

它是uboot專用的映像文件,它是在zImage之前加上一個(gè)長(zhǎng)度為64字節(jié)的“頭”,說(shuō)明這個(gè)內(nèi)核的版本、加載位置、生成時(shí)間、大小等信息;其0x40之后與zImage沒區(qū)別。

生成uImage文件:

1.首先在uboot的/tools目錄下尋找mkimage文件,把其copy到系統(tǒng)/usr/local/bin目錄下,這樣就完成制作工具
2.在內(nèi)核目錄下運(yùn)行make uImage,如果成功,便可以在arch/arm/boot/目錄下發(fā)現(xiàn)uImage文件,其大小比zImage多64個(gè)字節(jié)

有了uImage頭部的描述, u-boot就知道對(duì)應(yīng)Image的信息, 如果沒有頭部則需要自己手動(dòng)去設(shè)置那些參數(shù)

vmlinum --> Image --> zImage --> uImage:

編譯結(jié)果:幾種linux內(nèi)核文件的區(qū)別

1、vmlinux :編譯出來(lái)后未壓縮最原始的elf內(nèi)核文件,該文件不能燒寫到flash中

2、Image: vmlinux 經(jīng)過 OBJCOPY 之后會(huì)產(chǎn)生的文件,比較大,但已經(jīng)可以具備燒寫到flash

2、zImage :Image經(jīng)過gzip壓縮后的文件。

3、bzImage:bz表示“big zImage”,不是用bzip2壓縮的。兩者的不同之處在于,zImage解壓縮內(nèi)核到低端內(nèi)存(第一個(gè)640K),bzImage解壓縮內(nèi)核到高端內(nèi)存(1M以上)。如果內(nèi)核比較小,那么采用zImage或bzImage都行,如果比較大應(yīng)該用bzImage。

4、uImage : U-boot專用的映像文件,它是在zImage之前加上一個(gè)長(zhǎng)度為0x40的TAG。使得內(nèi)核可以啟動(dòng)

5、vmlinuz: bzImage/zImage文件的拷貝或指向bzImage/zImage的鏈接。

6、initrd ,: “initial ramdisk”的簡(jiǎn)寫。一般被用來(lái)臨時(shí)的引導(dǎo)硬件到實(shí)際內(nèi)核vmlinuz能夠接管并繼續(xù)引導(dǎo)的狀態(tài)

一般情況下都在生成vmlinux后,再對(duì)內(nèi)核進(jìn)行壓縮成為zImage,壓縮的目錄是kernel/arch/arm/boot。

下載到 flash 中的是壓縮后的zImage文件,zImage是由壓縮后的vmlinux和解壓縮程序組成的。

開發(fā)板上U-Boot啟動(dòng)linux內(nèi)核

查看 2440 的 datasheet , 發(fā)現(xiàn)內(nèi)存映射的基址是 0x3000 0000 , 那么0x30008000 又是如何來(lái)的呢?

在內(nèi)核文檔kernel/Document/arm/Booting 文件中有:

Calling the kernel image

Existingboot loaders: MANDATORY New boot loaders: MANDATORY There are two options for calling the kernel zImage. If the zImage is stored inflash, and is linked correctly to be run from flash, then it is legal for the boot loader to call the zImage in flashdirectly. The zImage may also be placed in system RAM (at any location) and called there.Note that the kernel uses 16K of RAM below the image to store page tables. The recommended placement is 32KiBinto RAM.

看來(lái)在image下面用了32K(0x8000)的空間存放內(nèi)核頁(yè)表,0x30008000 就是 2440 的內(nèi)核在 RAM 中的啟動(dòng)地址,這個(gè)地址就是這么來(lái)的

啟動(dòng)內(nèi)核:

1、下載uImage.bin到SDRAM的0x30008000處,tftp是一個(gè)類似于ftp的下載軟件,在uboot的shell下,輸入:

tftp 0x30008000 uImage

2、啟動(dòng)內(nèi)核,從0x30008000

bootm 0x30008000

內(nèi)核Kconfig語(yǔ)法使用

1.make menuconfig 是如何找到 Kconfig?

make menuconfig界面選中(*代表選中)配置項(xiàng)時(shí),.config配置單中的配置項(xiàng)也會(huì)更改為 “y”(對(duì)應(yīng)的文件會(huì)被編譯進(jìn)內(nèi)核)

make menuconfig --> Kconfig —> Makefile xxx.c 的過程 是如何組織的?

  1. make menuconfig中查找串口驅(qū)動(dòng)的 宏CONFIG_SERIAL_SAMSUNG 配置項(xiàng):




  1. 宏CONFIG_SERIAL_SAMSUNG 在對(duì)應(yīng)的 Kconfig 中應(yīng)該有這樣的語(yǔ)法:

config SERIAL_SAMSUNG # make menuconfig運(yùn)行時(shí)會(huì)在 .config 中自動(dòng)生成 CONFIG_SERIAL_SAMSUNG 配置項(xiàng)

3.查找 Samsung SoC serial support 關(guān)鍵字,獲得所在的Kconfig文件:

4.查看Kconfig文件獲得 CONFIG_SERIAL_SAMSUNG 對(duì)應(yīng)的 "config SERIAL_SAMSUNG"語(yǔ)法:

5.在Kconfig的同級(jí)目錄下查看Makefile文件中的 “CONFIG_SERIAL_SAMSUNG” 配置項(xiàng):

這里就將 samsung.c 文件編譯進(jìn)來(lái)了

2.Makefile 要編譯一個(gè) .o 文件是如何在Kconfig中配置的?

即: Makefile .o —> Kconfig, 則可以倒著查找

添加驅(qū)動(dòng)到內(nèi)核

概念

相比于裸機(jī)的驅(qū)動(dòng),內(nèi)核驅(qū)動(dòng)需要很多冗余的信息:

裸機(jī)的硬件發(fā)生改變則驅(qū)動(dòng)也會(huì)改變; 而內(nèi)核驅(qū)動(dòng)則不會(huì)因?yàn)橛布淖兌枰淖?,因?yàn)槠渖婕耙粋€(gè)復(fù)雜的驅(qū)動(dòng)框架

如有驅(qū)動(dòng)程序 myleddev.c 和應(yīng)用程序 myledtest.c

添加步驟

1.將我們開發(fā)的驅(qū)動(dòng) myleddev.c 放到能自述其意的目錄下,如 /drive/char/myled 目錄
2.在myled 目錄下增加并編輯 Makefile 文件,將 myleddev.c 和 Makefile 關(guān)聯(lián)起來(lái):
obj-$(CONFIG_MYLEDTEST) += myleddev.o  // 前綴必須為 "CONFIG_",如果$(CONFIG_MYLEDTEST)為y,即"obj-y"則指示編譯器將myleddev.c被編譯進(jìn)內(nèi)核

在myled目錄的上級(jí)目錄的Makefile中添加:

obj-y += myled/   # 內(nèi)核會(huì)以myled目錄作為下一個(gè)目標(biāo)進(jìn)入或者obj-$(CONFIG_MYLEDTEST) += myled/ # 需要將 CONFIG_MYLEDTEST 配置項(xiàng)設(shè)置為 "y"
3. 使用 make menuconfig

1.在myled目錄下增加并編輯 Kconfig 文件:

menu "my char device"config MYLEDTEST          bool "Support myled device driver"        help            Support led device driver for S5PV210endmenu

2.在上級(jí)目錄的 Kconfig 文件中包含子目錄 myled 的 Kconfig文件:

source "drivers/char/myled/Kconfig"

3.使用make menuconfig將.config配置單中的 CONFIG_MYLEDTEST 配置為 y:



編譯

使用 make uImage 將驅(qū)動(dòng)編譯進(jìn)內(nèi)核,目錄下驅(qū)動(dòng)對(duì)應(yīng)的 .o 文件則代表驅(qū)動(dòng)成功編譯進(jìn)內(nèi)核:

執(zhí)行應(yīng)用程序

1.將編譯后的內(nèi)核下載到開發(fā)板上

2.確定內(nèi)核是否運(yùn)行了LED驅(qū)動(dòng)

$ cat /proc/devices # devices文件記錄了內(nèi)核支持的設(shè)備信息

3.創(chuàng)建LED驅(qū)動(dòng)程序與應(yīng)用程序直接銜接的設(shè)備節(jié)點(diǎn)

# mknode /dev/led1 c 253 1 # 創(chuàng)建設(shè)備節(jié)點(diǎn),名為 /dev/led1

4.測(cè)試

1.需要將應(yīng)用程序放在開發(fā)板上運(yùn)行,可以先將PC的目錄掛載到開發(fā)板的 /mnt 下:

1.PC開啟 ntf服務(wù), netstat -tua | grep nfs: 檢查ntf服務(wù)是否開啟
2.exportfs 查看PC當(dāng)前 NFS 共享的文件系統(tǒng)列表
3.將共享目錄掛載到開發(fā)板的 /mnt 下(注意開發(fā)板要設(shè)置IP地址): mount -t nfs -o nolock 192.168.10.10:/work/ /mnt

2.將應(yīng)用程序復(fù)制到共享目錄下

3.PC上對(duì)應(yīng)用程序進(jìn)行交叉編譯

arm-linux-gcc -o ledtest myledtest.c

4.開發(fā)板上執(zhí)行應(yīng)用程序

./ledtest

添加驅(qū)動(dòng)到內(nèi)核的過程:

參考資料

https://www.youtube.com/watch?v=qNeLmPCK7xE&list=PLljKjXpjNpgdY8fNIhHQG0ErUDldOCQxh&index=12

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/124034.html

相關(guān)文章

  • Docker 入門及安裝[Docker 系列-1]

    摘要:核心對(duì)名字空間的支持完全隔離了工作環(huán)境中應(yīng)用程序的視野,包括進(jìn)程樹網(wǎng)絡(luò)用戶與掛載文件系統(tǒng),而核心的提供資源隔離,包括存儲(chǔ)器與網(wǎng)絡(luò)。因此更為輕量快速和易于管理。 docker 如日中天,這不是單純的炒概念,docker 確確實(shí)實(shí)解決了開發(fā)與運(yùn)維的痛點(diǎn),因此在企業(yè)開發(fā)中得到了非常廣泛的使用,本文對(duì)于 docker 的這些基本知識(shí)點(diǎn)再做一些簡(jiǎn)單回顧。 什么是 docker 根據(jù) wikip...

    Lin_R 評(píng)論0 收藏0
  • Docker入門安裝教程

    摘要:的安裝支持和系統(tǒng),置于安裝過程大家可以去查看官方的文檔,也可以搜索別的教程,需要一點(diǎn)基礎(chǔ)。注意我們是安裝的,是用于商業(yè)模式的。 Dokcer介紹: Docker是一種容器相關(guān)的技術(shù),簡(jiǎn)單來(lái)說(shuō)你可以把它當(dāng)做一個(gè)微型的獨(dú)立系統(tǒng),在這個(gè)系統(tǒng)里面運(yùn)行各種軟件,然后又在linux服務(wù)器上或者是電腦上運(yùn)行這個(gè)系統(tǒng),這個(gè)系統(tǒng)就被稱為Docker容器,而運(yùn)行Docker容器的機(jī)器就被稱為宿主機(jī)。Doc...

    justCoding 評(píng)論0 收藏0
  • Docker入門(一)用hello world入門docker

    摘要:初識(shí)是什么是一個(gè)開源的應(yīng)用容器引擎,基于語(yǔ)言并遵從協(xié)議開源。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口更重要的是容器性能開銷極低。命令為,如下由此可知,我們新打包的鏡像的為。登錄賬號(hào)再輸入自己的賬號(hào)密碼即可。 初識(shí)Docker Docker是什么? ??Docker 是一個(gè)開源的應(yīng)用容器引擎,基于?Go 語(yǔ)言并遵從Apache2.0協(xié)議開源。??Docker 可以讓開發(fā)者打包他們的...

    tolerious 評(píng)論0 收藏0
  • Docker入門學(xué)習(xí)

    摘要:如無(wú)論哪個(gè)服務(wù)器,下載的文件內(nèi)容是一樣的。如果需要啟動(dòng),通過命令執(zhí)行完后,再打開文件,可以看到的了。 docker的官網(wǎng):https://www.docker.com/官方文檔:https://docs.docker.com/github: https://github.com/docker/lab... Docker類似虛擬機(jī),是一個(gè)開源的引擎,可以輕松的為任何應(yīng)用創(chuàng)建一個(gè)輕量級(jí)的、...

    xiaodao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<