一步一步实现一个简单的OS(加载内核)
来源:互联网 发布:淘宝有名的好的饰品店 编辑:程序博客网 时间:2024/05/16 11:17
这一块更新的代码比较多,所以就不方便全部贴出来了。。。具体的代码大家直接到群里面找就可以了(OS0.3)
另外,我配置了bochs虚拟机,这样大家载下来就可以使用bochs虚拟机直接调试了。
下面我就直接贴一下主要的代码吧,,,,,,
setupasm.S ( 这里,跳转到c函数直接call就可以了)
start32: # 初始化保护模式下的各个段的段寄存器 movw $PROT_MODE_DSEG, %ax movw %ax, %ds movw %ax, %es movw %ax, %fs movw %ax, %gs movw %ax, %ss movl $start, %esp # 之前的代码没用了,让堆栈覆盖了吧 # 这里跳转到C语言编写的程序中 call setupmain # 好了,到这里死循环吧,下节,弄C语言的,这样看起来就简单多了 # 其实,我觉得,还是这个简单1: hlt jmp 1b
setupmain.c (这里就直接贴重定向ELF文件的代码,之前是想用PE格式的了,然后看了下,PE的重定向篇幅比较大,所以就直接用ELF的了。)
// 初始化内核加载地址 elf = (struct elfhdr*)0x10000; // 载入内核 readseg((uint)elf, SECTSIZE*8, KERNEL_DISK_OFFSET); // 判断内核是否为ELF文件格式 if(elf->magic != ELF_MAGIC) goto bad; // 对ELF文件重定向 ph = (struct proghdr*)((uchar*)elf + elf->phoff); eph = ph + elf->phnum; for(; ph < eph; ph++) readseg(ph->va & 0xFFFFFF, ph->memsz, ph->offset + KERNEL_DISK_OFFSET); // 这里是要加入偏移的,用WinHex看ELF头格式,可以具体分析出来 // 获取内核入口点,并跳入内核 entry = (void(*)(void))(elf->entry & 0xFFFFFF); entry(); // 跳入内核入口
main.c (这里,直接就简单的写一下,用来测试setup加载内核是否正确, 实现了printf函数,这样以后写起来就方便多了)
/** * 内核入口 */int kmain(){// 这里,就显示个信息吧,简单些printf("in the kernel code\n");// 其实这里是不可以返回的。// 不过就这样吧,看看返回去有没有错误return 0;}
下面就贴一个运行的截图吧。。。。。。感觉贴张图,看的人就多了,好奇怪
OK, 就这些了,不懂的群里问吧[QQ qun: 545250960]。
0 0
- 一步一步实现一个简单的OS(加载内核)
- 一步一步实现一个简单的OS(HelloWorld)
- 一步一步实现一个简单的OS(简单的让boot加载setup)
- 一步一步实现一个简单的OS(先小装一下)
- 一步一步实现一个简单的OS(环境搭建)
- 一步一步实现一个简单的OS(进入保护模式)
- 一步一步实现一个简单的OS(异常处理)
- 一步一步实现一个简单的OS(时钟中断)
- 一步一步实现一个简单的OS(初始化GDT)
- 一步一步实现一个简单的OS(试验任务切换)
- 一步一步实现一个简单的OS(任务切换)
- 一步一步教你使用CGI实现一个简单的后门
- 一步一步教你使用CGI实现一个简单的后门
- 一个简单的Linux内核模块实现
- 编写一个随内核加载的简单驱动
- 实现一个简单的类加载器
- C# 一步一步完成一个简单的计算器 第二步---实现单目运算
- C# 一步一步完成一个简单的计算器 第三步---实现双目运算
- Synergy 一套键鼠同时控制多台电脑的神器
- Windows下虚拟机安装ubuntu无法使用键盘输入开机密码
- 杜子建:一个以弱势强的存在主义者
- 传统数据库的运行过程
- Eclipse机制以及OSGI的体会
- 一步一步实现一个简单的OS(加载内核)
- java compiler 设置
- 解决安装XMind出现Invalid Configuration Location The configuration area at 'C:\Users\Administrator\Applicat
- Eclipse插件开发系列一:Runtime 内核架构
- 菜鸟眼中的”AppSettings和ConnectionStrings“
- Eclipse插件开发系列二-应用界面(UI)架构
- 在插件中添加DTD 的验证
- 当工程关闭时候如何判断工程类型
- eclipse menubarPath和toolbarPath 总结