Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 5615|回復: 1
打印 上一主題 下一主題

Step by Step 構建嵌入式Linux系統平臺

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-7-6 22:56:01 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
Step by Step 構建嵌入式Linux系統平臺+ n% ~5 p( [5 ^
1 v$ K; {; m% p8 m. Z, c! {
0 前言  @2 I2 o2 f8 t) \: s8 `
嵌入式系統的商品化作業系統十分豐富,如Palm OS、VxWorks、pSOS、Neculeus和Windows CE等。高端嵌入式系統要求許多高級的功能,但其價格也相對昂貴,一般用戶難以接受。微軟的Windows CE也有此類功能,卻不具備大多數嵌入式系統要求的即時性能,而且難以移植。
- k+ c# v( H5 j. WLinux為嵌入式系統提供了一個極有吸引力的選擇,對於嵌入式系統而言,性能、成本和可靠性是最至關重要的三個因素。首先,眾多文獻資料表明,Linux是當前可獲得的最簡捷、最快速的作業系統,其性能優越之處,是把圖形處理為一個用戶級的應用,圖形可根據需要被選擇是否運行。Linux系統中存在適度複雜的圖形介面,但是它們並沒有與作業系統的內核緊緊捆綁在一起,圖形介面可按需求關閉。這樣就可以在Linux內核上運行專門為嵌入式系統定制的圖形系統,從而獲得優越的性能。其次,Linux 系統源代碼完全公開,可以用非常便宜的價格得到各種Linux分發版,不必考慮許可成本,將用戶從許可證的限制中解脫出來,無需去為資金短缺而煩憂。 Linux能正常運行於記憶體缺乏,容量緊張的系統中,減少在硬體升級上的開支。另外,在系統穩定性方面,Linux幾乎不崩潰,Linux的穩定性是由於它沒有像其他作業系統一樣內核極其龐大。考察資料表明,Linux與其他Unix系統和大型作業系統如VMS、IBM大型機等一樣具有相同的可靠性。在上述優勢之外,Linux還擁有眾多硬體支援的特點和強大的網路支援功能。正因為Linux在價格、性能、穩定性以及用戶定制等方面的突出優勢,用它來構建系統操作平臺是一個很不錯的解決方案。
3 h- q, b, p( a% Y9 k5 ^  {* m6 K) X# [- M1 z* Y& s# T; x
1 開發中的關鍵問題及解決方案2 V4 s) ~6 |! i( J
1.1 硬體及軟體環境
1 B) X; W$ u8 a2 Z) SLinux 系統的硬體環境以PC104卡為核心,卡上集成美國國家半導體公司(NS Geode)GX1 300MHz CPU,SVGA/LCD/LAN介面以及增強型IDE硬碟介面,支援CompactFlash卡。硬碟和光碟機接至PC104的IDE1口,設置跳線使硬碟為主設備(master),光碟機為從設備(slave),CompactFlash裝在IDE2口,設為主設備,這樣Linux識別 CompactFlah卡為/dev/hdc,而硬碟和光碟機分別為/dev/had,/dev/hdb.我的Linux開發系統是Red Hat 7.2版,通過PC104上的光碟機安裝在硬碟上。3 U, s" @; {5 }; ~6 h7 Y) J% E
CompactFlash卡容量為32M,如果系統的BIOS支援自動檢測,應該可以直接探測到它。如果不行的話,需要自己輸入卡的各項參數。確保不要帶電插拔CompactFlash卡,因為這可能導致卡上資料的丟失。
: m' U3 E& o7 w. n    由於像Red Hat或Mandrake這樣的Linux分發版體積龐大(如果帶X-Windows基本都在1G以上),是不可能裝在容量只有32M的 CompactFlash卡上的。目前有許多小型的嵌入式Linux版本,比較有名的有:
" q0 u) h. x, h+ ?+ D4 {ETLinux — 設計用於在小型工業電腦,尤其是 PC/104 模組上運行的 Linux 的完全分發版。; @3 f0 ^0 K6 @! z# G# C0 z
LEM — 運行在 386 上的小型(<8 MB)多用戶、網路 Linux 版本。1 F! J$ K, g0 K: ?6 Y  S/ T
LOAF — "Linux On A Floppy"分發版,運行在 386 上。
6 u6 p' `& _1 y2 w9 CuClinux — 在沒有 MMU 的系統上運行的 Linux。目前支持 Motorola 68K、MCF5206 和 MCF5207 ColdFire 微處理器。) p3 D6 U' ?9 U3 ]4 r: M, x4 v( k5 W
出於深入瞭解Linux系統運行環境和機制的想法,建議自己構建Linux系統,這對於將來系統內核版本的升級和應用功能的拓展很有好處。選擇Red Hat 7.2的Linux版本。- ~0 Z1 Y" n/ R  z

& Y" O6 }# |1 [6 g' P+ K8 h  u0 O1.2 系統分區和格式化( m% z  D* n- r$ ~7 n( \% Z
首先,需要在CompactFlash卡上建立分區和格式化,在Linux下用fdisk命令可以在CompactFlash卡上創建分區,命令格式為fdisk /dev/hdc,然後用mke2fs命令創建ext2檔系統.; d. D2 A  R2 S3 h: C" a8 Q, z" z
1.2 系統分區和格式化8 H, l6 m- q. v3 _
首先,需要在CompactFlash卡上建立分區和格式化,在Linux下用fdisk命令可以在CompactFlash卡上創建分區,命令格式為fdisk /dev/hdc,然後用mke2fs命令創建ext2檔系統.. l+ B; v# M. g) l
1.3 編譯內核- \& |/ m% u1 S: o
接下來要做的事情是編譯一個自己的內核。內核負責管理系統的進程、記憶體、設備驅動程式、檔和網路系統,決定著系統的性能和穩定性。從技術上而言, Linux 是一個內核,而且只是一個內核。其餘我們通常稱之為 "Linux" (例如一個 shell 和編譯器)的部分實質上只是整個套裝軟體的一部分,它們從技術上而言是與 Linux (內核)分開的。選擇與開發系統一樣的內核版本2.4.7,在Linux內核版本發佈的官方網站 http://www.kernel.org 上可以找到內核源代碼。3 w  ]# K6 R0 x% i
在編譯內核的時候,由於內核是在特定的機器上使用的,所以應該對機器的情況瞭若指掌。另一方面,為了降低過高的複雜性,可以不用kernel module支援,把所有需要的東西直接編譯到內核�。IDE支持是必不可少的,因為Linux認CompactFlash卡為IDE硬碟,Frame buffer的支援也是必要的,這來源於GUI系統—MiniGUI的要求,網路支援可以不要,但是如果認為顯示幕將來有這方面的要求也可以把它加上。
- X* B6 l/ w) ?- Q  o$ \1.4 創建根檔系統(Root Filesystem)
& v5 V: U; e" m6 L* }4 R在編譯好內核後,需要在CompactFlash卡上創建根檔系統。每台機器都有根檔系統(一般在本地盤中,當然也可以在RAM盤或網路盤中),它包含系統引導和使其他檔系統得以mount所必要的檔,根檔系統應該有單用戶狀態所必須的足夠的內容。還應該包括修復損壞系統、恢復備份等的工具。
+ r9 G: j4 _8 L* u3 E- f如果有一個任務比其他任務更能簡化從頭構建 Linux 根檔系統過程的話,那就是構建和安裝 BusyBox 套裝軟體。BusyBox 是一個可執行檔,它提供許多其他常用命令行工具的功能,所有這些功能都合為一體。BusyBox 的文檔聲稱構建一個有效系統所需要的全部就是 BusyBox 和"/dev、/etc 以及內核"— 而且他們沒有開玩笑。8 B: x6 T0 q5 j. g2 f( d
Busybox 編譯出一個單個的獨立執行程式,就叫做 busybox。但是它可以根據配置,執行 ash shell 的功能,以及幾十個各種小應用程式的功能。這其中包括有一個迷你的 vi 編輯器,系統不可或缺的 /sbin/init 程式,以及其他諸如 sed, ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat ... 等等這些都是一個正常的系統上必不可少的。但是如果我們把這些程式的原件拿過來的話,它們的體積加在一起,讓人吃不消。可是 busybox 有全部的這麼多功能,大小也不過 100K 左右。而且,用戶還可以根據自己的需要,決定到底要在 busybox 中編譯進哪幾個應用程式的功能。這樣的話,busybox 的體積就可以進一步縮小了。Busybox的具體編譯和配置方法請參閱Busybox的官方文檔,用戶可以在http://www.busybox.net/上找到.) Y  i! Z: ~: `, _+ Q+ |& s
系統啟動後內核調用的第一個進程是/sbin/init。init進程是系統所有進程的起點,內核在完成核內引導以後,即在本線程(進程)空間內載入 init程式,它的進程號是1。init程式需要讀取/etc/inittab檔作為其行為指標,inittab是以行為單位的描述性(非執行性)文本,inittab檔至少應該包含下麵幾行:
3 z; Z) ?, g8 v0 ?& I/ W::sysinit:/etc/init.d/rcS         //運行系統公共腳本
; a  p; C; {1 D. T2 S! y::respawn:/bin/sh             //立即進入shell環境
7 z7 W8 v/ c' T::ctrlaltdel:/bin/umount -a      //捕捉Ctrl+Alt+Del快捷鍵,退出系統/ i1 I$ m5 \  y) d* ?
由於init進程第一個執行的腳本檔是/etc/init.d/rcS,編輯rcS檔:. S0 I: }" O' R7 G6 L# A$ [
#! /bin/sh' o- h8 O* x( r& [
mount -a
5 f+ C: q% y! ]- Z) _接著還需要編寫/etc/fstab檔:
3 r5 K: g0 ^4 T$ Nproc          /proc          proc           defaults           0       0) q0 z+ I6 `, W0 z7 e% r! M: M
none          /var/shm       shm           defaults           0       0
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2007-7-6 22:56:37 | 只看該作者
1.5 安裝系統引導工具(boot loader)7 z6 G) h+ h, A) j- z' u
現在CompactFlask卡上新的內核已經有了,檔系統也已經建好了,接著要做的事情是安裝系統引導工具(boot loader)。目前可以選用的引導工具很多,象LILO或GRUB都是挺不錯的,用戶可以按自己的喜好來選擇。在這�我們選用LILO,它在硬碟開始的 MBR寫入引導代碼,這些代碼不經過檔系統,直接從硬碟磁區號讀內核映象(kernel image)裝入記憶體。那麼要如何安裝LILO呢?首先需要根據用戶系統的搭建情況編輯/etc/lilo.conf文件,下麵是我的 /etc/lilo.conf檔,配有注釋,你可以根據自己的情況進行更改,具體你可以參考LILO mini-HOWTO:. z9 T% h4 H+ t
boot=/dev/hdc              #從CompactFlash卡啟動# [5 k- j9 v; R% k
disk=/dev/hdc
( ~0 y+ O+ p. M1 s8 Vbios=0x80                 #使BIOS認CompactFlash卡為啟動盤
; b5 V: J: A; ]3 c' Udelay=0                   #可選,以秒為單位9 P9 C6 W( R+ x
vga=0x311                #可選,參照Frame buffer的配置
: E+ y  v0 y( zimage=/boot/vmlinuz-2.4.7   #內核檔位置
& ]! J5 J. o, e" H8 Rroot=/dev/hdc1             #root分區位置0 z1 M' {3 W  b' `7 K+ w( W( o
label=CompactFlash         #嵌入式Linux的名字
8 Y1 m6 G+ ~4 ?! Q% Oread-write                  #以read-write方式mount根檔系統, ]; t( L. V7 {, `& b
編輯完/etc/lilo.conf後,將它寫到CompactFlash卡上,假設CompactFlash卡已經被mount到了/mnt/CompactLinux目錄下,運行命令:
' F9 u2 c# }( l. @0 E* `/mnt/CompactLinux/sbin/lilo -r /mnt/CompactLinux -C etc/lilo.conf3 K  K3 @2 q0 j9 [  q1 j
使用這個命令時必須非常小心,它可能會破壞開發系統上的引導系統而使它不能啟動,為確保安全應在運行此命令前先創建系統引導軟碟。' i2 q/ z' X4 i, t& w
嵌入式Linux系統的雛形建立完成後,應先對其進行簡單測試。關上PC104卡的電源,拔下接在IDE1口的硬碟和光碟機,合上電源重啟PC104,在 BIOS中設置IDE1口硬碟為None,存檔退出BIOS,進入CompactFlash卡上的系統。如果系統可以一直運行到出現shell提示符#, 那就證明Linux平臺已經初步搭建成功了。1.5 安裝系統引導工具(boot loader)
$ @- q7 C3 S1 h8 C# {現在CompactFlask卡上新的內核已經有了,檔系統也已經建好了,接著要做的事情是安裝系統引導工具(boot loader)。目前可以選用的引導工具很多,象LILO或GRUB都是挺不錯的,用戶可以按自己的喜好來選擇。在這�我們選用LILO,它在硬碟開始的 MBR寫入引導代碼,這些代碼不經過檔系統,直接從硬碟磁區號讀內核映象(kernel image)裝入記憶體。那麼要如何安裝LILO呢?首先需要根據用戶系統的搭建情況編輯/etc/lilo.conf文件,下麵是我的 /etc/lilo.conf檔,配有注釋,你可以根據自己的情況進行更改,具體你可以參考LILO mini-HOWTO:
+ n$ A& w* I: b) ?boot=/dev/hdc              #從CompactFlash卡啟動
& |* J0 y( u! w& g& g; v# Jdisk=/dev/hdc
3 z1 E. x: J( b$ B8 V: G  Vbios=0x80                 #使BIOS認CompactFlash卡為啟動盤
! g2 Q2 E) M2 Odelay=0                   #可選,以秒為單位
1 ]' W& v4 n4 ?. Q  {$ Z/ Q+ Yvga=0x311                #可選,參照Frame buffer的配置, \2 `' i; _/ s" D& V& K2 H
image=/boot/vmlinuz-2.4.7   #內核檔位置/ y# Z0 k+ U7 z" O9 H! C6 R: v
root=/dev/hdc1             #root分區位置
& n( ]% {/ ~6 h5 p' |* z  n/ ~label=CompactFlash         #嵌入式Linux的名字
; O: j% [' p6 \' p, X6 O. xread-write                  #以read-write方式mount根檔系統
& ?1 t+ N% P7 B& [' V編輯完/etc/lilo.conf後,將它寫到CompactFlash卡上,假設CompactFlash卡已經被mount到了/mnt/CompactLinux目錄下,運行命令:! p6 Q3 B" d! [, X1 D! s
/mnt/CompactLinux/sbin/lilo -r /mnt/CompactLinux -C etc/lilo.conf2 s, L5 \+ w& ~4 n3 G) k
使用這個命令時必須非常小心,它可能會破壞開發系統上的引導系統而使它不能啟動,為確保安全應在運行此命令前先創建系統引導軟碟。# ^4 @- b. B/ c) P5 u  O% L8 [
嵌入式Linux系統的雛形建立完成後,應先對其進行簡單測試。關上PC104卡的電源,拔下接在IDE1口的硬碟和光碟機,合上電源重啟PC104,在 BIOS中設置IDE1口硬碟為None,存檔退出BIOS,進入CompactFlash卡上的系統。如果系統可以一直運行到出現shell提示符#, 那就證明Linux平臺已經初步搭建成功了。
5 J% |* @2 p" y2 z. f* q' _9 Y1.6 MiniGUI$ f# |, i3 V6 G4 w# v# I
現在面向嵌入式Linux 系統的圖形用戶介面很多,如MicoroWindows/NanoX ,OpenGUI,Qt/Embedded,MiniGUI等,我們選用的是MiniGUI . MiniGUI是由魏永明主持,並由許多自由軟體發展人員支援的一個自由軟體專案(遵循 LGPL 條款發佈),其目標是為基於 Linux 的即時嵌入式系統提供一個羽量級的圖形用戶介面支援系統。該專案自 1998 年底開始到現在,歷經 3 年多的開發過程,已經非常成熟和穩定。因為 MiniGUI 的靈活性非常好,可以應用在包括手持設備、機頂盒、遊戲終端等在內的各種高端或者低端的嵌入式系統中,並且是免費的,這使其在眾多GUI系統的競爭中脫穎而出,成為我們選擇它的一個很重要的理由。1 u3 y3 ?* U9 p- G) Z
從MiniGUI的官方網站(http://www.minigui.org)上下載MiniGUI的源代碼,在PC104的硬碟上進行編譯安裝,MiniGUI的官方網站上有關於這方面的文檔,本文也就不再贅述了。因為 MiniGUI 是以源代碼的形式發佈的,在硬碟上以編譯的方法產生的MiniGUI的libminigui 目錄下包含了這些源代碼以及編譯時生成的中間檔,所以需要的空間很大,是不可能將它全部安裝到CompactFlash卡上的,需要的檔有:
& G. P, C- w( G4 M0 A! e# Q0 b*  MiniGUI的演示檔。% w) m3 W  f3 K" @9 W
*  MiniGUI 的函數庫,包括 libminigui、libmywins 和 libmgext 等。
1 b' o2 l9 r$ T7 d6 e; i*  MiniGUI 的配置檔,即 MiniGUI.cfg 文件。
: O+ {! l+ M( Y) q*  MiniGUI 所使用的資源檔案。5 ~( N! M+ E' {
如果你覺得檔太大,參照下面的方法進行修改:
$ l  X. W: e  A' q$ _6 b  p/ m0 b6 i1. 首先可以修改編譯選項,把不用的功能去掉,比如說繁體支援等。這樣庫會小一些。# v! a4 K1 R/ t; A
2.去掉不需要的演示程式。2 i- Y  m2 R* i& n9 g! |- e. K
3. 去掉無用的資源,可以只保留一種字體,只保留一種輸入法,刪除一些點陣圖檔。
0 A* F. p3 ?. a    ! h9 u6 c  C, {7 i6 Q
至此,帶圖形用戶介面的Linux系統已經搭建完成,可以在開發系統上寫自己的基於MiniGUI的應用程式,然後將它拷貝至CompactFlash卡上運行。 1.6 MiniGUI2 [' ~9 l$ Y& p
現在面向嵌入式Linux 系統的圖形用戶介面很多,如MicoroWindows/NanoX ,OpenGUI,Qt/Embedded,MiniGUI等,我們選用的是MiniGUI . MiniGUI是由魏永明主持,並由許多自由軟體發展人員支援的一個自由軟體專案(遵循 LGPL 條款發佈),其目標是為基於 Linux 的即時嵌入式系統提供一個羽量級的圖形用戶介面支援系統。該專案自 1998 年底開始到現在,歷經 3 年多的開發過程,已經非常成熟和穩定。因為 MiniGUI 的靈活性非常好,可以應用在包括手持設備、機頂盒、遊戲終端等在內的各種高端或者低端的嵌入式系統中,並且是免費的,這使其在眾多GUI系統的競爭中脫穎而出,成為我們選擇它的一個很重要的理由。
, T3 D' H# E6 _" |從MiniGUI的官方網站(http://www.minigui.org)上下載MiniGUI的源代碼,在PC104的硬碟上進行編譯安裝,MiniGUI的官方網站上有關於這方面的文檔,本文也就不再贅述了。因為 MiniGUI 是以源代碼的形式發佈的,在硬碟上以編譯的方法產生的MiniGUI的libminigui 目錄下包含了這些源代碼以及編譯時生成的中間檔,所以需要的空間很大,是不可能將它全部安裝到CompactFlash卡上的,需要的檔有:
5 x0 }' ?8 E5 b! A1 J*  MiniGUI的演示檔。" w  M6 v3 \7 H' \% U4 x$ d
*  MiniGUI 的函數庫,包括 libminigui、libmywins 和 libmgext 等。
3 n  z$ h, t4 y*  MiniGUI 的配置檔,即 MiniGUI.cfg 文件。
2 g" {+ @3 _( d9 ~* H3 j# P9 [*  MiniGUI 所使用的資源檔案。
7 K- ~# x0 M: Q! g如果你覺得檔太大,參照下面的方法進行修改:$ H2 I. Z. d( k  H
1. 首先可以修改編譯選項,把不用的功能去掉,比如說繁體支援等。這樣庫會小一些。% s% K2 }) K/ v
2.去掉不需要的演示程式。$ H3 W# h2 J7 \% }
3. 去掉無用的資源,可以只保留一種字體,只保留一種輸入法,刪除一些點陣圖檔。5 H' g. G5 E' |1 f
   
- }* y: V0 n$ g, o至此,帶圖形用戶介面的Linux系統已經搭建完成,可以在開發系統上寫自己的基於MiniGUI的應用程式,然後將它拷貝至CompactFlash卡上運行。
7 D8 w  h; v6 Y" f , R2 W: X" W; N5 Y, y1 y6 V
2 一些補充; t+ g/ M: W' |. o/ |2 c
上面的Linux系統滿足了一個系統所需的基本要求,但是針對不同的硬體環境和軟體要求,還可以作出一些改進。
# n) [8 J2 S9 V  G. Y首先是在體積上的裁減,在本文中採用的是32M的CompactFlash卡,所以這不是一個很迫切的問題,但如果是16M或8M容量DOC,片內的空間可以說是寸土寸金,那就需要一些其他的方法:4 c2 Q# p( z2 ^+ Z: S9 k$ l# l
* 內核編譯  在編譯內核時去掉不需要的功能,如網路支援等。) d$ K: k6 {$ @$ F6 K
* uClibc     每個 Linux 系統都需要一個 C 庫。C 庫提供了常用的檔操作(打開、讀和寫)、記憶體管理操作(malloc 和 free)和許多其他使一個 Linux 系統名副其實的函數。大多數 Linux 系統使用 gLibc。gLibc 是成熟的、經過良好測試的,並且正在積極的開發中。遺憾的是,它使用的記憶體數量相對較多,容量也較大。 uClibc是一個現代的、穩定的、具有高度相容性的 gLibc 替代品。uClibc 是針對嵌入式系統開發的,所以它力圖成為完整但羽量級的 C 庫。- S/ l4 z! \3 K
如果系統在啟動後要求登錄的話,建議採用TinyLogin。TinyLogin 是一套 tiny UNIX 實用程式,它用於登錄嵌入式系統、接受其驗證身份、為其修改密碼,並能維護其用戶和用戶組。為了增強系統安全性它還支援影子口令。正如它的名字所暗示的, TinyLogin 非常小,對嵌入式系統上的 BusyBox 是極好的補充。
+ k( B% t0 o- N' C5 f/ \" P/ g( G& ]6 Q/ p% c0 b7 k
3 結束語
5 _( ~3 c( m( J7 k. s    在嵌入式應用的領域�,從網際網路設備到專用的控制系統,Linux 作業系統的前景都很光明。所有新造的微型電腦晶片中大約有 95% 都是用於嵌入式應用的。由於 Linux 功能強大、可靠、靈活而且具有伸縮性,再加上它支援大量的微處理器體系結構、硬體設備、圖形支援和通信協定,因此大大擴展了用途,使其作為許多方案和產品的軟體平臺越來越流行。相信在不久的將來,在許多其他的資訊技術(IT)領域會出現更多的Linux產品!8 n5 t8 Z! R. \2 J2 ?. y: y

$ h& E7 t$ Y) O6 |1 o4 ]參考文獻
2 f' ]! I& [7 @4 R* g$ b* Linux bootdisk HOWTO
6 J3 Y  ~$ Q. W. f; a* LILO mini-HOWTO5 |* `) @- T0 A0 r
* 王學龍. <<嵌入式Linux系統設計與應用>>. 清華大學出版社. 2001.8
$ E, X; Y+ w4 m  F+ l( e+ T# O* Darrick Addison. 嵌入式 Linux 應用:概述. IBM developerWorks網站. 2001.8
  ]% S# X! }6 P" a( l* a# g1 }* http://www.kernel.org/
4 h% T; `3 p) I0 v2 G) w) c* http://www.minigui.org/
: H' b! d- m! A* http://www.busybox.net/

評分

參與人數 2Chipcoin +15 收起 理由
Jim_Lin + 5 還有嗎?是原創嗎?如果不是請註明出處
tommywgt + 10 再多發表些如何?

查看全部評分

您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-9-28 02:12 AM , Processed in 0.176010 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表