哈工大操作系統(tǒng)實驗(六)內(nèi)存管理

本次實驗內(nèi)容:

  • 用Bochs調(diào)試工具跟蹤Linux 0.11的地址翻譯(地址映射)過程此改,了解IA-32和Linux 0.11的內(nèi)存管理機(jī)制;
  • 在Ubuntu上編寫多進(jìn)程的生產(chǎn)者—消費者程序刊苍,用共享內(nèi)存做緩沖區(qū);

(一)地址映射這個過程不好理解

在復(fù)制實驗指導(dǎo)書之前我想說下 linux虛擬內(nèi)存機(jī)制;

  • linux采用段頁結(jié)合的方式.
    段為虛擬地址,頁找到物理地址
  • 程序的地址分代碼段,數(shù)據(jù)段這樣一段段保存,用段基址+偏移量來標(biāo)記
  • 每個段在LDT這個段表記錄著 每一個段的邏輯基地址;
  • LDT的物理地址可以在GDT(全局描述符表)找到.
    找到LDT 再根據(jù)段號 去找到段基地址,加上偏移量就等于線性虛擬地址.
  • 找到虛擬地址 找物理地址就是找頁目錄,頁表,頁偏移量的問題了
  • 所有這些地址注意轉(zhuǎn)化成二進(jìn)制,然后懂得每一位的意義;
    *段選擇符是一個64位的數(shù),所以占8個字節(jié),分高4字節(jié)跟低4字節(jié)
    前低后高 31-0這樣排列

實驗指導(dǎo)書關(guān)于這個過程很詳細(xì),我就復(fù)制粘貼了:
編譯好Linux 0.11后濒析,首先通過運行./dbg-asm啟動調(diào)試器正什,此時Bochs的窗口處于黑屏狀態(tài),而命令行窗口顯示:

image.png

“Next at t=0”表示下面的指令是Bochs啟動后要執(zhí)行的第一條軟件指令号杏。單步跟蹤進(jìn)去就能看到bios的代碼婴氮。不過這不是本實驗需要的。直接輸入命令“c”盾致,continue程序的運行主经,Bochs一如既往地啟動了Linux 0.11。
在Linux 0.11下輸入(或拷入)test.c庭惜,編譯為test罩驻,運行之,打印如下信息:
The logical/virtual address of i is 0x00003004
只要test不變护赊,0x00003004這個值在任何人的機(jī)器上都是一樣的惠遏。即使在同一個機(jī)器上多次運行test,也是一樣的骏啰。
test是一個死循環(huán)爽哎,只會不停占用CPU,不會退出器一。
暫停
當(dāng)test運行的時候课锌,在命令行窗口按“ctrl+c”,Bochs會暫停運行,進(jìn)入調(diào)試狀態(tài)渺贤。絕大多數(shù)情況下都會停在test內(nèi)雏胃,顯示類似如下信息:
(0) [0x00fc8031] 000f:00000031 (unk. ctxt): cmp dword ptr ds:0x3004, 0x00000000 ; 833d0430000000
其中加粗的“000f”如果是“0008”,則說明中斷在了內(nèi)核里志鞍。那么就要c瞭亮,然后再ctrl+c,直到變?yōu)椤?00f”為止固棚。如果顯示的下一條指令不是“cmp ...”统翩,就用“n”命令單步運行幾步,直到停在“cmp ...”此洲。
使用命令“u /7”厂汗,顯示從當(dāng)前位置開始7條指令的反匯編代碼,如下:
10000031: ( ): cmp dword ptr ds:0x3004, 0x00000000 ; 833d043000000010000038: ( ): jz .+0x00000002 ; 74021000003a: ( ): jmp .+0xfffffff5 ; ebf51000003c: ( ): xor eax, eax ; 31c01000003e: ( ): jmp .+0x00000000 ; eb0010000040: ( ): leave ; c910000041: ( ): ret ; c3
這就是test.c中從while開始一直到return的匯編代碼呜师。變量i保存在ds:0x3004這個地址娶桦,并不停地和0進(jìn)行比較,直到它為0汁汗,才會跳出循環(huán)衷畦。
現(xiàn)在,開始尋找ds:0x3004對應(yīng)的物理地址知牌。
段表
ds:0x3004是虛擬地址祈争,ds表明這個地址屬于ds段。首先要找到段表角寸,然后通過ds的值在段表中找到ds段的具體信息菩混,才能繼續(xù)進(jìn)行地址翻譯。每個在IA-32上運行的應(yīng)用程序都有一個段表袭厂,叫LDT墨吓,段的信息叫段描述符球匕。
LDT在哪里呢纹磺?ldtr寄存器是線索的起點,通過它可以在GDT(全局描述符表)中找到LDT的物理地址亮曹。
用“sreg”命令:
cs:s=0x000f, dl=0x00000002, dh=0x10c0fa00, valid=1ds:s=0x0017, dl=0x00003fff, dh=0x10c0f300, valid=3ss:s=0x0017, dl=0x00003fff, dh=0x10c0f300, valid=1es:s=0x0017, dl=0x00003fff, dh=0x10c0f300, valid=1fs:s=0x0017, dl=0x00003fff, dh=0x10c0f300, valid=1gs:s=0x0017, dl=0x00003fff, dh=0x10c0f300, valid=1ldtr:s=0x0068, dl=0xc2d00068, dh=0x000082f9, valid=1tr:s=0x0060, dl=0x52e80068, dh=0x00008bfd, valid=1gdtr:base=0x00005cc8, limit=0x7ffidtr:base=0x000054c8, limit=0x7ff
可以看到ldtr的值是0x0068=0000000001101000(二進(jìn)制)橄杨,表示LDT表存放在GDT表的1101(二進(jìn)制)=13(十進(jìn)制)號位置(每位數(shù)據(jù)的意義參考后文敘述的段選擇子)。而GDT的位置已經(jīng)由gdtr明確給出照卦,在物理地址的0x00005cc8式矫。用“xp /32w 0x00005cc8”查看從該地址開始,32個字的內(nèi)容役耕,即GDT表的前16項采转,如下:
0x00005cc8 : 0x00000000 0x00000000 0x00000fff 0x00c09a000x00005cd8 : 0x00000fff 0x00c09300 0x00000000 0x000000000x00005ce8 : 0xa4280068 0x00008901 0xa4100068 0x000082010x00005cf8 : 0xf2e80068 0x000089ff 0xf2d00068 0x000082ff0x00005d08 : 0xd2e80068 0x000089ff 0xd2d00068 0x000082ff0x00005d18 : 0x12e80068 0x000089fc 0x12d00068 0x000082fc0x00005d28 : 0xc2e80068 0x00008bf9 0xc2d00068 0x000082f90x00005d38 : 0x00000000 0x00000000 0x00000000 0x00000000
GDT表中的每一項占64位(8個字節(jié)),所以我們要查找的項的地址是“0x00005cc8 + 13 * 8”」蚀龋“xp /2w 0x00005cc8 + 13 * 8”板熊,得到:
0x00005d30 : 0xc2d00068 0x000082f9
上兩步看到的數(shù)值可能和這里給出的示例不一致,這是很正常的察绷。如果想確認(rèn)是否準(zhǔn)確干签,就看sreg輸出中,ldtr所在行里拆撼,dl和dh的值容劳,它們是Bochs的調(diào)試器自動計算出的,你尋找到的必須和它們一致闸度。
“0xc2d00068 0x000082f9”將其中的加粗?jǐn)?shù)字組合為“0x00f9c2d0”竭贩,這就是LDT表的物理地址(為什么這么組合,參考后文介紹的段描述符)筋岛∪⑹樱“xp /8w 0x00f9c2d0”,得到:
0x00f9c2d0 : 0x00000000 0x00000000 0x00000002 0x10c0fa000x00f9c2e0 : 0x00003fff 0x10c0f300 0x00000000 0x00f9d000
這就是LDT表的前4項內(nèi)容了睁宰。
段描述符
在保護(hù)模式下肪获,段寄存器有另一個名字,叫段選擇子柒傻,因為它保存的信息主要是該段在段表里索引值孝赫,用這個索引值可以從段表中“選擇”出相應(yīng)的段描述符。
先看看ds選擇子的內(nèi)容红符,還是用“sreg”命令:
cs:s=0x000f, dl=0x00000002, dh=0x10c0fa00, valid=1ds:s=0x0017, dl=0x00003fff, dh=0x10c0f300, valid=3ss:s=0x0017, dl=0x00003fff, dh=0x10c0f300, valid=1es:s=0x0017, dl=0x00003fff, dh=0x10c0f300, valid=1fs:s=0x0017, dl=0x00003fff, dh=0x10c0f300, valid=1gs:s=0x0017, dl=0x00003fff, dh=0x10c0f300, valid=1ldtr:s=0x0068, dl=0x52d00068, dh=0x000082fd, valid=1tr:s=0x0060, dl=0x52e80068, dh=0x00008bfd, valid=1gdtr:base=0x00005cc8, limit=0x7ffidtr:base=0x000054c8, limit=0x7ff
可以看到青柄,ds的值是0x0017。段選擇子是一個16位寄存器预侯,它各位的含義如下圖:


其中RPL是請求特權(quán)級致开,當(dāng)訪問一個段時,處理器要檢查RPL和CPL(放在cs的位0和位1中萎馅,用來表示當(dāng)前代碼的特權(quán)級)双戳,即使程序有足夠的特權(quán)級(CPL)來訪問一個段,但如果RPL(如放在ds中糜芳,表示請求數(shù)據(jù)段)的特權(quán)級不足飒货,則仍然不能訪問,即如果RPL的數(shù)值大于CPL(數(shù)值越大峭竣,權(quán)限越刑粮ā),則用RPL的值覆蓋CPL的值皆撩。而段選擇子中的TI是表指示標(biāo)記扣墩,如果TI=0,則表示段描述符(段的詳細(xì)信息)在GDT(全局描述符表)中,即去GDT中去查呻惕;而TI=1盘榨,則去LDT(局部描述符表)中去查。
看看上面的ds蟆融,0x0017=0000000000010111(二進(jìn)制)草巡,所以RPL=11,可見是在最低的特權(quán)級(因為在應(yīng)用程序中執(zhí)行)型酥,TI=1山憨,表示查找LDT表,索引值為10(二進(jìn)制)= 2(十進(jìn)制)弥喉,表示找LDT表中的第3個段描述符(從0開始編號)郁竟。
LDT和GDT的結(jié)構(gòu)一樣,每項占8個字節(jié)由境。所以第3項“0x00003fff 0x10c0f300”就是搜尋好久的ds的段描述符了棚亩。用“sreg”輸出中ds所在行的dl和dh值可以驗證找到的描述符是否正確。
接下來看看段描述符里面放置的是什么內(nèi)容:

可以看到虏杰,段描述符是一個64位二進(jìn)制的數(shù)讥蟆,存放了段基址和段限長等重要的數(shù)據(jù)。其中位P(Present)是段是否存在的標(biāo)記纺阔;位S用來表示是系統(tǒng)段描述符(S=0)還是代碼或數(shù)據(jù)段描述符(S=1)瘸彤;四位TYPE用來表示段的類型,如數(shù)據(jù)段笛钝、代碼段质况、可讀、可寫等玻靡;DPL是段的權(quán)限结榄,和CPL、RPL對應(yīng)使用囤捻;位G是粒度臼朗,G=0表示段限長以位為單位攀操,G=1表示段限長以4KB為單位;其他內(nèi)容就不詳細(xì)解釋了翩伪。
段基址和線性地址
費了很大的勁界牡,實際上我們需要的只有段基址一項數(shù)據(jù),即段描述符“0x00003fff 0x10c0f300”中加粗部分組合成的“0x10000000”鱼响。這就是ds段在線性地址空間中的起始地址(ds段的段基址)。用同樣的方法也可以算算其它段的基址,都是這個數(shù)醋拧。
段基址+段內(nèi)偏移,就是線性地址了。所以ds:0x3004的線性地址就是:
0x10000000 + 0x3004 = 0x10003004
用“calc ds:0x3004”命令可以驗證這個結(jié)果丹壕。
頁表
從線性地址計算物理地址庆械,需要查找頁表。線性地址變成物理地址的過程如下:


首先需要算出線性地址中的頁目錄號菌赖、頁表號和頁內(nèi)偏移缭乘,它們分別對應(yīng)了32位線性地址的10位+10位+12位,所以0x10003004的頁目錄號是64琉用,頁號3堕绩,頁內(nèi)偏移是4。
IA-32下邑时,頁目錄表的位置由CR3寄存器指引奴紧。“creg”命令可以看到:
CR0=0x8000001b: PG cd nw ac wp ne ET TS em MP PECR2=page fault laddr=0x10002f68CR3=0x00000000PCD=page-level cache disable=0PWT=page-level writes transparent=0CR4=0x00000000: osxmmexcpt osfxsr pce pge mce pae pse de tsd pvi vme
說明頁目錄表的基址為0晶丘∈虻看看其內(nèi)容,“xp /68w 0”:
0x00000000 : 0x00001027 0x00002007 0x00003007 0x000040270x00000010 : 0x00000000 0x00024764 0x00000000 0x000000000x00000020 : 0x00000000 0x00000000 0x00000000 0x000000000x00000030 : 0x00000000 0x00000000 0x00000000 0x000000000x00000040 : 0x00ffe027 0x00000000 0x00000000 0x000000000x00000050 : 0x00000000 0x00000000 0x00000000 0x000000000x00000060 : 0x00000000 0x00000000 0x00000000 0x000000000x00000070 : 0x00000000 0x00000000 0x00000000 0x000000000x00000080 : 0x00ff3027 0x00000000 0x00000000 0x000000000x00000090 : 0x00000000 0x00000000 0x00000000 0x000000000x000000a0 : 0x00000000 0x00000000 0x00000000 0x000000000x000000b0 : 0x00000000 0x00000000 0x00000000 0x00ffb0270x000000c0 : 0x00ff6027 0x00000000 0x00000000 0x000000000x000000d0 : 0x00000000 0x00000000 0x00000000 0x000000000x000000e0 : 0x00000000 0x00000000 0x00000000 0x000000000x000000f0 : 0x00000000 0x00000000 0x00000000 0x00ffa0270x00000100 : 0x00faa027 0x00000000 0x00000000 0x00000000
頁目錄表和頁表中的內(nèi)容很簡單浅浮,是1024個32位(正好是4K)數(shù)沫浆。這32位中前20位是物理頁框號,后面是一些屬性信息(其中最重要的是最后一位P)滚秩。其中第65個頁目錄項就是我們要找的內(nèi)容件缸,用“xp /w 0+644”查看:
0x00000100 : 0x00faa027
其中的027是屬性,顯然P=1叔遂,其他屬性實驗者自己分析吧他炊。頁表所在物理頁框號為0x00faa,即頁表在物理內(nèi)存的0x00faa000位置已艰。從該位置開始查找3號頁表項痊末,得到(xp /w 0x00faa000+3
4):
0x00faa00c : 0x00fa7067
其中067是屬性,顯然P=1哩掺,應(yīng)該是這樣凿叠。
物理地址
最終結(jié)果馬上就要出現(xiàn)了!
線性地址0x10003004對應(yīng)的物理頁框號為0x00fa7嚼吞,和頁內(nèi)偏移0x004接到一起盒件,得到0x00fa7004,這就是變量i的物理地址舱禽〕吹螅可以通過兩種方法驗證。
第一種方法是用命令“page 0x10003004”誊稚,可以得到信息:“l(fā)inear page 0x10003000 maps to physical page 0x00fa7000”翔始。
第二種方法是用命令“xp /w 0x00fa7004”罗心,可以看到:
0x00fa7004 : 0x12345678
這個數(shù)值確實是test.c中i的初值。
現(xiàn)在城瞎,通過直接修改內(nèi)存來改變i的值為0渤闷,命令是: setpmem 0x00fa7004 4 0,表示從0x00fa7004地址開始的4個字節(jié)都設(shè)為0脖镀。然后再用“c”命令繼續(xù)Bochs的運行飒箭,可以看到test退出了,說明i的修改成功了蜒灰,此項實驗結(jié)束补憾。

總結(jié)一下需要找的過程:

  • 找段號跟段偏移量
  • 找LDT跟GDT
  • 根據(jù)GDT的段描述符找到LDT的段描述符拼湊段基址
  • 根據(jù)段基址+偏移量算出 線性虛擬地址
  • 找頁目錄表
  • 根據(jù)頁目錄找到頁表 進(jìn)行地址翻譯

(二)共享內(nèi)存

共享內(nèi)存用函數(shù):

int shmget(key_t key, size_t size, int shmflg);  
第一個參數(shù),與信號量的semget函數(shù)一樣卷员,程序需要提供一個參數(shù)key(非0整數(shù))盈匾,它有效地為共享內(nèi)存段命名,shmget函數(shù)成功時返回一個與key相關(guān)的共享內(nèi)存標(biāo)識符(非負(fù)整數(shù))毕骡,用于后續(xù)的共享內(nèi)存函數(shù)削饵。調(diào)用失敗返回-1.

不相關(guān)的進(jìn)程可以通過該函數(shù)的返回值訪問同一共享內(nèi)存,它代表程序可能要使用的某個資源未巫,程序?qū)λ泄蚕韮?nèi)存的訪問都是間接的窿撬,程序先通過調(diào)用shmget函數(shù)并提供一個鍵,再由系統(tǒng)生成一個相應(yīng)的共享內(nèi)存標(biāo)識符(shmget函數(shù)的返回值)叙凡,只有shmget函數(shù)才直接使用信號量鍵劈伴,所有其他的信號量函數(shù)使用由semget函數(shù)返回的信號量標(biāo)識符。

第二個參數(shù)握爷,size以字節(jié)為單位指定需要共享的內(nèi)存容量

第三個參數(shù)跛璧,shmflg是權(quán)限標(biāo)志,它的作用與open函數(shù)的mode參數(shù)一樣新啼,如果要想在key標(biāo)識的共享內(nèi)存不存在時追城,創(chuàng)建它的話,可以與IPC_CREAT做或操作燥撞。共享內(nèi)存的權(quán)限標(biāo)志與文件的讀寫權(quán)限一樣座柱,舉例來說,0644,它表示允許一個進(jìn)程創(chuàng)建的共享內(nèi)存被內(nèi)存創(chuàng)建者所擁有的進(jìn)程向共享內(nèi)存讀取和寫入數(shù)據(jù)物舒,同時其他用戶創(chuàng)建的進(jìn)程只能讀取共享內(nèi)存色洞。
第一次創(chuàng)建完共享內(nèi)存時,它還不能被任何進(jìn)程訪問冠胯,shmat函數(shù)的作用就是用來啟動對該共享內(nèi)存的訪問火诸,并把共享內(nèi)存連接到當(dāng)前進(jìn)程的地址空間
void *shmat(int shm_id, const void *shm_addr, int shmflg);  
第一個參數(shù),shm_id是由shmget函數(shù)返回的共享內(nèi)存標(biāo)識涵叮。
第二個參數(shù)惭蹂,shm_addr指定共享內(nèi)存連接到當(dāng)前進(jìn)程中的地址位置,通常為空割粮,表示讓系統(tǒng)來選擇共享內(nèi)存的地址盾碗。
第三個參數(shù),shm_flg是一組標(biāo)志位舀瓢,通常為0廷雅。

調(diào)用成功時返回一個指向共享內(nèi)存第一個字節(jié)的指針,如果調(diào)用失敗返回-1.

product.c文件:

#define   __LIBRARY__
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>

#define   Total        500
#define   BUFFERSIZE   10

int main()
{
    int shmid;
    int put_pos = 0, i;
    int *ShareAddress;
    sem_t *empty, *full, *mutex;

    empty = (sem_t *)sem_open("empty", O_CREAT, 0777, 10);
    full  = (sem_t *)sem_open("full", O_CREAT, 0777, 0);
    mutex = (sem_t *)sem_open("mutex",O_CREAT, 0777, 1);
    
    shmid = shmget( 555204, BUFFERSIZE*sizeof(int), IPC_CREAT|0666);  
/*
    if(!shmid)
    {    
         printf("shmget failed!");
         exit(0);
    }
*/
    ShareAddress = (int*)shmat(shmid, NULL, 0);
    /*
    if(!ShareAddress)
    {
         printf("shmat failed!");
         exit(0);
    }
*/
    for( i = 0 ; i < Total; i++)
        {
            sem_wait(empty);
            sem_wait(mutex);
            
            ShareAddress[put_pos] = i;
            put_pos = ( put_pos + 1 ) % BUFFERSIZE;
            
            sem_post(mutex);
            sem_post(full);
        }

    while(1);

    return 0;
}

consumer.c文件:

#define   __LIBRARY__
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define   Total        500
#define   BUFFERSIZE   10

int main()
{
    int shmid;
    int get_pos = 0, i;
    int *ShareAddress;
    sem_t *empty, *full, *mutex;

    empty = (sem_t *)sem_open("empty", O_CREAT, 0777, 10);
    full  = (sem_t *)sem_open("full", O_CREAT, 0777, 0);
    mutex = (sem_t *)sem_open("mutex",O_CREAT, 0777, 1);

    shmid = shmget( 555204, BUFFERSIZE*sizeof(int), IPC_CREAT|0666 );  /*返回共享內(nèi)存的標(biāo)識符*/
  /*  if(!shmid)
    {    
         printf("shmget failed!");
         fflush(stdout);
         exit(0);
    }
*/
    ShareAddress = (int*)shmat(shmid, NULL, 0);
 /*   
    if(!ShareAddress)
    {
         printf("shmat failed!");
         fflush(stdout);
         exit(0);
    }
*/
    for(i = 0; i < Total; i++)
    {
        sem_wait(full);
        sem_wait(mutex);
        
        
        printf("%d\n", ShareAddress[get_pos]);
        fflush(stdout);
        get_pos = ( get_pos + 1 ) % BUFFERSIZE;
        
        sem_post(mutex);
        sem_post(empty);
    }

    sem_unlink("empty");
    sem_unlink("full");
    sem_unlink("mutex");
    
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末京髓,一起剝皮案震驚了整個濱河市航缀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堰怨,老刑警劉巖芥玉,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異备图,居然都是意外死亡灿巧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門揽涮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抠藕,“玉大人,你說我怎么就攤上這事蒋困《芩疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵雪标,是天一觀的道長零院。 經(jīng)常有香客問我,道長村刨,這世上最難降的妖魔是什么门粪? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮烹困,結(jié)果婚禮上玄妈,老公的妹妹穿的比我還像新娘。我一直安慰自己髓梅,他們只是感情好拟蜻,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枯饿,像睡著了一般酝锅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奢方,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天搔扁,我揣著相機(jī)與錄音爸舒,去河邊找鬼。 笑死稿蹲,一個胖子當(dāng)著我的面吹牛扭勉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苛聘,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涂炎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了设哗?” 一聲冷哼從身側(cè)響起唱捣,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎网梢,沒想到半個月后震缭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡战虏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年蛀序,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片活烙。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡徐裸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啸盏,到底是詐尸還是另有隱情重贺,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布回懦,位于F島的核電站气笙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怯晕。R本人自食惡果不足惜潜圃,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舟茶。 院中可真熱鬧谭期,春花似錦、人聲如沸吧凉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阀捅。三九已至胀瞪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饲鄙,已是汗流浹背凄诞。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工圆雁, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帆谍。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓伪朽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親既忆。 傳聞我的和親對象是個殘疾皇子驱负,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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

  • 最近開始想稍微深入一點地學(xué)習(xí)Linux內(nèi)核嗦玖,主要參考內(nèi)容是《深入理解Linux內(nèi)核》和《深入理解Linux內(nèi)核架構(gòu)...
    ice_camel閱讀 1,788評論 0 2
  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎(chǔ)入門學(xué)習(xí)匯編語言》系列視頻的筆記橡疼,在此感謝他和像他一樣...
    Gibbs基閱讀 37,204評論 8 114
  • 第二章 內(nèi)存尋址 內(nèi)存地址 內(nèi)存地址分為三種:邏輯地址(logical address)(段+偏移量) ...
    rlkbk閱讀 431評論 0 1
  • 核心目的:實現(xiàn)由實模式到保護(hù)模式的轉(zhuǎn)換 核心步驟: 1)程序定義了GDT數(shù)據(jù)結(jié)構(gòu) 2)16位代碼進(jìn)行了一些...
    王偵閱讀 1,125評論 0 0
  • 三十歲援所,你好!其實我始終認(rèn)為我才29啊欣除,但在年齡這個問題上住拭,還是要尊重中華民族傳統(tǒng)文化的傳統(tǒng)算法。 時間條倒退历帚,在...
    午后木槿花閱讀 577評論 1 0