久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

總結(jié)一下linux中的分段機(jī)制

 昵稱(chēng)28625772 2015-10-27
這篇文章主要說(shuō)一下linux對(duì)于分段機(jī)制的處理,雖然都說(shuō)linux不使用分段機(jī)制,,但是分段機(jī)制屬于CPU的一個(gè)功能,,即使linux不使用,也要通過(guò)代碼想辦法繞過(guò)它,,況且linux也使用到了分段機(jī)制中的某些功能,。

  分段機(jī)制主要功能只有兩點(diǎn):

  • 將物理內(nèi)存劃分為多個(gè)段,讓操作系統(tǒng)可以使用大于其地址線(xiàn)對(duì)應(yīng)的物理內(nèi)存(比如正常情況下32位地址線(xiàn)可以訪(fǎng)問(wèn)4G大小的內(nèi)存,但是有分段后則可訪(fǎng)問(wèn)大于4G的內(nèi)存),。
  • 權(quán)限控制,,將每個(gè)段設(shè)置權(quán)限位,讓不同的程序訪(fǎng)問(wèn)不同的段,。

  對(duì)于linux內(nèi)核來(lái)說(shuō),,它僅僅只使用了分段機(jī)制中的權(quán)限控制功能,具體我們可以一起看看是如何做的,。

 

CPU的段寄存器

  在CPU中,,跟段有關(guān)的CPU寄存器一共有6個(gè):cs,ss,,ds,,es,fs,,gs,,它們保存的是段選擇符。而同時(shí)這六個(gè)寄存器每個(gè)都有一個(gè)對(duì)應(yīng)的非編程寄存器,,它們對(duì)應(yīng)的非編程寄存器中保存的是段描述符,。系統(tǒng)可以把同一個(gè)寄存器用于不同的目的,方法是先將其寄存器中的值保存到內(nèi)存中,,之后恢復(fù),。而在系統(tǒng)中最主要的是cs,ds,,ss這三個(gè)寄存器,。

  • CS 代碼段寄存器:指向包含程序指令的段,在CS寄存器中RPL用于表示當(dāng)前CPU的特權(quán)級(jí)(CPL),,CPL為0是最高權(quán)限(內(nèi)核態(tài)使用),CPL為3是用戶(hù)態(tài)使用,。

  • SS棧段寄存器:指向當(dāng)前程序的棧的段,。

  • DS 數(shù)據(jù)段寄存器:指向保存著靜態(tài)數(shù)據(jù)和全局?jǐn)?shù)據(jù)的段(靜態(tài)區(qū))。

  在段寄存器中主要保存的是段選擇符,,它的長(zhǎng)度是16位,,具體如下:

  • 索引號(hào)(index):所對(duì)應(yīng)的段描述符處于GDT或LDT中的索引。

  • TI:TI=0表示對(duì)應(yīng)段描述符保存在GDT(全局描述符表)中,,TI=1表示對(duì)應(yīng)的段描述符保存在LDT(局部描述符表)中,。

  • RPL:當(dāng)此對(duì)應(yīng)的段選擇符裝入cs寄存器時(shí),設(shè)置CPU當(dāng)前的特權(quán)級(jí)的值為RPL,,也就是cs寄存器中的RPL就是CPL,。

  段選擇符主要用途就是根據(jù)段索引號(hào)和TI標(biāo)志,去到GDT或者LDT中找到這個(gè)選擇符對(duì)應(yīng)的段描述符,比如我們?cè)趦?nèi)核代碼中常見(jiàn)的__KERNEL_CS,,__KERNEL_DS,,__USER_CS,__USER_DS就是段選擇符,,它們并不是段描述符,。

 

 

全局描述符表與局部描述符表

  全局描述符表和局部描述符表保存的都是段描述符,記住要把段描述符和段選擇符區(qū)別開(kāi)來(lái),,保存在寄存器中的是段選擇符,,這個(gè)段選擇符會(huì)到描述符表中獲取對(duì)于的段描述符,然后將段描述符保存到對(duì)應(yīng)寄存器的非編程寄存器中,。

  系統(tǒng)中每個(gè)CPU有屬于自己的一個(gè)全局描述符表(GDT),,其所在內(nèi)存的基地址和其大小一起保存在CPU的gdtr寄存器中。其大小為64K,,一共可保存8192個(gè)段描述符,,不過(guò)第一個(gè)一般都會(huì)置空,也就是能保存8191個(gè)段描述符,。第一個(gè)置空的原因是防止加電后段寄存器未經(jīng)初始化就進(jìn)入保護(hù)模式而使用GDT,。

  而對(duì)于局部描述符表,CPU設(shè)定是每個(gè)進(jìn)程可以創(chuàng)建屬于自己的局部描述符表(LDT),,當(dāng)前被使用的LDT的基地址和大小一起保存在ldtr寄存器中,。不過(guò)大多數(shù)用戶(hù)態(tài)的liunx程序都不使用局部描述符表,所以linux內(nèi)核只定義了一個(gè)缺省的LDT供大多數(shù)進(jìn)程共享,。描述這個(gè)局部描述符表的局部描述符表描述符保存在GDT中,。

  對(duì)于表中的段描述符我們簡(jiǎn)單說(shuō)幾個(gè)特別的:

  • TLS段描述符:中文名字是局部線(xiàn)程存儲(chǔ)段,這個(gè)會(huì)允許線(xiàn)程擁有自己的段,,不過(guò)一般程序不經(jīng)常會(huì)用到的,,系統(tǒng)調(diào)用set_thread_area()與get_thread_area()為當(dāng)前進(jìn)程創(chuàng)建和撤銷(xiāo)一個(gè)TLS段。

  • TSS段描述符:叫做任務(wù)狀態(tài)段,,這個(gè)描述符非常重要,,每個(gè)處理器包含一個(gè)自己的tss段,這個(gè)tss段中的主要數(shù)據(jù)是一個(gè)tss_struct結(jié)構(gòu)體,,linux會(huì)將所有CPU的tss_struct結(jié)構(gòu)體以init_tss數(shù)組的形式保存起來(lái),,這個(gè)tss_struct結(jié)構(gòu)體中保存的時(shí)當(dāng)前運(yùn)行進(jìn)程的內(nèi)核態(tài)堆棧棧頂?shù)刂泛彤?dāng)前進(jìn)程的IO許可權(quán)限位。當(dāng)進(jìn)程切換時(shí)就會(huì)設(shè)置CPU的tss_struct結(jié)構(gòu)體,,CPU就可以從tss_struct中獲取當(dāng)前進(jìn)程的內(nèi)核棧和IO許可權(quán)限,。

  • kernel code,kernel data,,user code,,user data:分別是內(nèi)核代碼段描述符,,內(nèi)核數(shù)據(jù)段描述符,用戶(hù)代碼段描述符,,用戶(hù)數(shù)據(jù)段描述符,,不同的進(jìn)程會(huì)使用同一個(gè)用戶(hù)代碼段/數(shù)據(jù)段描述符,這個(gè)也之后介紹,。

 

 

段描述符

  段描述符就是保存在全局描述符表或者局部描述符表中,,當(dāng)某個(gè)段寄存器試圖通過(guò)自己的段選擇符獲取對(duì)于的段描述符時(shí),會(huì)將獲取到的段描述符放到自己的非編程寄存器中,,這樣就不用每次訪(fǎng)問(wèn)段都要跑到內(nèi)存中的段描述符表中獲取,。

  • BASE(32位):段首地址的線(xiàn)性地址。

  • G:為0代表此段長(zhǎng)度以字節(jié)為單位,,為1代表此段長(zhǎng)度以4K為單位,。

  • LIMIT(20位):此最后一個(gè)地址的偏移量,也相當(dāng)于長(zhǎng)度,,G=0,,段大小在1~1MB,G=1,,段大小為4KB~4GB,。

  • S:為0表示是系統(tǒng)段,否則為代碼段或數(shù)據(jù)段,。

  • Type:描述段的類(lèi)型和存取權(quán)限,。

  • DPL:描述符特權(quán)級(jí),表示訪(fǎng)問(wèn)這個(gè)段CPU要求的最小優(yōu)先級(jí)(保存在cs寄存器的CPL特權(quán)級(jí)),,當(dāng)DPL為0時(shí),,只有CPL為0才能訪(fǎng)問(wèn),DPL為3時(shí),,CPL為0為3都可以訪(fǎng)問(wèn)這個(gè)段,。

  • P:表示此段是否被交換到磁盤(pán),總是置為1,,因?yàn)閘inux不會(huì)把一個(gè)段都交換到磁盤(pán)中,。

  • D或B:如果段的LIMIT是32位長(zhǎng),則置1,,如果是16位長(zhǎng),置0,。(詳見(jiàn)intel手冊(cè))

  • AVL:忽略,。

 

 

數(shù)據(jù)段描述符:

  表示這個(gè)段描述符代表一個(gè)數(shù)據(jù)段,這種描述符可以放在GDT或者LDT,。該描述符的S標(biāo)志位為1,,也就是非系統(tǒng)段,。需要注意內(nèi)核數(shù)據(jù)段屬于數(shù)據(jù)段描述符,并不屬于系統(tǒng)段描述符,。

代碼段描述符:

  表示這個(gè)段描述符代表一個(gè)數(shù)據(jù)段,,這種描述符可以放在GDT或者LDT。該描述符的S標(biāo)志位為1,,也就是非系統(tǒng)段,。需要注意內(nèi)核代碼段屬于代碼段描述符,并不屬于系統(tǒng)段描述符,。

系統(tǒng)段描述符:

  此描述符代表一個(gè)系統(tǒng)段,,Type的值代表了是哪一種系統(tǒng)段,S標(biāo)志位為0,。其中以下兩種都是系統(tǒng)段

  局部描述符表描述符(LDTD,,系統(tǒng)段描述符的一種):

    此種描述符代表一個(gè)包含有LDT的段,它只能保存在GDT中,,相應(yīng)的Type為2,,S為0。

  任務(wù)狀態(tài)段描述符(TSSD,,系統(tǒng)段描述符的一種):

    這個(gè)描述符代表一個(gè)任務(wù)狀態(tài)段(TSS),,這個(gè)段用于保存部分處理器寄存器的內(nèi)容(內(nèi)核態(tài)棧地址和IO許可權(quán)限位),它只保存在GDT中,,根據(jù)相應(yīng)的進(jìn)程是否正在CPU上運(yùn)行,,其Type字段的值分別為11或9.這個(gè)描述符S標(biāo)志為0。

  在所有段描述符中可能大家最關(guān)心的就是內(nèi)核代碼段描述符和內(nèi)核數(shù)據(jù)段描述符以及用戶(hù)代碼段描述符和用戶(hù)數(shù)據(jù)段描述符了,,這里也具體說(shuō)說(shuō)這幾個(gè)描述符,,它們的構(gòu)成如下:

  可以看出來(lái)它們的S都是1,都是非系統(tǒng)段,,注意并不是內(nèi)核用的段就是系統(tǒng)段,,這里的系統(tǒng)段的區(qū)分不是我們用戶(hù)態(tài)和內(nèi)核態(tài)的這種劃分。所有的用戶(hù)進(jìn)程都是使用同一個(gè)用戶(hù)代碼段描述符和用戶(hù)數(shù)據(jù)段描述符,,它們是__USER_CS和__USER_DS,,也就是每個(gè)進(jìn)程處于用戶(hù)態(tài)時(shí),它們的CS寄存器和DS寄存器中的值是相同的,。當(dāng)任何進(jìn)程或者中斷異常進(jìn)入內(nèi)核后,,都是使用相同的內(nèi)核代碼段描述符和內(nèi)核數(shù)據(jù)段描述符,它們是__KERNEL_CS和__KERNEL_DS,。這里要明確記得,,內(nèi)核數(shù)據(jù)段實(shí)際上就是內(nèi)核態(tài)堆棧段。

  還可以看出這幾個(gè)段的BASE都是0x00000000,,LIMIT都是0xfffff,,并且G為1,。也就是說(shuō),用戶(hù)代碼段,,用戶(hù)數(shù)據(jù)段,,內(nèi)核代碼段,內(nèi)核數(shù)據(jù)段這四個(gè)段它們的尋址地址都是0x00000000~0xffffffff,。也就是地址0到4G的大小,。這也形成了為什么所有進(jìn)程都可以使用同一個(gè)用戶(hù)代碼段和用戶(hù)數(shù)據(jù)段的條件。并且很清楚地可以看出,,內(nèi)核代碼段和內(nèi)核數(shù)據(jù)段都需要CPL為0時(shí)才能訪(fǎng)問(wèn),,而用戶(hù)代碼段和用戶(hù)數(shù)據(jù)段在CPL為0或者3時(shí)都可以訪(fǎng)問(wèn)。

  再看看這4個(gè)段描述符對(duì)應(yīng)的段選擇符:

  可以看出來(lái),,它們的TI為0,,表示都保存在全局段描述符表中??赡芸吹竭@里大家會(huì)有個(gè)疑問(wèn),,既然用戶(hù)段的RPL為3,那怎么去訪(fǎng)問(wèn)DPL為0的內(nèi)核段呢,,這就是linux精明的地方,,它就是禁止用戶(hù)態(tài)訪(fǎng)問(wèn)內(nèi)核態(tài)的數(shù)據(jù),但是內(nèi)核為用戶(hù)態(tài)開(kāi)了兩個(gè)小門(mén),,然用戶(hù)態(tài)能夠通過(guò)這兩個(gè)小門(mén)進(jìn)入到內(nèi)核態(tài)中,,這兩個(gè)小門(mén)就是系統(tǒng)調(diào)用與中斷和異常。

 

快速訪(fǎng)問(wèn)段描述符:

  先看一下系統(tǒng)是如何將邏輯地址轉(zhuǎn)換為線(xiàn)性地址的:

  邏輯地址是由段選擇符(16位) + 段內(nèi)偏移量offset(32位)得來(lái),。之前也說(shuō)到,,只有處于用戶(hù)態(tài),CS和DS寄存器中的值都是__USER_CS和__USER_DS,。只要處于內(nèi)核態(tài),,CS和DS寄存器中的值都是__KERNEL_CS和__KERNEL_DS。在我們編程過(guò)程中,,實(shí)際上提供的地址都是一個(gè)偏移量,,系統(tǒng)會(huì)自動(dòng)將這個(gè)偏移量與CS中的段選擇符進(jìn)行結(jié)合。也就是我們使用的邏輯地址實(shí)際上只使用了offset這一段,,段選擇符都為空,。之前也說(shuō)了這四個(gè)段描述符的BASE都為0x00000000,也得出當(dāng)邏輯地址通過(guò)這樣的分段機(jī)制轉(zhuǎn)為線(xiàn)性地址后,,實(shí)際上并沒(méi)有變化,,也就是邏輯地址=線(xiàn)性地址(其實(shí)這兩個(gè)地址都是offset的值)。

  也可以看出來(lái),,每次進(jìn)行地址轉(zhuǎn)換時(shí)都要通過(guò)段描述符獲取段的基地址然后與偏移量運(yùn)算得到線(xiàn)性地址,,而段描述符是保存在內(nèi)存當(dāng)中的,這樣每次轉(zhuǎn)換難道就要訪(fǎng)問(wèn)一次內(nèi)存或者cache嗎,?當(dāng)然不是,,之前說(shuō)到一共有6種段寄存器,它們每個(gè)都有屬于自己的一個(gè)非編程寄存器,,專(zhuān)門(mén)用于存放現(xiàn)在的段描述符,,比如拿cs段寄存器說(shuō),cs寄存器存放的是段選擇符,,所以每次通過(guò)邏輯地址訪(fǎng)問(wèn)這個(gè)段里的內(nèi)容時(shí),,都要通過(guò)這個(gè)段選擇符與gdtr(段描述符保存在全局描述符表中)或者ldtr(段描述符保存在局部描述符表中)結(jié)合然后從內(nèi)存中得到對(duì)應(yīng)的段描述符,然后根據(jù)段描述符的BASE和LIMIT將邏輯地址轉(zhuǎn)換為線(xiàn)性地址,。如果進(jìn)行連續(xù)訪(fǎng)問(wèn)時(shí)(而且連續(xù)訪(fǎng)問(wèn)的概率非常高),,這樣的效率就非常低了,這個(gè)cs段寄存器對(duì)應(yīng)的非編程寄存器就是用于保存這個(gè)段描述符的,,這樣就不用每次都從內(nèi)存中獲取段描述符,,而是直接從這個(gè)CS對(duì)應(yīng)的非編程寄存器中獲取段描述符。

 

  

任務(wù)狀態(tài)段(TSS)

  任務(wù)狀態(tài)段的段選擇符保存在tr寄存器中,,內(nèi)核為每個(gè)CPU準(zhǔn)備了一個(gè)任務(wù)狀態(tài)段,,其主要保存的是當(dāng)前進(jìn)程的IO許可權(quán)限位和棧頂指針,其作用主要有兩個(gè):

  • 進(jìn)程從用戶(hù)態(tài)切換到內(nèi)核態(tài)時(shí),,系統(tǒng)會(huì)從該CPU的TSS中獲取該進(jìn)程的內(nèi)核態(tài)堆棧地址,。
  • 當(dāng)用戶(hù)態(tài)進(jìn)程試圖通過(guò)in或out指令訪(fǎng)問(wèn)一個(gè)IO端口時(shí),CPU需要訪(fǎng)問(wèn)存放在TSS中的IO許可權(quán)限位以檢查該進(jìn)程是否有權(quán)限訪(fǎng)問(wèn)該IO端口,。

  TSS段的保存形式是一個(gè)tss_struct結(jié)構(gòu)體,,系統(tǒng)會(huì)將所有CPU的tss_struct結(jié)構(gòu)體組成一個(gè)init_tss數(shù)組的形式進(jìn)行保存,我們具體看一下tss_struct結(jié)構(gòu)體:

復(fù)制代碼
struct tss_struct {
    /*
     * The hardware state:
     */
    /* 存放寄存器的值的結(jié)構(gòu)體,,保存有棧頂指針SP寄存器的值 */
    struct x86_hw_tss    x86_tss;

    /*
     * The extra 1 is there because the CPU will access an
     * additional byte beyond the end of the IO permission
     * bitmap. The extra byte must be all 1 bits, and must
     * be within the limit.
     */
    /* 當(dāng)前進(jìn)程的IO許可權(quán)限位 */
    unsigned long        io_bitmap[IO_BITMAP_LONGS + 1];

    /*
     * .. and then another 0x100 bytes for the emergency kernel stack:
     */
    /* 緊急內(nèi)核棧 */
    unsigned long        stack[64];

} ____cacheline_aligned;


struct x86_hw_tss {
    u32            reserved1;
    u64            sp0;
    u64            sp1;
    u64            sp2;
    u64            reserved2;
    u64            ist[7];
    u32            reserved3;
    u32            reserved4;
    u16            reserved5;
    u16            io_bitmap_base;

} __attribute__((packed)) ____cacheline_aligned;
復(fù)制代碼

 

 

 

中斷或異常發(fā)生時(shí)的段切換

  其實(shí)發(fā)生段的切換有兩種情況,,一種是系統(tǒng)調(diào)用發(fā)生時(shí),一種是中斷或異常發(fā)生時(shí),,但是這兩種情況都大同小異,,這里我們只拿中斷異常發(fā)生的情況進(jìn)行說(shuō)明。

  這里只說(shuō)明系統(tǒng)大多數(shù)發(fā)生的情況,,不討論個(gè)例,。假定當(dāng)前系統(tǒng)處于用戶(hù)態(tài)執(zhí)行代碼中,這時(shí)候各個(gè)段寄存器的值應(yīng)該是這樣的:

  • CS: __USER_CS
  • DS: __USER_DS
  • SS: 保存著用戶(hù)態(tài)?;刂?/li>
  • ESP: 保存著用戶(hù)態(tài)棧頂?shù)刂?/li>
  • EIP: 保存下條將要執(zhí)行的指令地址

  當(dāng)中斷或異常發(fā)生時(shí),,CPU會(huì)按照如下步驟進(jìn)行執(zhí)行:

  1. 讀取由idtr寄存器保存的IDT(中斷向量表)中對(duì)應(yīng)的門(mén)描述符。
  2. 根據(jù)對(duì)應(yīng)的門(mén)描述符,,獲取其中保存的段選擇符,。(門(mén)描述符中保存有一個(gè)段選擇符和一個(gè)門(mén)的DPL,,這兩個(gè)部分是段切換的重要部分。具體可看我的博客:http://www.cnblogs.com/tolimit/p/4415348.html)
  3. 根據(jù)這個(gè)段選擇符獲取對(duì)于的段描述符(門(mén)描述符中保存的段選擇符基本都是__KERNEL_CS),。
  4. 這時(shí)CPU會(huì)使用CS寄存器中的CPL特權(quán)級(jí)與獲取的段描述符的DPL特權(quán)級(jí)比較,,如果DPL<=CPL,則通過(guò),,否則產(chǎn)生“通用保護(hù)”異常,,我們也看到,我們CS保存的是__USER_CS,,其CPL為3,,門(mén)描述符中保存的是__KERNEL_CS,其DPL為0,,;也就是會(huì)通過(guò)檢查,。
  5. 如果是異常情況,這時(shí)還會(huì)多一步進(jìn)行檢查,,會(huì)檢查門(mén)描述符中的DPL特權(quán)級(jí),,當(dāng)前特權(quán)級(jí)CPL的值 > DPL的值時(shí),則通過(guò)檢查,,否則不能通過(guò)檢查,,而只有系統(tǒng)門(mén)和系統(tǒng)中斷門(mén)的DPL是3,其他的異常門(mén)的DPL都為0,。這樣做的好處是避免了用戶(hù)程序訪(fǎng)問(wèn)陷阱門(mén),、中斷門(mén)和任務(wù)門(mén)。 
  6. 到這里檢查已經(jīng)通過(guò),,如果特權(quán)級(jí)發(fā)生變化(用戶(hù)態(tài)產(chǎn)生的中斷和異常,,肯定會(huì)發(fā)生特權(quán)級(jí)變化),則CPU會(huì)自動(dòng)幫切換不同特權(quán)級(jí)使用的寄存器,。
  7. 從tr寄存器中獲取CPU的TSS段,,從TSS段中獲取當(dāng)前進(jìn)程的內(nèi)核態(tài)堆棧指針和SS寄存器的值并將它們裝載到SS和EIP寄存器。
  8. 在當(dāng)前進(jìn)程的內(nèi)核棧中保存用戶(hù)態(tài)的SS寄存器和EIP寄存器的值,。(注意,,這里是先裝載了SS和EIP寄存器,讓其指向內(nèi)核棧,,再在內(nèi)核棧中保存用戶(hù)態(tài)的SS和EIP寄存器值)
  9. 如果故障已經(jīng)發(fā)生,,用引起異常的指令地址裝載到CS和EIP寄存器,從而使這條指令再次被執(zhí)行,。
  10. 在內(nèi)核棧中保存用戶(hù)態(tài)的eflags,、CS和EIP。CS和EIP的值就是返回后的下一條指令地址。如果有硬件出錯(cuò)碼,,也保存到內(nèi)核棧中,。
  11. 從中斷向量表的門(mén)中獲取CS和EIP值并裝載到CS和EIP寄存器。門(mén)中保存的CS和EIP合起來(lái)就會(huì)是中斷處理程序入口地址,。

  這些步驟執(zhí)行完后,,寄存器變化為:

  • CS: __KERNEL_CS
  • DS: __USER_DS
  • SS: 保存著內(nèi)核態(tài)棧基地址
  • ESP: 保存著內(nèi)核態(tài)棧頂?shù)刂?/li>
  • EIP: 保存著中斷處理程序入口地址

  而內(nèi)核棧中保存的值有:用戶(hù)態(tài)CS,,用戶(hù)態(tài)SS,用戶(hù)態(tài)ESP,,用戶(hù)態(tài)EIP,,用戶(hù)態(tài)eflags。當(dāng)系統(tǒng)從中斷返回用戶(hù)態(tài)時(shí),,就會(huì)從內(nèi)核棧中將這些值還原,,最后會(huì)回到進(jìn)入時(shí)的情況。至于為什么不用修改DS寄存器的值,,我也不清楚,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀(guān)點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多