免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2923 | 回复: 15

[C] 这几天研究os内核时遇到一个奇怪的问题 [复制链接]

论坛徽章:
0
发表于 2016-11-27 00:44 |显示全部楼层
asm写的简单os kernel, 把它编译成elf64格式时,能成功加载,也能正常运行,但是跳不出内核地址范围,就是,当call一个存在于内核地方范围之外的代码时将导致死机;而编译成原先的纯二进制格式则没有这个问题。很是奇怪,因为二中格式的代码布局应该是基本一样的。这个可能是什么原因呢?首先可以排除ring0/ring3问题,因为目前只支持ring0

论坛徽章:
0
发表于 2016-11-27 00:48 |显示全部楼层
本帖最后由 stevenyi 于 2016-11-27 00:49 编辑

寄存器状态,可以看出点端倪吗?

elf.png
raw.png

论坛徽章:
3
处女座
日期:2015-03-18 14:35:45羊年新春福章
日期:2015-03-18 14:48:23午马
日期:2015-03-18 14:51:09
发表于 2016-11-28 09:34 |显示全部楼层
call函数的地址 要在GDT和LDT 中

论坛徽章:
3
处女座
日期:2015-03-18 14:35:45羊年新春福章
日期:2015-03-18 14:48:23午马
日期:2015-03-18 14:51:09
发表于 2016-11-28 09:46 |显示全部楼层
直接找到段描述子,查看页目录范围,看看你调用的函数地址是否映射

论坛徽章:
0
发表于 2016-11-28 23:03 |显示全部楼层
本帖最后由 stevenyi 于 2016-11-28 23:06 编辑
mr_sev 发表于 2016-11-28 09:46
直接找到段描述子,查看页目录范围,看看你调用的函数地址是否映射

从boot loader到内核,之间就是一条jmp语句,我在jump之前调用没问题,jmp过去马上调用就不行,难道一条jmp语句能改变内存映射?而且kernel不用elf格式,用汇编直接生成bin格式也没问题,我上面贴图显示二中情况寄存器是一样的


论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2016-11-29 09:59 |显示全部楼层
回复 5# stevenyi

你jmp到内核以外不当机才神了,要用
jmp gdt啦啦啦。此外,ldt必须在gdt中有登录

jmp (jmp gdt)会重新映射内存, 不然如何实现进程分离?



论坛徽章:
3
处女座
日期:2015-03-18 14:35:45羊年新春福章
日期:2015-03-18 14:48:23午马
日期:2015-03-18 14:51:09
发表于 2016-11-29 11:03 |显示全部楼层
你把你要调用函数地址空间添加倒全局描述符表呀

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2016-11-29 11:55 |显示全部楼层
回复 6# folklore

记错了, 是JMP TSS

论坛徽章:
3
处女座
日期:2015-03-18 14:35:45羊年新春福章
日期:2015-03-18 14:48:23午马
日期:2015-03-18 14:51:09
发表于 2016-11-29 15:43 |显示全部楼层
你cs ds的gdt/ldt index 是否存在呢?  

论坛徽章:
0
发表于 2016-12-01 09:41 |显示全部楼层
folklore 发表于 2016-11-29 09:59
回复 5# stevenyi

你jmp到内核以外不当机才神了,要用

目前很简单,没做进程分离,整个系统都运行在内核级,所谓跳到内核外是形象说法,实际上整个内存空间都属于内核。问题是为什么在boot loader里可以call到内核外再返回来,而jmp到os后再call同一个地址就死掉了,这中间就只隔了一个jmp语句

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP