今天由小编为大家整理发布,本网站分享生活常识、旅游攻略、教育教学、房产楼市等综合信息,希望大家能够喜欢。
以下就是我们要分享的内容:
机器码修改大师破解补丁,机器码修改大师这个很多人还不知道,现在让我们一起来看看吧!
1、其实什么不能调用库,不依赖系统调用,都不是题主关注,题主关注的是二进制格式。
2、题主其实是知道:C代码经过编译和链接两个阶段,就会生成可执行文件,Linux平台是ELF格式可执行文件,而Window下是PE格式。
3、这两种格式有一个特点是有个文件头,需要OS在加载可执行文件时做解析工作,根据格式要求一步步找到代码段,并copy到相应的虚拟地址空间上,再跳到_start地址上执行,最后运行到main函数,才算是真正运行到开发人员编写的代码。
4、如果没有OS支持,ELF/PE格式的二进制文件肯定是无法运行的。
5、而专门在裸机上运行的格式是binary格式(可能这个称呼不标准,欢迎大家指正)。
6、这种格式特点是没有额外的代码杂音,即你写什么样的代码,就生成对应的汇编指令,不增一分也不减一分,没有任何文件头描述,第0节字开始就是指令。
7、下面我们来实验一下裸机运行程序的编译、链接和运行过程。
8、在网上找了个boot例子, 并将它修改成gcc汇编器认识的语法格式。
9、我们这里使用汇编来做例子,为什么使用汇编而不用C,后面有解释链接成binary二进制格式boot.binld -m elf_i386 --oformat binary -N -e _start -Ttext 0x7c00 -o boot.bin boot.o请注意,这里关键一步是ld生成了binary格式(--oformat binary选项指定生成binary格式,当然前面有答主也提到这关键一步,但没有重点强调,我想这是题主最为关心的问题)。
10、值得注意的是,程序的起始地址为0x7C00,是因为X86机器对boot程序的约定,BIOS会将它搬移到0x7C00这个址址并执行,所以要将_start地址设置为0x7C00才能运行。
11、这里生成的boot.bin就是一个标准的引导扇区,可以将它写到floppy的第0号扇区,即可运行。
12、为了方例演示,这里使用 qemu+kvm来展示它的运行过程。
13、执行以下命令:qemu-system-i386 -enable-kvm -fda boot.bin即可看到系统从floppy引导,并将boot.s程序运行成功:在对话窗左上角黑底红字的“hello, OS world!”就是boot.s程序的输出。
14、为什么是汇编,而不是C代码回过头再看这个问题,其实写C代码,也是可以先编译,再链接成binary二进制的。
15、但问题是:C语言编写的代码是以函数为最小单位,每个函数生成的指令都有一个prologue指令给函数建立栈帧。
16、但在裸机环境下,栈空间都还没有开辟,所以无法运行成功。
17、同时,作为整个系统上的第一个软件(主机上的BIOS不算),必须遵守一系列的硬件约定,比如上面的boot.s代码必须搬到0x7C00地址运行,满足这样约定下C语言是很难实现的。
18、所以现代OS的boot和loader都是先运行汇编代码,建立好相应的运行环境之后,才调用C语言编写的代码。
Www.517338.coM麻布岗信息网综合在线信息,汇聚城市生活,美食,购物,旅游,房产,交通,家居,财经,教育,健康,娱乐,历史,汽车,生活消费门户网站
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
工作时间:8:00-18:00
客服电话
13524672021
电子邮件
773537036@qq.com
扫码二维码
获取最新动态