热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[BootLoader]系统之最初

一、可参考的网站:(1)绝对经典网站:操作系统资源中心这个网站之好,无法用言语表达OSD之家好好好!OSdev也不错execpc快来看看吧h
一、可参考的网站:
(1)绝对经典网站:
操作系统资源中心
这个网站之好, 无法用言语表达............

OSD之家
好好好!

OS dev
也不错

execpc
快来看看吧......

http://www.xemean.net/
汇编编成的OS:MenuetOS
该网站有很多汇编资料,以及涉及到硬件编程的资料

(2)outportb 那里去找!?推荐网站
pc-hardware
VGADOC
一个vag包
execpc的控制台代码

(3)
openBLT
reactos
brainix team
v2os
Nachos
Thix
hello
aros
kerne link
os file
文件格式大全

(4)关于在实模式下使用bios 输出文本的方法推荐
Ralf Brown著名的中断列表
freshground (old hand) 推荐
bios中断表

二、开始编OS之前,您需要考虑:
1. 为什么写 OS ?
研究: 更高,更强,更好
高可考性, 更高的性能,实时,分布,面向对象,更易移植,挑战商业,挑战自我,新构架.

学习
多任务,内存保护,标注c库,设备驱动,文件系统,应用

兴趣
就是喜欢!


2.设计决策
移植性
受限于intel? 使用x86-only 的特性? 4 个特权级(大多机器有只有2个), 基于段的地址转换和保护 (一般都有paging), TSSes 任务切换(vs. 栈交换).

内核体系
Linux? monolithic kernel? microkernel? exokernel? SASOS? .

多任务
不支持?协作?抢占调度?

线程
无? 内核支持还是进程协作? 如何在同宗线程间协调地址空间?

多处理器
不支持?紧耦合的SMP? 松散的分布式?

多用户和安全

开发工作站
linux?没有SourceInsight!
win? ...........

开发语言
C C++ asm ......

可执行文件格式
还有是否支持动态链接? (就如 ELF 和 PE , 他们简单)

高级语言库
GNU glibc, Cygnus Newlib, homebrew, .........

兼容?

抄袭代码
拿来学习的代码.......

三、最初的版本0.0.1到0.0.5

需要从一个简单的bootsect 开始写我的操作系统吗?
下面的网站给出了一些建议:
千万不要写bootloader. 至少不要把他当作写os的第一件事.
bootloader 不是 OS.
bootloader 仅仅是os的一个非常小的部分.
写一个好些的bootloader 的工作量和写一个小 OS的工作量相当.
写一个 bootloader 需要一些神秘的知识,像什么a20等等.
如果在 DOS 或者 Windows 9x下开发,可以使用 DOS 作为你的boottloader. , 你看 GRUB 怎么样.

但是,为什么不写一个自己的?
既然如此神秘, 既然有巨多的开源bootloader......, 拷贝一些代码修剪一下也挺好

你选择写还是不写? 不惜半年的深夜...写!? bootloader的一些研究
bootloader中0.0.5版有了如下特性:
1.Boot 装载 setup+os 到 0X10000
2.在实模式下跳到 setup, setup 把 os 移动到 0x100000 (1M)
3.然后切换到保护模式,用一句长跳转 jmp dword 8:0x100000
(nasm can mix 16bit and 32bit code)
4.使用了 c++
1).setup.s 预留了2048(0x800)个字节供以后使用
2).setup.s 预留空间, setup 搬移 os 的位置(紧邻setup之后),应该一致.

总结:
系统从 1M 的地方跑起来,总算像个操作系统的 Loader 了!!!!!

第一个版本0.0.1可以说是第一步了, 可能费时也最久.
0.0.1 可以说是最最小的东西了.
相当于一个hello wold!
当初是在win下写的, 但既不知vmWare是何方神圣又不知道partcopy. 只晓得linux下的dd好使, gcc好使. 也真是移到了linux下, 才看到屏幕上的几行简单的信息. 心里的感觉真是无比xx. 那是2002.1.28 深夜23:06.中国年的前夕.

为此, 已经不知多少无眠的夜晚捧着印出来的minix bootsect, linux0.0.1 bootsect 看来看去.... 至今这种印记还在代码中. 从floppy读os的代码我实在没有兴趣, 因此至今还是linux的老样子.

如果没有 make binary use C Compier , 没有nondot, 估计到如今写不可能有0.0.1的诞生.
0.0.1 中的Makefile中, 最最有用的一句:

# 将生成的操作系统文件从 elf 格式转换到 binary 格式
os.bin: os.elf
objcopy -R .comment -R .note -S -O binary os.elf os.bin


就是来自于nondot的那篇文章.

关于这个Makefile 可能还有一句值得一看:

....
OBJS = c.o
.......
os.elf: $(OBJS)
$(LD) $(OBJS) -o os.elf -e c -Ttext 0
# 因为我们的映象是binary格式.
# 所以入口点函数应该是第一个.o文件的第一个函数


有件事情我很抱歉, 0.0.1中没有使用head.s.
只有boot.s 和c.c.

boot.s 把c.c 生成的bin文件os.bin从磁盘上载入内存, 切换到保护模式, 跳到os.bin.
看看makefile中的

# 最终生成文件 bootimg
bootimg:os.bin Boot
cat Boot os.bin>bootimg
# Boot 是引导扇区内容,内核 os.bin 紧跟其后的扇区

应该能够想象整个的流程.

c.c 除了打印了一句信息外好像什么都没有做.
从c.c生成的os.bin是32位的代码, 需要保护模式才能运行. 其中的函数

/*
Text mode kprint
Show 'c' at
line : x (0...24 )
col : y (0...79 )
*/
void kputc(char c,char color,int x,int y)
{
/* p ponitor to Video Memory */
char *p = (char*)0xb8000;

/* calc line pos*/
p += 2*x*80+y*2;

/* show char whith color*/
*p = c;

*(p+1) = color;
}

要想正确工作, os的ds选择子选择的描述符所描述的段之基址必须从0 开始, 可读写, limit 大于video mem上限(0.0.1是8m, 见boot.s).


0.0.1是我的希望之光.
0.0.1 太简单, 不知道他能够做什么工作.
0.0.2 中, 好像只是把c.c 搞来搞去,没有实质性的工作.

0.0.3 中多了两个文件, setup.s, head.s . 这个可以从Makefile中看出来.
关键在于, boot.s中不再切换到保护模式了, 这样的话,我可以在setup.s 中多做一些事情. 因为boot.s 只有512 字节,太少了!
可以看到, 0.0.3 重的setup.s 所作的事情也很简单. 它把os(head.s, c.c)搬到物理地址0. 然后使用临时的gdt切换到保护模式.最后跳到os的head.s.
head.s 重新加载了os自己的gdt, 因为setup.s 不属于操作系统的一部分!
可以看到setup.s 和head.s 的基本功能. 更重要的是基于这样一个设想, 在setup.s中, 未切换到保护模式前, 可以写更多的代码完成更多的功能.甚至我使用16bit 的c编译器, 配合bios, 那就方便的多了. head.s主要是os的一个入口, 单独放到一个文件中使入口管理更方便. 其中的idt,gdt也使os的全局变量更加集中.

考虑到把os放到地址0:0 不合适, 所以0.0.3.5中, os 被移到0x20000, 位于物理内存 128k处.

但是还是觉得不爽, 干脆在0.0.4中, 切换到保护模式后直接把os放到1M的地方. 离开常规内存这个是非之地.

从Makefile 中ld -T 的选项可以清楚的看到这种变化.
中间遇到很多问题, 一些记录了下来,一些却没有.


0.0.5 中我想试一试c++ 好不好玩.
新的简单内核中,比如说bootloader 0.0.5----, 还没有多任务支持, 没有中断机制的支持, 没有应该有的一切.

怎么在这种情况下做一些简单的i/o可能是开发到这个阶段比较关心的问题.
找一些资料, 比如kbd, hd, vga......

0.0.5对vga的支持仅仅是操作默认的framebuffer, 甚至连光标都移动不了.
国外有些好资料, 前面我也推荐了不少网站.

看看这些资料...... 拿来我们先用用!


感谢 execpc.osd 的兄弟们杰出无私的奉献.


0.0.5 以前的版本再linux下编译. 当时对boch vmWare不太了解.
调试及其痛苦. linux下的vim虽然语法加亮,虽然....我却不太会使用.

倒是非常喜欢SourceInsight.
知道windows下的nasm djgpp也是free,但是当时从没有再win下编译出一个bin核.
试图找出一个linux版本,有很好的中文支持, 有一个类似sourceinsight的工具, 我当然不希望用蹩足的英文注释我的代码....
但是始终没有一个中文环境, 使自己满意.
大四时玩turbo 4.1, 只会安装而已,
现在在linux下体验os, 感叹啊.......

还是不断的努力做到在win下开发.......
windows下我很容易找到16bit的C编译器,可以增强loader.

2002.9.16这天, 又找出nasm, vmWare, djgpp.....
没想到, 这么顺利的在vmWare下调出了熟悉的画面.
真是让人兴奋.
上穿的版本中如果make会找不到一个文件 pad .
这个pad什么都不是,仅仅为了在vmWare下调试时把bootimg扩展到1.4M以上, 可以随便找个什么东西代替!


新的特性
见0.0.5.1的readme.txt
5.移植到djgpp 使用windows 下的gcc nasm 编译成功,并且使用vmWare调试.
至此,使用下面的工具: sourceinsight, vmvare, djgpp, nasm. (这是我梦中的环境^_^)
下一步考 虑使用tc 或者其他的编译器制作setup中的16位程序. (使用C 加强setup.s 的功能)



推荐阅读
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Windows 7 部署工具DISM学习(二)添加补丁的步骤详解
    本文详细介绍了在Windows 7系统中使用部署工具DISM添加补丁的步骤。首先需要将光驱中的安装文件复制到指定文件夹,并进行挂载。然后将需要的MSU补丁解压并集成到系统中。文章给出了具体的命令和操作步骤,帮助读者完成补丁的添加过程。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 微软评估和规划(MAP)的工具包介绍及应用实验手册
    本文介绍了微软评估和规划(MAP)的工具包,该工具包是一个无代理工具,旨在简化和精简通过网络范围内的自动发现和评估IT基础设施在多个方案规划进程。工具包支持库存和使用用于SQL Server和Windows Server迁移评估,以及评估服务器的信息最广泛使用微软的技术。此外,工具包还提供了服务器虚拟化方案,以帮助识别未被充分利用的资源和硬件需要成功巩固服务器使用微软的Hyper - V技术规格。 ... [详细]
  • 本文详细介绍了在Centos7上部署安装zabbix5.0的步骤和注意事项,包括准备工作、获取所需的yum源、关闭防火墙和SELINUX等。提供了一步一步的操作指南,帮助读者顺利完成安装过程。 ... [详细]
  • PG12新增的VACUUM命令的SKIP_LOCKED选项
    PG12版本的VACUUM命令新增了SKIP_LOCKED选项,该选项使得vacuum命令在遇到被lock住的table时可以跳过并被视为成功执行。之前的版本中,vacuum命令会一直处于等待状态。本文还提到了PostgreSQL 12.1版本的相关信息。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 在Windows10系统上使用VMware创建CentOS虚拟机的详细步骤教程
    本文详细介绍了在Windows10系统上使用VMware创建CentOS虚拟机的步骤,包括准备条件、安装VMware、下载CentOS ISO文件、创建虚拟机并进行自定义配置、设置虚拟机的ISO与网络、进行安装和配置等。通过本文的指导,读者可以轻松地创建自己的CentOS虚拟机并进行相应的配置和操作。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
author-avatar
姿葱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有