Centos環(huán)境下bochs實驗-編譯linux 0.11源碼

下載實驗教程

資料包下載地址
https://github.com/hoverwinter/HIT-OSLab

資料包中包含linux 0.11源碼,以及gcc-3.4工具包(Ubuntu版本)挥吵,bochs工具(下面會用到)麻捻,還有相關(guān)實驗資料
源碼也可以通過官網(wǎng)下載:

wget http://ftp.gnu.org/gnu/gcc/gcc-3.4.0/gcc-3.4.0.tar.gz

linux 0.11源碼編譯

as86 ld86安裝

下載 bin86-0.16.0-2.i586.rpm (可以在csdn上搜索)
rpm -ivh bin86-0.16.0-2.i586.rpm

gcc 3.4安裝

出現(xiàn)以下錯誤

./unwind-dw2.c: In function `uw_frame_state_for':
./unwind-dw2.c:1022: error: field `info' has incomplete type
make[2]: *** [libgcc/32/unwind-dw2.o] Error 1
make[2]: Leaving directory `/home/shupan/source/gcc-3.4.0/gcc'
make[1]: *** [stmp-multilib] Error 2
make[1]: Leaving directory `/home/shupan/source/gcc-3.4.0/gcc'
make: *** [all-gcc] Error 2

解決方案 【重要】

gcc-3.4.0/gcc/config/i386/linux.h (32位機)
或者
gcc-3.4.0/gcc/config/i386/linux64.h (64位機)
文件中的 struct siginfo 改成 siginfo_t , struct siginfo * 改成 siginfo_t *

linux 0.11中Makefile寫死了gcc-3.4担扑,所以做一個軟鏈

ln -s /usr/local/bin/gcc /usr/local/bin/gcc-3.4 

編譯

在源碼目錄行執(zhí)行命令:make
很快就會生成 Image蚯涮,大功告成鸭丛,比編譯gcc快多了罐监。

若遇到問題眉抬,參考以下文章
https://blog.csdn.net/qq_40758751/article/details/88707214
或者

PARALLEL_LIBS=/usr/lib/parallels-tools/installer/iagent32/libs/
export LD_LIBRARY_PATH=$PARALLEL_LIBS/libSM.so.6:$PARALLEL_LIBS/libICE.so.6

編譯成功后贯吓,如下,可以看看每一步執(zhí)行了哪些操作蜀变。

as86 -0 -a -o boot/bootsect.o boot/bootsect.s
ld86 -0 -s -o boot/bootsect boot/bootsect.o
as86 -0 -a -o boot/setup.o boot/setup.s
ld86 -0 -s -o boot/setup boot/setup.o
gcc-3.4 -m32 -g -I./include -traditional -c boot/head.s
mv head.o boot/
gcc-3.4 -march=i386  -m32 -g -Wall -O2 -fomit-frame-pointer  \
-nostdinc -Iinclude -c -o init/main.o init/main.c
init/main.c:23: warning: static declaration of 'fork' follows non-static declaration
include/unistd.h:210: warning: previous declaration of 'fork' was here
init/main.c:24: warning: static declaration of 'pause' follows non-static declaration
include/unistd.h:224: warning: previous declaration of 'pause' was here
init/main.c:26: warning: static declaration of 'sync' follows non-static declaration
include/unistd.h:235: warning: previous declaration of 'sync' was here
init/main.c:105: warning: return type of 'main' is not `int'
(cd kernel; make)
make[1]: Entering directory `/home/shupan/oslab/linux-0.11/kernel'
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o sched.o sched.c
as --32 -o system_call.o system_call.s
system_call.s: Assembler messages:
system_call.s:94: Warning: indirect call without `*'
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o traps.o traps.c
In file included from traps.c:13:
../include/string.h:129: warning: conflicting types for built-in function 'strchr'
../include/string.h:146: warning: conflicting types for built-in function 'strrchr'
../include/string.h:401: warning: conflicting types for built-in function 'memset'
as --32 -o asm.o asm.s
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o fork.o fork.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o panic.o panic.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o printk.o printk.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o vsprintf.o vsprintf.c
In file included from vsprintf.c:13:
../include/string.h:129: warning: conflicting types for built-in function 'strchr'
../include/string.h:146: warning: conflicting types for built-in function 'strrchr'
../include/string.h:401: warning: conflicting types for built-in function 'memset'
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o sys.o sys.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o exit.o exit.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o signal.o signal.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o mktime.o mktime.c
ld -m elf_i386 -r -o kernel.o sched.o system_call.o traps.o asm.o fork.o panic.o printk.o vsprintf.o sys.o exit.o signal.o mktime.o
sync
make[1]: Leaving directory `/home/shupan/oslab/linux-0.11/kernel'
(cd mm; make)
make[1]: Entering directory `/home/shupan/oslab/linux-0.11/mm'
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o memory.o memory.c
as --32 -o page.o page.s
ld -m elf_i386 -r -o mm.o memory.o page.o
make[1]: Leaving directory `/home/shupan/oslab/linux-0.11/mm'
(cd fs; make)
make[1]: Entering directory `/home/shupan/oslab/linux-0.11/fs'
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o open.o open.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o read_write.o read_write.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o inode.o inode.c
In file included from inode.c:7:
../include/string.h:129: warning: conflicting types for built-in function 'strchr'
../include/string.h:146: warning: conflicting types for built-in function 'strrchr'
../include/string.h:401: warning: conflicting types for built-in function 'memset'
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o file_table.o file_table.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o buffer.o buffer.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o super.o super.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o block_dev.o block_dev.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o char_dev.o char_dev.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o file_dev.o file_dev.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o stat.o stat.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o exec.o exec.c
In file included from exec.c:21:
../include/string.h:129: warning: conflicting types for built-in function 'strchr'
../include/string.h:146: warning: conflicting types for built-in function 'strrchr'
../include/string.h:401: warning: conflicting types for built-in function 'memset'
exec.c: In function `copy_strings':
exec.c:140: warning: use of cast expressions as lvalues is deprecated
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o pipe.o pipe.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o namei.o namei.c
In file included from namei.c:15:
../include/string.h:129: warning: conflicting types for built-in function 'strchr'
../include/string.h:146: warning: conflicting types for built-in function 'strrchr'
../include/string.h:401: warning: conflicting types for built-in function 'memset'
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o bitmap.o bitmap.c
In file included from bitmap.c:8:
../include/string.h:129: warning: conflicting types for built-in function 'strchr'
../include/string.h:146: warning: conflicting types for built-in function 'strrchr'
../include/string.h:401: warning: conflicting types for built-in function 'memset'
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o fcntl.o fcntl.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o ioctl.o ioctl.c
gcc-3.4 -march=i386 -m32 -g -Wall -fstrength-reduce -fomit-frame-pointer -nostdinc -I../include \
-c -o truncate.o truncate.c
ld -m elf_i386 -r -o fs.o open.o read_write.o inode.o file_table.o buffer.o super.o block_dev.o char_dev.o file_dev.o stat.o exec.o pipe.o namei.o bitmap.o fcntl.o ioctl.o truncate.o
make[1]: Leaving directory `/home/shupan/oslab/linux-0.11/fs'
(cd kernel/blk_drv; make)
make[1]: Entering directory `/home/shupan/oslab/linux-0.11/kernel/blk_drv'
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../../include \
-c -o ll_rw_blk.o ll_rw_blk.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../../include \
-c -o floppy.o floppy.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../../include \
-c -o hd.o hd.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../../include \
-c -o ramdisk.o ramdisk.c
In file included from ramdisk.c:7:
../../include/string.h:129: warning: conflicting types for built-in function 'strchr'
../../include/string.h:146: warning: conflicting types for built-in function 'strrchr'
../../include/string.h:401: warning: conflicting types for built-in function 'memset'
ar rcs blk_drv.a ll_rw_blk.o floppy.o hd.o ramdisk.o
sync
make[1]: Leaving directory `/home/shupan/oslab/linux-0.11/kernel/blk_drv'
(cd kernel/chr_drv; make)
make[1]: Entering directory `/home/shupan/oslab/linux-0.11/kernel/chr_drv'
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../../include \
-c -o tty_io.o tty_io.c
tty_io.c: In function `copy_to_cooked':
tty_io.c:160: warning: subscript has type `char'
tty_io.c: In function `tty_write':
tty_io.c:316: warning: subscript has type `char'
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../../include \
-c -o console.o console.c
gcc-3.4 -m32 -g -E -nostdinc -I../../include -traditional keyboard.S -o keyboard.s
as --32 -o keyboard.o keyboard.s
keyboard.S: Assembler messages:
keyboard.S:53: Warning: indirect call without `*'
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../../include \
-c -o serial.o serial.c
as --32 -o rs_io.o rs_io.s
rs_io.s: Assembler messages:
rs_io.s:65: Warning: indirect call without `*'
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../../include \
-c -o tty_ioctl.o tty_ioctl.c
ar rcs chr_drv.a tty_io.o console.o keyboard.o serial.o rs_io.o tty_ioctl.o
sync
make[1]: Leaving directory `/home/shupan/oslab/linux-0.11/kernel/chr_drv'
(cd kernel/math; make)
make[1]: Entering directory `/home/shupan/oslab/linux-0.11/kernel/math'
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../../include \
-c -o math_emulate.o math_emulate.c
ar rcs math.a math_emulate.o
sync
make[1]: Leaving directory `/home/shupan/oslab/linux-0.11/kernel/math'
(cd lib; make)
make[1]: Entering directory `/home/shupan/oslab/linux-0.11/lib'
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o ctype.o ctype.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o _exit.o _exit.c
_exit.c: In function `_exit':
_exit.c:13: warning: `noreturn' function does return
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o open.o open.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o close.o close.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o errno.o errno.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o write.o write.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o dup.o dup.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o setsid.o setsid.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o execve.o execve.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o wait.o wait.c
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o string.o string.c
In file included from string.c:14:
../include/string.h:129: warning: conflicting types for built-in function 'strchr'
../include/string.h:146: warning: conflicting types for built-in function 'strrchr'
../include/string.h:401: warning: conflicting types for built-in function 'memset'
../include/string.h:39: warning: 'strncpy' defined but not used
../include/string.h:69: warning: 'strncat' defined but not used
../include/string.h:108: warning: 'strncmp' defined but not used
../include/string.h:129: warning: 'strchr' defined but not used
../include/string.h:146: warning: 'strrchr' defined but not used
../include/string.h:369: warning: 'memcmp' defined but not used
../include/string.h:401: warning: 'memset' defined but not used
gcc-3.4 -march=i386 -m32 -g -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include \
-c -o malloc.o malloc.c
malloc.c: In function `malloc':
malloc.c:156: warning: use of cast expressions as lvalues is deprecated
ar rcs lib.a ctype.o _exit.o open.o close.o errno.o write.o dup.o setsid.o execve.o wait.o string.o malloc.o
sync
make[1]: Leaving directory `/home/shupan/oslab/linux-0.11/lib'
ld -m elf_i386 -Ttext 0 -e startup_32 boot/head.o init/main.o \
kernel/kernel.o mm/mm.o fs/fs.o \
kernel/blk_drv/blk_drv.a kernel/chr_drv/chr_drv.a \
kernel/math/math.a \
lib/lib.a \
-o tools/system
nm tools/system | grep -v '\(compiled\)\|\(\.o$\)\|\( [aU] \)\|\(\.\.ng$\)\|\(LASH[RL]DI\)'| sort > System.map
gcc -m32 -g -Wall -O2 -fomit-frame-pointer  \
-o tools/build tools/build.c
cp -f tools/system system.tmp
strip system.tmp
objcopy -O binary -R .note -R .comment system.tmp tools/kernel
tools/build boot/bootsect boot/setup tools/kernel  > Image
Root device is (3, 1)
Boot sector 512 bytes.
Setup is 312 bytes.
System is 121505 bytes.
rm system.tmp
rm tools/kernel -f
sync

生成Image文件悄谐,總共122K。


image.png

bochs安裝

環(huán)境配置

export OSLAB_PATH=/home/shupan/oslab

執(zhí)行run

./oslab/run

需要在有界面的環(huán)境中库北,遠程連接或者無界面的環(huán)境展示不正常爬舰。

image.png

大功告成,linux 0.11已成功在bochs上跑起來寒瓦!
萬里長征邁開第一步情屹,可以開始linux源碼的學習、修改杂腰、調(diào)試和編譯了垃你。

各平臺遇到的問題

CentOS

1、沒有as86 ld86工具
2喂很、gcc 3.4 HIT工具包中無法執(zhí)行

MAC

./run 無法執(zhí)行

核心步驟

安裝as86 ld86
安裝gcc-3.4
安裝bochs依賴環(huán)境

參考資料

資料包下載地址
https://github.com/hoverwinter/HIT-OSLab

實驗資料地址
https://hoverwinter.gitbooks.io/hit-oslab-manual/content/environment.html

按照環(huán)境
https://github.com/Wangzhike/HIT-Linux-0.11/blob/master/0-prepEnv/%E5%87%86%E5%A4%87%E5%AE%89%E8%A3%85%E7%8E%AF%E5%A2%83.md

PHPer入門Linux Kernel
http://heguangyu5.github.io/my-linux/html/

編譯4步驟
https://www.calleerlandsson.com/the-four-stages-of-compiling-a-c-program/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惜颇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子少辣,更是在濱河造成了極大的恐慌凌摄,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毒坛,死亡現(xiàn)場離奇詭異望伦,居然都是意外死亡林说,警方通過查閱死者的電腦和手機煎殷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腿箩,“玉大人豪直,你說我怎么就攤上這事≈橐疲” “怎么了弓乙?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵末融,是天一觀的道長。 經(jīng)常有香客問我暇韧,道長勾习,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任懈玻,我火速辦了婚禮巧婶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涂乌。我一直安慰自己艺栈,他們只是感情好,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布湾盒。 她就那樣靜靜地躺著湿右,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罚勾。 梳的紋絲不亂的頭發(fā)上毅人,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音尖殃,去河邊找鬼堰塌。 笑死,一個胖子當著我的面吹牛分衫,可吹牛的內(nèi)容都是我干的场刑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蚪战,長吁一口氣:“原來是場噩夢啊……” “哼牵现!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邀桑,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞎疼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后壁畸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贼急,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年捏萍,在試婚紗的時候發(fā)現(xiàn)自己被綠了太抓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡令杈,死狀恐怖走敌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逗噩,我是刑警寧澤掉丽,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布跌榔,位于F島的核電站,受9級特大地震影響捶障,放射性物質(zhì)發(fā)生泄漏僧须。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一项炼、第九天 我趴在偏房一處隱蔽的房頂上張望皆辽。 院中可真熱鬧,春花似錦芥挣、人聲如沸驱闷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽空另。三九已至,卻和暖如春蹋砚,著一層夾襖步出監(jiān)牢的瞬間扼菠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工坝咐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留循榆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓墨坚,卻偏偏與公主長得像秧饮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泽篮,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355