《深入理解計算機系統(tǒng)》|處理器體系結(jié)構(gòu)

目錄

學(xué)習(xí)事物是怎樣工作的有其內(nèi)在價值:處理器是如何工作的對于我們普通人來說一直是個秘密勘伺,我們將從零開始構(gòu)建一個流水線處理器,為了實現(xiàn)這一處理器的軟硬件,我們有大量的前提知識要學(xué)習(xí)四濒,包括:指令系統(tǒng)蔬螟、硬件設(shè)計背景知識(hcl)、以及流水線的通用原理铁孵。學(xué)習(xí)完這些內(nèi)容以后我們才開始YY一個我們自己的86處理器锭硼。

本章內(nèi)容


※ YY一個指令集Y86:各種狀態(tài)、指令集蜕劝、編碼账忘、編程規(guī)范、異常處理熙宇;

※數(shù)字硬件設(shè)計背景:處理器的基本構(gòu)件鳖擒,如何連接操作,介紹hcl語言烫止;

※流水線原理蒋荚,如何實現(xiàn)高效的五個步驟;如何處理冒險與沖突馆蠕;

※開始實現(xiàn)我們自己的Y86期升;

筆記


一、基礎(chǔ)知識部分

1互躬、介紹一個精簡的Y86指令集


①狀態(tài)碼

狀態(tài)碼指明程序是否正常播赁,程序可以訪問和修改:程序寄存器、條件碼吼渡、PC和存儲器

②所支持的指令

長度:1-6字節(jié)容为,一條普通的指令包含:指令指示符+寄存器指示符+四字節(jié)常數(shù)

說明:

? ? ? ? 1] 字段 fn 指明是某個整數(shù)操作:OPL、數(shù)據(jù)移動條件:cmovXX寺酪、分支條件:jXX坎背;

? ? ? ? 2] 圖中最后的pushl、popl指明不需要訪問任何寄存器0xF表示寄雀;

? ? ? ? 3] xxmovl中:i代表立即數(shù)得滤,r代表寄存器,m代表存儲器盒犹;

? ? ? ? 4] OPL代表的是:add sub and xor懂更;jXX代表:jmp眨业、jle、jl沮协、je坛猪、jne、jge皂股、jg墅茉。

【疑惑:不允許:存儲器——存儲器 ;立即數(shù)——存儲器 為什么呜呐?】

③一條普通指令的編碼:

OPL指令有相同的code編碼6就斤,不同功能編碼function區(qū)別不同操作

其他具體的編碼如下:

整數(shù)、分支和數(shù)據(jù)傳送操作

根據(jù)功能進行最優(yōu)化的存儲方式蘑辑,比如rrmovl與條件傳送有相同的code編碼洋机,這是因為其行為相當(dāng)于無條件傳送。

洋魂!我們還需要訪問寄存器绷旗,為了訪問的便利我們給寄存器編號,統(tǒng)一存放在CPU的一個寄存器文件中副砍。就如學(xué)生時代的學(xué)號一樣衔肢,唯一、明確豁翎,也像收監(jiān)的犯罪嫌疑人角骤,你從入獄的那一天起將沒有名字,沒有身份心剥,只是一個簡化的號碼邦尊。

寄存器編號:esp4號,ebp5號优烧,F(xiàn)代表無寄存器

舉例說明:rmmovl %esp 蝉揍, ? 0x12345(%edx)

? ? ? ? ? ? ? ? rmmovl ——>4 ?0

? ? ? ? ? ? ? ? esp|edx—③—>4 2

? ? ? ? ? ? ? ? 0x12345——>00,01畦娄,23又沾,45(小端法存儲)

合成到最后的指令就是:[40] [42] [45] [23] [01] [00]

任何一個指令序列都是一個唯一的編碼

④異常

描述整體狀態(tài)

狀態(tài)碼如下:

我們簡單的在異常條件下停止執(zhí)行

⑤我們寫一段代碼試一試

c代碼

翻譯成x86和y86匯編形式,基本上沒什么不同

(特別注意:pushl 將棧指針esp減去4纷责,并將內(nèi)容寫入存儲器中捍掺。當(dāng)我們執(zhí)行push esp時撼短,我們約定:首先雅鹿esp的原始值再膳,然后壓入減去4的esp的值)

2、邏輯設(shè)計和硬件控制語言


我們將會學(xué)到:計算對位進行組合的邏輯曲横;存儲位的存儲原理和更新時鐘信號三部分內(nèi)容喂柒。

① 對單個為進行操作:邏輯門

與門不瓶,或門,非門

② 組合邏輯用HCL表示:一個邏輯門肯定實現(xiàn)不了很多功能灾杰,我們來組合一下

用于檢測兩個Bit是否相等:

eq = (a && b) || (蚊丐!a && !b)

當(dāng) a = b = 0時:上與邏輯為0艳吠,下與邏輯為1 或邏輯輸出eq為1麦备;

當(dāng)a = b = 1時:上與邏輯為1,下與邏輯為0 或邏輯輸出eq為1昭娩;

多路復(fù)用器:根據(jù)s的值選擇是輸出a或者b

out = (s && a) || (!s && b);

當(dāng) s = 0時凛篙,上與為b, 下與為0栏渺,或邏輯輸出out = b呛梆;

當(dāng) s = 1時, 上與為0磕诊, 下與為a填物,或邏輯輸入out = a;

四路復(fù)用器:

根據(jù)s1和s0組合霎终,選擇abcd其中一個
hcl表示圖

字級組合電路:單個的bit位并沒太大用途

字級組合電路:用32個Equal電路組合而成

多路復(fù)用組合電路:使用32個MUX組合而成滞磺,只是非門是統(tǒng)一的一個

多路復(fù)用組合電路

算術(shù)邏輯單元:ALU

根據(jù)輸入設(shè)置會執(zhí)行不同的邏輯運算中的一種


③ 集合關(guān)系

在處理器設(shè)計中,很多時候需要將一個信號與許多可能匹配的信號做比較莱褒,以此來檢驗正在處理的信號是否屬于某一類指令代碼雁刷;

判斷是否在集合中
結(jié)果在2,3中s1 = 1,結(jié)果在1,3中s0 = 1

④ 存儲器和時鐘:存儲原理(組合電路本身不能存儲信息保礼,只是一個時間序列電路)

更新周期將值放入存儲器中

分類:

1] 時鐘存儲器(寄存器):存儲單個位或字沛励;

2] 隨機訪問存儲器(存儲器):存儲多個字;(虛擬存儲系統(tǒng)炮障,寄存器文件目派,)

硬件寄存器和程序寄存器的區(qū)別:

? ? ? 硬件寄存器:在硬件中寄存器直接將輸入和輸出連接到電路的其他部分;

? ? ? 程序寄存器:CPU中位數(shù)不多的可尋址的寄存器胁赢,地址就是寄存器ID企蹭。

a.硬件寄存器:當(dāng)時鐘信號處于高頻上升階段時,才將輸入的信號加載

硬件寄存器:保存cc智末、pc谅摄、stat值

b.寄存器文件

寄存器文件

有兩個讀:A、B端口系馆,和一個寫:W端口送漠。允許同時進行多個讀寫操作,可以同時讀兩個寄存器和寫一個寄存器的值由蘑。srcX闽寡、desW代表地址代兵,valX、valW代表要數(shù)據(jù)爷狈。如我們要訪問3號寄存器ebx的值植影,就將srcA=3,然后valA就是要訪問的數(shù)據(jù)涎永。

c.隨機訪問存儲器

隨機訪問存儲器

假如我們要訪問一個地址address上的數(shù)據(jù)思币,就將該地址傳入address中,同時設(shè)置write=0羡微,那么在data out上的數(shù)據(jù)就是我們要訪問的值了支救。

3 流水線通用原理


以自動化洗車設(shè)備為例,車子需要按照一定的速度通過流水線拷淘,增加了一部分處理量各墨。也就是不用等前面的車子洗完,就可以開入另一輛車子了启涯;但這個系統(tǒng)有時候也會增加延遲贬堵,比如你只需要給車子打蠟,但也必須要經(jīng)過噴水结洼、抹干階段黎做。

①未加入流水線的系統(tǒng):

組合邏輯花了:300ps,處理卻只有20ps

②加入流水線的:

分成三個階段松忍,當(dāng)指令I(lǐng)1進入B的時候蒸殿,I2就可以進入A以此類推

通過將指令分成了3個階段,我經(jīng)過一個120ps周期鸣峭,每條指令就行進下一個階段

③流水線操作詳細說明:

三個階段流水線時序

說明:詳細說明240-360的時鐘周期的故事

1] 點①時鐘開始上升之前(239):階段A中計算的指令I(lǐng)2已經(jīng)到達第一個流水線寄存器的輸入宏所,圖中藍色區(qū)域表示。但是該流水線寄存器Reg的值仍然是I1中的深灰色區(qū)域摊溶;指令I(lǐng)1在階段B中計算的值已經(jīng)到達第二個流水線流水線寄存器的輸入Comb logic B爬骤,深灰色表示;

2] 點②時鐘開始進入上升階段(241):兩個組合邏輯輸入:A和B莫换,將結(jié)果放入到流水線寄存器中霞玄,形成圖2的形式。藍色Reg和深灰色Reg拉岁,并將組合邏輯A設(shè)置成發(fā)起指令I(lǐng)3計算坷剧;

3] 點 ③階段信號開始傳播,信號通過不同的速率通過各個不同的部分喊暖;

4] 點④360來到之前惫企,指令I(lǐng)3完成組合邏輯A處的加載,形成淺灰色區(qū)域哄啄。


流水線操作的一個時鐘周期

④流水線的局限性:

1] 不一致的劃分:由于階段的延遲并不一樣雅任,這樣空閑的空間就增加了延遲风范;

2] 流水線過深咨跌,收益下降沪么;

⑤帶反饋的流水線系統(tǒng):許多指令前后相關(guān),如何建立帶反饋的指令

二锌半、從零開始構(gòu)建我們的Y86處理器


1禽车、一個Y86的順序?qū)崿F(xiàn)(簡易方式)

為了要實現(xiàn)一個通用的框架,我們通常要找到這個框架的層次結(jié)構(gòu)刊殉,使得許多不同的指令可以共享相同的硬件殉摔,這是降低復(fù)雜度的一個有效的方法。

通用框架結(jié)構(gòu)

①跟蹤一塊指令序列的執(zhí)行:

Y86指令序列

②以 subl %edx记焊, %ebx為例:

③SEQ硬件結(jié)構(gòu)圖:

seq抽象視圖

(注:為什么是逆序從下往上寫的逸月?我們以后講流水線的時候再講解。)

④SEQ的時間和執(zhí)行順序:

一條重要的原則是:處理器從來不需要為了完成一條指令的執(zhí)行而去讀該指令更新了的狀態(tài)遍膜。

比如我們之前講到的push %esp指令碗硬,如果是分步執(zhí)行,先將esp-4瓢颅,然后將更新后的值作為寫地址效率就太低了恩尾。我們的做法是在執(zhí)行階段計算出valE的值,然后在訪存和寫會階段同時完成更新寄存器和存儲器的操作挽懦。

push指令的三個階段

我們再來看一段代碼:

講解SEQ時序

我們重點來看一下翰意,第3和第4條指令的執(zhí)行:

執(zhí)行序列

我們來簡單的講解一下執(zhí)行的過程:

1] 在時鐘周期3開始的時候點①狀態(tài)元素保存的是周期2執(zhí)行irmovl時的更新后的狀態(tài),用淺灰色表示信柿。點②:隨著時鐘周期開始上升時冀偶,地址0x00c載入pc中,這樣就取出了addl指令渔嚷,值沿著Combinational Logic流動蔫磨,充滿了淺藍色區(qū)域。在這個時候ebx就是加了以后的0x300新值圃伶,以及pc的新值0x00e堤如。但是指令的狀態(tài)仍然保留的是irmovl指令設(shè)置的值。

2] 時鐘周期4:點③開始的時候窒朋,會更新程序計數(shù)器搀罢、寄存器文件、和條件碼寄存器侥猩。也就是addl更新的狀態(tài)榔至。同樣的會取出je指令,用深灰表示欺劳,ZF=0不會選擇分支唧取。在④的時候铅鲤,pc產(chǎn)生新值0x013,Combinational Logic已經(jīng)被更新過枫弟,但是狀態(tài)還是保持的是addl指令的設(shè)置的值邢享。

我們再重申一下原則:通過時鐘周期來控制元素的更新,通過組合邏輯來傳播淡诗,每次時鐘周期由低到高時骇塘,處理器開始執(zhí)行一條新指令。處理器從來不需要為了完成一條指令的執(zhí)行而去讀該指令更新了的狀態(tài)韩容。

⑤Seq階段的實現(xiàn):

1] 取指階段

以PC為起始地址款违,從指令存儲器中讀出6個字節(jié)

說明:第一個字節(jié)為Split,字節(jié)0標(biāo)號為:icode和ifun群凶;1-5字節(jié)為Align:寄存器指示符和常數(shù)字的組合插爹。

2] 譯碼和寫回階段:這兩個階段都需要訪問寄存器文件

seq的譯碼和寫回階段

同時支持兩個讀,A请梢、B赠尾;和兩個寫:E、M溢陪;

3] 執(zhí)行階段

執(zhí)行階段:根據(jù)ALU的值設(shè)置條件碼寄存器萍虽,檢測條件碼的值判斷是否選擇分支

根據(jù)ALU fun信號設(shè)置是否進行,加減乘除操作形真。ALU的輸出就是valE

4] 訪存階段

訪存階段:讀或?qū)懘鎯ζ?/div>

5] 更新PC階段

根據(jù)指令代碼和分支標(biāo)志杉编,從valC valM和valP中選出下一個pc的值

2.Y86的流水線實現(xiàn)


我們說過,我們的目的是建立一個流水線化的處理器Y86咆霜,學(xué)了這么久的基礎(chǔ)知識邓馒,也建立了一個簡化的Seq模型,我們終于可以開始我們的內(nèi)容了蛾坯,首先我們來優(yōu)化一下簡易設(shè)計中的seq光酣,我們稱之為seq+:

①SEQ+:重新安排計算pc階段

SEQ+中沒有單獨的硬件寄存器來存放pc,而是通過pIconde脉课、pCnd等寄存器計算pc的值救军。

設(shè)計原則:只要處理器能夠正確的執(zhí)行機器語言,我們不需要程序猿可見狀態(tài)進行編碼倘零,只要能產(chǎn)生正確的值就可以了唱遭。

將pc移動到最開始的階段

詳細的seq+圖如下:

將pc從時鐘周期結(jié)束移動到了開始,這樣更適合于流水線

②插入流水線寄存器的pipe-處理器結(jié)構(gòu):

pipe-硬件結(jié)構(gòu)呈驶,我們創(chuàng)建了5階段流水線

說明:圖中以深藍色區(qū)域表示的就是我們加入的5個流水線寄存器拷泽,白色方塊代表不同的字段;

F : 保存pc預(yù)測值;

D :位于取指和譯碼之間司致,保存最新的指令信息拆吆,即將由譯碼階段處理;

E :位于譯碼和執(zhí)行之間脂矫,保存最新譯碼指令和從寄存器讀出的值枣耀,即將由執(zhí)行階段處理;

M :位于執(zhí)行和訪存之間羹唠,保存最新執(zhí)行指令的結(jié)果奕枢,條件分支和分支目標(biāo)娄昆,即將由訪存處理佩微;

W :位于訪存和反饋之間,提供給寄存器文件寫萌焰,完成ret指令哺眯,向pc提供返回地址。

③ 對信號進行重新排列和標(biāo)號

在pipe-中有4個標(biāo)號為stat的白色區(qū)域扒俯,就是不同指令的狀態(tài)碼:D_stat奶卓、E_stat、M_stat撼玄、W_stat來區(qū)分夺姑。而小寫的:f、d掌猛、e盏浙、m、w指的是流水階段荔茬。

④ 預(yù)測一下一個pc:除了分支和ret指令外废膘,我們基本上能夠用valC和valP的值來預(yù)測下一條指令的地址,這樣就可以通過之前學(xué)到的流水線技術(shù)使得每個周期執(zhí)行一條指令慕蔚。

⑤ 流水線的冒險和處理方法

什么是流水線的冒險丐黄?一條指令更新后面指令會用到的值。

數(shù)據(jù)冒險

當(dāng)irmovl $3, %eax在第六個時鐘周期的時候孔飒,寫回階段eax還未得到正確的值3灌闺,而流水線的系統(tǒng)中,addl %edx, %eax已經(jīng)需要使用eax的值坏瞄,這時侯得到的就是錯誤的值桂对。

冒險的分類:1)數(shù)據(jù)冒險;2)控制冒險惦积;3)加載\使用數(shù)據(jù)冒險

我們之前講到流水線的反饋中接校,提到過如果兩條相鄰數(shù)據(jù)存在關(guān)聯(lián)該如何處理成為了一個問題。特別是在使用流水線技術(shù)的情況下,如果一條指令要修改一個寄存器的內(nèi)容蛛勉,而下一條指令又剛剛需要引用該處的內(nèi)容鹿寻。如何使得兩條指令執(zhí)行正確。

方法一:暫停 ? ?

將指令阻滯在譯碼階段诽凌,相當(dāng)于加入一條nop指令毡熏,直到獲得正確的值,才讓其他指令繼續(xù)執(zhí)行侣诵。優(yōu)點是實現(xiàn)容易痢法,缺點是性能不佳

方法二:轉(zhuǎn)發(fā)

通過使用狀態(tài)碼保存的值,實現(xiàn)旁路的轉(zhuǎn)發(fā)

圖中可以看出杜顺,我們不是在被動的等待irmovl執(zhí)行完畢财搁,而是在addl指令需要用到eax值的時候,我們將irmovl的W階段的中間值躬络,W_valE=3轉(zhuǎn)發(fā)到addl指令中去尖奔,賦值給eax。

5個用作源的有:e_valE穷当、m_valM提茁、M_valE、W_valM馁菜、W_valE茴扁;兩個目的:valA、valB

有一類比較特殊的數(shù)據(jù)冒險:加載\使用數(shù)據(jù)冒險汪疮,我們特別講一下峭火?

Load 、 Use 數(shù)據(jù)冒險

上面的兩條指令铲咨,我們具體來看一下流水線的執(zhí)行過程:

加載使用數(shù)據(jù)冒險

我們執(zhí)行0x018指令躲胳,要在第八個時鐘周期的時候才能獲得eax的值,而0x01e指令在第七個時鐘周期就需要這個eax纤勒,我們不可能將這個值從第八個周期傳回第七個周期坯苹。就像不能穿越時間線回到過去一樣。遇到這種情況我們的處理方式是:使用暫停和轉(zhuǎn)發(fā)相結(jié)合的方法摇天,確切的講就是暫停addl執(zhí)行的一個時鐘周期粹湃,使得在周期8的時候?qū)崿F(xiàn)轉(zhuǎn)發(fā)。

⑥ 異常處理

異常分為:halt指令、有非法指令和功能碼組合的指令、訪問非法地址

處理方法:有多條指令引起異常孟害,由流水線最深的指令優(yōu)先級最高

? ? ? ? ? ? ? ? ?多條分支中有異常,取消預(yù)測指令

? ? ? ? ? ? ? ? ?出現(xiàn)異常孤钦,根據(jù)狀態(tài)碼的stat值歧斟,禁止其他指令更新程序狀態(tài)

⑦ PIPE各個階段的實現(xiàn):

1] PC選擇和取指階段

選擇和取指邏輯

PC選擇器必須要選擇出正確的pc值,一般來說有三種方式可選:當(dāng)預(yù)測錯誤分支進入訪存偏形,選擇M_valA中的valP静袖;當(dāng)ret指令進入寫回階段時,選擇W _valM俊扭;其他情況下選擇F_predPC队橙。

2] 譯碼和寫回階段:

譯碼寫回

疑問:對于轉(zhuǎn)發(fā)邏輯和不同的轉(zhuǎn)發(fā)源還不明白;對Sel+Fwn的具體功能不明確

3] 執(zhí)行階段:

同SEQ中相似

4] 訪存階段

⑧ 流水線控制邏輯

1]特殊情況的處理

ret指令實際的處理過程是在取指階段反復(fù)的取出ret指令后面的指令萨惑,在譯碼階段插入氣泡捐康;

當(dāng)分支結(jié)果還未計算出來的時候,保持預(yù)測指令執(zhí)行在FD階段庸蔼,這樣可以防止解总,如果預(yù)測錯誤,預(yù)測指令不會修改程序狀態(tài)朱嘴。如果決定不執(zhí)行分支倾鲫,取消指令的執(zhí)行不會帶來錯誤的影響粗合;實現(xiàn)的方法是根據(jù)stat的值:禁止執(zhí)行階段中的指令設(shè)置條件碼萍嬉;向存儲階段插入氣魄,以禁止寫入隙疚;當(dāng)寫回階段有異常的時候壤追,暫停寫回。

2]流水線的控制機制:加入氣泡和暫停

加入stall供屉、bubble

當(dāng)暫停stall=1的時候行冰,狀態(tài)保持先前的值不變;

當(dāng)bubble=1的時候伶丐,用nop覆蓋當(dāng)前的狀態(tài)

3]控制條件的組合

兩種特殊情況的組合

我們需要處理的情況為組合B:加載指令設(shè)置寄存器esp的值悼做,而ret指令將esp用作源操作數(shù),因為它必須從棧中彈出返回地址哗魂,流水線控制應(yīng)將ret指令阻滯在譯碼階段肛走。

(注:系統(tǒng)分析的重要性,僅僅運行正確其實并不可靠)

4]最終控制模型:

控制邏輯全

⑨ 未完成的工作:與存儲器的接口和多周期指令录别。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2016-12-25日晚朽色,閱讀完成

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市组题,隨后出現(xiàn)的幾起案子葫男,更是在濱河造成了極大的恐慌,老刑警劉巖崔列,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梢褐,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機盈咳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門趣效,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猪贪,你說我怎么就攤上這事跷敬。” “怎么了热押?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵西傀,是天一觀的道長。 經(jīng)常有香客問我桶癣,道長拥褂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任牙寞,我火速辦了婚禮饺鹃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘间雀。我一直安慰自己悔详,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布惹挟。 她就那樣靜靜地躺著茄螃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪连锯。 梳的紋絲不亂的頭發(fā)上归苍,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音运怖,去河邊找鬼拼弃。 笑死,一個胖子當(dāng)著我的面吹牛摇展,可吹牛的內(nèi)容都是我干的吻氧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼吗购,長吁一口氣:“原來是場噩夢啊……” “哼医男!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捻勉,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤镀梭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踱启,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體报账,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡研底,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了透罢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榜晦。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖羽圃,靈堂內(nèi)的尸體忽然破棺而出乾胶,到底是詐尸還是另有隱情,我是刑警寧澤朽寞,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布识窿,位于F島的核電站,受9級特大地震影響脑融,放射性物質(zhì)發(fā)生泄漏喻频。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一肘迎、第九天 我趴在偏房一處隱蔽的房頂上張望甥温。 院中可真熱鬧,春花似錦妓布、人聲如沸姻蚓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽史简。三九已至,卻和暖如春肛著,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跺讯。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工枢贿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刀脏。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓局荚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愈污。 傳聞我的和親對象是個殘疾皇子耀态,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容