亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 這幾天研究os內(nèi)核時遇到一個奇怪的問題 [打印本頁]

作者: stevenyi    時間: 2016-11-27 00:44
標題: 這幾天研究os內(nèi)核時遇到一個奇怪的問題
asm寫的簡單os kernel, 把它編譯成elf64格式時,能成功加載,也能正常運行,但是跳不出內(nèi)核地址范圍,就是,當call一個存在于內(nèi)核地方范圍之外的代碼時將導(dǎo)致死機;而編譯成原先的純二進制格式則沒有這個問題。很是奇怪,因為二中格式的代碼布局應(yīng)該是基本一樣的。這個可能是什么原因呢?首先可以排除ring0/ring3問題,因為目前只支持ring0

作者: stevenyi    時間: 2016-11-27 00:48
本帖最后由 stevenyi 于 2016-11-27 00:49 編輯

寄存器狀態(tài),可以看出點端倪嗎?

elf.png (4.83 KB, 下載次數(shù): 48)

elf.png

raw.png (5.36 KB, 下載次數(shù): 38)

raw.png

作者: mr_sev    時間: 2016-11-28 09:34
call函數(shù)的地址 要在GDT和LDT 中
作者: mr_sev    時間: 2016-11-28 09:46
直接找到段描述子,查看頁目錄范圍,看看你調(diào)用的函數(shù)地址是否映射
作者: stevenyi    時間: 2016-11-28 23:03
本帖最后由 stevenyi 于 2016-11-28 23:06 編輯
mr_sev 發(fā)表于 2016-11-28 09:46
直接找到段描述子,查看頁目錄范圍,看看你調(diào)用的函數(shù)地址是否映射

從boot loader到內(nèi)核,之間就是一條jmp語句,我在jump之前調(diào)用沒問題,jmp過去馬上調(diào)用就不行,難道一條jmp語句能改變內(nèi)存映射?而且kernel不用elf格式,用匯編直接生成bin格式也沒問題,我上面貼圖顯示二中情況寄存器是一樣的



作者: folklore    時間: 2016-11-29 09:59
回復(fù) 5# stevenyi

你jmp到內(nèi)核以外不當機才神了,要用
jmp gdt啦啦啦。此外,ldt必須在gdt中有登錄

jmp (jmp gdt)會重新映射內(nèi)存, 不然如何實現(xiàn)進程分離?




作者: mr_sev    時間: 2016-11-29 11:03
你把你要調(diào)用函數(shù)地址空間添加倒全局描述符表呀
作者: folklore    時間: 2016-11-29 11:55
回復(fù) 6# folklore

記錯了, 是JMP TSS
作者: mr_sev    時間: 2016-11-29 15:43
你cs ds的gdt/ldt index 是否存在呢?  
作者: stevenyi    時間: 2016-12-01 09:41
folklore 發(fā)表于 2016-11-29 09:59
回復(fù) 5# stevenyi

你jmp到內(nèi)核以外不當機才神了,要用

目前很簡單,沒做進程分離,整個系統(tǒng)都運行在內(nèi)核級,所謂跳到內(nèi)核外是形象說法,實際上整個內(nèi)存空間都屬于內(nèi)核。問題是為什么在boot loader里可以call到內(nèi)核外再返回來,而jmp到os后再call同一個地址就死掉了,這中間就只隔了一個jmp語句


作者: stevenyi    時間: 2016-12-01 09:45
本帖最后由 stevenyi 于 2016-12-01 09:47 編輯

如果說gdt/ldt設(shè)置問題,那為什么編譯成elf有問題而非elf格式就是好的呢?代碼都是相同的,只是在boot loader里把內(nèi)核從elf格式里剝離出來,就這一點點區(qū)別。難道cpu也會識別elf然后區(qū)別對待?另外,gdt的長度為0(見主貼附圖), 不知道這有什么影響?


作者: folklore    時間: 2016-12-01 12:05
回復(fù) 10# stevenyi
你的Bootloader進入OS后, 初始化了內(nèi)存管理部件了么?


作者: stevenyi    時間: 2016-12-01 12:19
folklore 發(fā)表于 2016-12-01 12:05
回復(fù) 10# stevenyi
你的Bootloader進入OS后, 初始化了內(nèi)存管理部件了么?

boot load就已經(jīng)進入64位模式了,所以肯定做過初始化


作者: folklore    時間: 2016-12-01 12:23
回復(fù) 11# stevenyi

不能編譯成ELF, ELF要進行地址重定位, 你必須自已寫個LDScript生成有絕對地址的代碼。

作者: sditmaner    時間: 2016-12-01 12:51
回復(fù) 5# stevenyi
作者: stevenyi    時間: 2016-12-01 13:30
本帖最后由 stevenyi 于 2016-12-01 13:34 編輯

回復(fù) 14# folklore

如果不運行App(就是call一個特定地址,比如4M), 內(nèi)核本身能跑起來, 跟之前沒編譯成elf時沒什么不同,顯然重定位這類的問題都解決了





歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2