自己写最简单的操作系统

合集下载

自定义操作系统开发:从零开始

自定义操作系统开发:从零开始

自定义操作系统开发:从零开始在当今科技迅猛发展的时代,操作系统不仅是计算机硬件与软件之间的桥梁,更是支撑现代计算任务不可或缺的核心。

自定义操作系统开发,即从零开始构建一个符合特定需求和功能的操作系统,是一个既充满挑战又极具吸引力的技术领域。

本文将探讨如何从零开始开发自定义操作系统,包括准备工作、关键步骤和注意事项。

首先,开发自定义操作系统需要对操作系统的基本概念有深入的理解。

这包括了解操作系统的核心功能,如进程管理、内存管理、文件系统以及设备驱动等。

此外,掌握汇编语言和C语言是必要的,因为大多数操作系统的底层代码都是用这些语言编写的。

了解硬件架构,尤其是你打算支持的处理器架构,也非常重要。

准备工作完成后,接下来的步骤是规划操作系统的设计。

你需要决定操作系统的类型——是单任务还是多任务,实时还是通用。

设计阶段还应包括确定操作系统的目标平台,比如是嵌入式系统、个人电脑还是服务器。

此外,定义好操作系统的接口和API也是此阶段的关键任务。

开发过程中的一个关键环节是编写内核。

内核是操作系统的核心,负责管理硬件资源和为应用程序提供执行环境。

从零开始编写内核,需要实现处理器调度、中断处理、内存分配和回收等基本功能。

在这一阶段,开发者需要深入了解硬件架构和操作系统原理,确保内核的稳定性和效率。

随着内核的基本功能逐步实现,下一步是开发驱动程序和系统服务。

驱动程序使操作系统能够控制和管理硬件设备,而系统服务则为应用程序提供必要的功能支持。

开发这些组件时,需要考虑系统的可扩展性和可维护性,以便于未来添加新设备或服务。

最后,测试是确保操作系统可靠性的关键步骤。

这包括单元测试、集成测试和系统测试。

每种测试都旨在发现并修复潜在的问题,确保操作系统在不同条件下都能稳定运行。

值得注意的是,开发自定义操作系统是一个复杂且耗时的过程,需要深厚的技术知识和不懈的努力。

然而,这也是一项极具成就感的任务,能够让开发者深入理解计算机系统的工作原理,同时获得创造属于自己的计算环境的满足感。

自己动手写操作系统(一)

自己动手写操作系统(一)

⾃⼰动⼿写操作系统(⼀) 借着本来现在就在上操作系统内核课的机会,在图书馆借了本于渊的《⾃⼰动⼿写操作系统》,准备⾃⼰亲⾃动⼿写⼀下,提⾼⾃⼰对操作系统的理解。

开篇技术博客来记录⼀下⾃⼰的学习历程。

⼩弟第⼀次写博客,有什么不到的地⽅还请⼤家海涵。

⾃⼰选择的平台是Ubuntu14和Bochs。

具体的Bochs的安装教程见/art/201407/446838_all.htm,这⾥就不做具体的介绍。

第⼀个程序当然是hello world这个经典的⼊门程序,不过这次是使⽤汇编语⾔来编写的⼀个bootloader级别的hello world,根据⾃⼰的操作流程,我把⾃⼰⼤体的步骤说⼀下,以便⼤家有⼀个清晰的认识: ⼀、安装bochs。

⼆、进⼊bochs的安装⽬录使⽤“./bximage”命令制作⼀张空的软盘。

三、在⾃⼰的⼯程⽬录下写⾃⼰的源⽂件(boot.asm),并使⽤下⾯命令将源⽂件进⾏编译得到镜像。

nasm boot.asm -o boot.bin 四、将第三部制作的软盘a.img(默认名字)拷贝到当前⼯程⽬录下。

五、写⼊系统镜像。

dd if=你的镜像路径(即编译得到的boot.bin的路径) of=a.img 六、写⾃⼰的配置⽂件(bochsrc)。

七、按照⾃⼰的配置⽂件执⾏bochs。

bochs -f bochsrc 完成之后的⼯程⽬录⾥⾯应该有⼀下的⼏个⽂件: 下⾯是执⾏完第七步的操作之后的界⾯ c 直接按ENTER,会出现下⾯界⾯,⿊乎乎的,什么也没有 但是在终端中输⼊C就会正确的显⽰出我们想要的东西了 下⾯将上述操作中所涉及到的源⽂件代码贴出来,以便⼤家可以⾃⼰轻松的在⾃⼰的机⼦上轻松的演⽰; 下⾯是我的Bochs配置⽂件,bochsrc1 ###############################################################2 # Configuration file for Bochs3 ###############################################################45 # how much memory the emulated machine will have6 megs: 3278 # filename of ROM images9 romimage: file=/usr/share/bochs/BIOS-bochs-latest10 vgaromimage: file=/usr/share/vgabios/vgabios.bin1112 # what disk images will be used13 floppya: 1_44=a.img, status=inserted1415 # choose the boot disk.16 boot: floppy1718 # where do we send log messages?19 # log: bochsout.txt2021 # disable the mouse22 mouse: enabled=02324 # enable key mapping, using US layout as default.25 #keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.mapView Code boot.asm的源码内容org 07c00h ; 告诉编译器程序加载到7c00处mov ax, csmov ds, axmov es, axcall DispStr ; 调⽤显⽰字符串例程jmp $ ; ⽆限循环 $代表当前地址DispStr:mov ax, BootMessagemov bp, ax ; ES:BP = 串地址mov cx, 16 ; CX = 串长度mov ax, 01301h ; AH = 13, AL = 01hmov bx, 000ch ; 页号为0(BH = 0) ⿊底红字(BL = 0Ch,⾼亮)mov dl, 0 ; 将DL中的ASCII码显⽰到屏幕,将'\0'送到DL中,并显⽰int 10h ; 10h 号中断ret ; 返回到调⽤处BootMessage: db "Hello, OS world!"times 510-($-$$) db 0 ; 填充剩下的空间,使⽣成的⼆进制代码恰好为512字节dw 0xaa55 ; 结束标志View Code 这次就到这⾥,主要是介绍⼀下环境以及有⼀个直观的认识。

自己动手精简一个属于自己的win10系统(win7win8都可以)

自己动手精简一个属于自己的win10系统(win7win8都可以)

⾃⼰动⼿精简⼀个属于⾃⼰的win10系统(win7win8都可以)⼀、准备⼯具
1.系统镜像(ISO格式)
2.精简⼯具(已打包好在下⽅链接)
⼆、操作流程
1.准备系统镜像并解压到⾮中⽂⽬录的硬盘上
2.打开精简⼯具点击左上⾓的映像添加我们已经解压好的镜像⽂件夹
3.选择你要精简的系统版本然后点击加载(我这边就⼀个专业版,可以参考下,选择⾃⼰要的版
本)
4.加载好后出现以下界⾯,然后就可以根据需求删除不必要的组件功能之类的
5.像图下这样有默认的但是要改的话,只需双击默认就可以更改了。

PS:⼯具的删除⽅式和⼀般软件不同,勾选表⽰保留,未勾选才是删除。

需要特别注意,如果⽆法更改状态即为系统必备组件,⽆法删除!
6.全部设置完后,点击应⽤,在保存模式这⾥选择你要的版本(多版本情景下),创建ISO打上
钩。

输⼊⽂件名。

然后再输⼊⼀个卷标名。

7.最后⼀步了,确认⽆误后点击左上⾓的开始按钮,跳出提⽰选择是。

(后⾯跳出的提⽰都选
择是)注意:在开始后千万别点取消,不然你前⾯的功夫都⽩忙了,如果真的取消了,需要删
除第⼀步解压的镜像,再重新来过。

8.完成啦,我们来看下精简后的对⽐,明显镜像⼩了(本次实验并没有细化精简所以不是很明
显)这些⼤家参考⼀下就⾏,毕竟是制作⾃⼰专属的,应该由⾃⼰来决定。

自己动手写一个简易操作系统(基于51单片机)

自己动手写一个简易操作系统(基于51单片机)

自己动手写一个简易操作系统(基于51单片机)背景介绍大一学了51单片机,对于单片机的一些常用外设有了一定的了解。

之后,大家都在说当前最流行的单片机是stm32,所以我抽出了暑假的时间的时间学习了stm32单片机,刚开始学的时候真的很痛苦,在坚持了一个星期之后,我慢慢找到了自信,stm32单片机实际上和51是一样的,只是需要配置的寄存器多了一点。

在刚开始学的时候,经常在配置的时候无法配置完全,导致无法得到预期的实验效果,但是实际上,大家没必要过分纠结于配置,完全可以直接参考别人使用该功能的配置方式。

我们应该将心思放在功能的开发上,而不是纠结于前期简单的配置。

在熟悉使用stm32之后,开始接触操作系统ucos,过程中一直觉得自己似懂非懂,所以我在想为什么我自己不利用51写一个简易操作系统,来加深自己的理解。

初期写出的操作系统不用考虑通信等高级功能,只需要写出可以调度多个任务的操作系统即可,下面给大家介绍一下我自己写的操作系统(写的不太好,仅供大家参考)。

系统实现实现简易操作系统,主要需要实现三个函数:1.创建任务函数(将定义的任务的执行入口保存起来,供调度使用)2.任务延时函数(每一个任务执行后,都需要加入延时函数,否则低优先级的任务没有机会执行)3.中断调度函数(提供时间片调度)1 创建任务函数介绍int OSTaskCreate(unsigned int Task, unsigned char* pStack, unsigned char TaskID){unsigned char i = 0, j = 0;*pStack++ = Task & 0xFF; //低八位地址(51单片机入栈向上,出栈向下)*pStack = Task >> 8; //高八位地址os_enter_critical();TaskCB[TaskID].OSTaskStackButtom = (unsigned char)pStack + 13;TaskCB[TaskID].OSWaitTick = 0;TASK_READY(TaskID); //将该优先级的任务在全局变量中标记为就绪os_exit_critical();return 0;}入口参数:unsigned int Task ---- 任务函数的入口地址unsigned char* pStack ---- 任务函数的堆栈,主要用来保存现场参数unsigned char TaskID ----- 任务优先级2 任务延时函数void OSTimeDly(unsigned int time){TaskCB[CurrentTaskID].OSWaitTick = time; //将任务的延时时间赋值给任务控制块task_sw(); //任务调度}static void task_sw(){os_enter_critical();TASK_BLOCK(CurrentTaskID); //将当前任务的就绪状态取消#pragma asm //将现场的关键参数存入堆栈PUSH ACCPUSH BPUSH DPHPUSH DPLPUSH PSWMOV PSW,#00HPUSH AR0PUSH AR1PUSH AR2PUSH AR3PUSH AR4PUSH AR5PUSH AR6PUSH AR7#pragma endasmTaskCB[CurrentTaskID].OSTaskStackButtom = SP ; //将当前任务的堆栈位置保存,用于下次恢复该任务CurrentTaskID = Task_High(); //找出处于就绪态的最高优先级的任务SP = TaskCB[CurrentTaskID].OSTaskStackButtom;#pragma asmPOP AR7POP AR6POP AR5POP AR4POP AR3POP AR2POP AR1POP AR0POP PSWPOP DPLPOP DPHPOP ACC#pragma endasmos_exit_critical(); //离开时会把SP的当前位置的值送入PC指针,所以最高优先级的任务得以运行}3 中断调度函数void TF0_isr() interrupt 1{TH0 = 56320/256;TL0 = 56320%256;TaskCB[CurrentTaskID].OSTaskStackButtom = SP; //被中断的任务的现场已经压入堆栈,所以只需保存SPCurrentTaskID = T ask_Ready_High(); //取出就绪中优先级最高的任务SP = TaskCB[CurrentTaskID].OSTaskStackButtom;#pragma asmPOP AR7POP AR6POP AR5POP AR4POP AR3POP AR2POP AR1POP AR0POP PSWPOP DPLPOP DPHPOP BPOP ACC#pragma endasm}总结:以上三个函数就是一个简易操作系统的关键函数,大家可以自己动手实现一下。

怎样写一个简单的操作系统

怎样写一个简单的操作系统

怎样写一个简单的操作系统写一个简单的操作系统需要涉及到多个层面的知识和技能,包括计算机体系结构、汇编语言、系统编程、驱动程序开发等等。

由于篇幅限制,下面我将以几个主要步骤简要介绍一个简单的操作系统的开发过程。

1.设计操作系统的结构和功能首先,你需要明确你的操作系统要实现的功能和为哪种类型的硬件系统提供服务。

然后,你可以设计出操作系统的基本结构和模块,例如核心内核、文件系统、进程管理和用户界面等。

2.学习汇编语言和体系结构计算机操作系统的底层是依托机器语言编写的,所以你需要了解机器的体系结构并学习汇编语言编程。

汇编语言是一种直接操作硬件的语言,理解它将有助于你编写底层驱动和实现系统调用等操作系统的核心功能。

3.编写启动代码和引导扇区操作系统运行时需要加载到计算机的内存中,所以你需要编写一个引导扇区代码来启动和加载操作系统。

引导扇区是计算机启动时加载的第一个扇区,它的任务是读取操作系统的其他部分并将其加载到内存中。

4.实现内核功能在操作系统的内核中,你需要实现一些核心功能,如中断处理、进程管理、内存管理、文件系统等。

对于每个模块,你需要编写对应的代码,并确保它们能够相互协调工作。

5.开发驱动程序驱动程序是操作系统与硬件之间的桥梁,它们负责管理和控制硬件设备的工作。

你需要了解硬件的特性和接口规范,并编写对应的驱动程序来支持所需硬件设备。

6.编写用户界面和应用程序7.测试和调试在完成操作系统的开发后,你需要对其进行测试和调试,确保系统的稳定性和性能。

你可以编写一些测试用例来验证系统的功能,并对可能出现的错误进行调试和修复。

需要注意的是,编写一个完整和稳定的操作系统是一个庞大的工程,仅用1200字无法详尽地讲述所有的细节。

以上只是一个简要的介绍,如果你对操作系统开发感兴趣,建议你深入学习相关领域的知识,并参考相关书籍和教程进行进一步的学习和实践。

动手编写一个操作系统的内核

动手编写一个操作系统的内核

动手编写一个操作系统的内核引言操作系统是计算机系统中最底层、最核心的软件之一,它负责管理计算机的硬件和软件资源,并提供各种服务和接口供其他应用程序使用。

编写一个操作系统的内核,可以帮助我们深入理解计算机系统的工作原理,并提升我们的系统编程能力。

本文将介绍如何动手编写一个简单的操作系统内核。

准备工作在开始编写内核之前,我们需要确保准备工作完成。

首先,我们需要一台能够安装和运行开发工具的计算机。

其次,我们需要一些开发工具,比如C/C++编译器、汇编器、链接器等。

最后,我们需要一些用于测试和调试的工具,比如模拟器或者虚拟机等。

这里我们推荐使用具备调试功能的模拟器,比如QEMU。

QEMU是一个开源的虚拟机和模拟器,它支持多种处理器架构和操作系统。

通过使用QEMU,我们可以在一个虚拟环境中运行我们的内核,并进行调试。

设计内核的基本架构在开始编写内核之前,我们需要设计内核的基本架构。

一个简单的内核通常由以下几个模块组成:1.引导模块:负责启动内核的加载过程。

2.中断处理模块:负责处理硬件中断。

3.内存管理模块:负责管理计算机的内存资源。

4.进程管理模块:负责管理和调度进程。

5.文件系统模块:负责管理和操作文件。

不同的操作系统内核可能还包括其他模块,比如设备驱动程序模块、网络模块等,这里我们只介绍一个简单的内核架构。

编写引导模块引导模块负责启动内核的加载过程。

在x86架构的计算机上,引导模块通常被存储在计算机的启动扇区或者硬盘主引导记录中。

我们可以使用汇编语言编写引导模块。

以下是一个简单的引导模块示例:section .textglobal _start_start:; 这里编写引导模块的代码逻辑引导模块的具体实现方式和功能取决于操作系统的需求和目标。

编写中断处理模块中断处理模块负责处理硬件中断。

在x86架构的计算机上,中断处理程序通常由汇编语言编写,以便与硬件交互。

以下是一个简单的中断处理程序示例:section .textglobal interrupt_handlerinterrupt_handler:; 这里编写中断处理程序的代码逻辑中断处理程序的具体实现方式和功能取决于操作系统的需求和目标。

如何编写一个简单的操作系统文件系统

如何编写一个简单的操作系统文件系统

如何编写一个简单的操作系统文件系统操作系统文件系统是操作系统管理存储设备上文件和目录的系统。

它的设计和实现对操作系统的性能和功能有着重要的影响。

一个好的文件系统需要具备高效的存储管理、可靠的数据存储和恢复机制、良好的用户接口等特点。

下面通过简单的文件系统设计来介绍文件系统的基本原理和实现步骤。

一、文件系统的基本要求1.存储管理:文件系统需要能够有效地管理存储设备上的存储空间,实现文件的分配和释放。

2.数据存储与恢复:文件系统需要具备数据持久化的能力,能够保证文件在存储设备上安全存储,并能够在系统崩溃时自动恢复数据。

3.文件操作接口:文件系统需要提供用户友好的文件操作接口,如读取、写入、创建、删除、重命名等操作。

二、文件系统设计1.文件控制块(FCB):文件系统中的每个文件都有对应的文件控制块,用来存储文件的基本信息,如文件名、大小、创建时间、修改时间、访问权限等。

2.目录结构:文件系统需要维护一个目录结构,用来记录文件和目录的层次关系。

可以采用树形结构来组织目录,每个目录节点包含文件或子目录的信息。

3.空闲块管理:文件系统需要通过空闲块管理来实现文件存储空间的分配和释放。

可以采用位图或空闲块链表的方式进行管理。

4.存储分配策略:文件系统需要设计合适的存储分配策略,如连续分配、链式分配、索引分配等。

不同的分配策略对文件系统的性能和可靠性有着重要影响。

5.数据恢复机制:文件系统需要设计合适的数据恢复机制来保证文件在系统崩溃时能够正确地恢复数据。

可以采用日志、备份、快照等方式来实现数据恢复。

6.用户接口:文件系统需要提供良好的用户接口,使用户能够方便地进行文件操作。

可以设计命令行或图形界面来实现用户与文件系统的交互。

三、文件系统实现步骤1.设计文件控制块结构:根据文件系统的需求,设计合适的文件控制块结构,包括文件名、文件大小、创建时间、修改时间、访问权限等字段。

2.设计目录结构:根据文件系统的需求,设计合适的目录结构,包括目录名称、父目录、子目录和文件的信息等字段。

自己动手制作操作系统

自己动手制作操作系统

自己动手写操作系统(从引导到启动保护模式)自由软件社区是一个充满自由和梦想的地方,在10余年的时间里它创造了一个又一个奇迹。

然而,这些奇迹的创造者不只是Stallman,也不只是Linus Torvalds,而是活跃在世界各地的不计其数的开发人员。

在使用各种功能强大的自由软件时,我总会对其开发者充满崇敬之情,期盼有朝一日自己也能成为他们中的一员。

很多对自由社区充满向往之情的人,虽然也想努力融身于其中,但又不知该怎么做。

那么,就请与我们一起从编写一个简单的操作系统开始吧!我们要做的事情有人可能担心自己既没有学过计算机原理,也没有学过操作系统原理,更不懂汇编语言,对C语言也一知半解,能写操作系统吗?答案是没问题。

我将带大家一步一步完成自己的操作系统。

当然如果学一学上述内容再好不过。

首先要明确处理器(也就是CPU)控制着计算机。

对PC而言,启动的时候,CPU都处在实模式状态,相当于只是一个Intel 8086处理器。

也就是说,即使你现在拥有一个奔腾处理器,它的功能也只能是8086级别。

从这一点上来讲,可以使用一些软件把处理器转换到著名的保护模式。

只有这样,我们才可以充分利用处理器的强大功能。

编写操作系统开始是对BIOS控制,取出存储在ROM里的程序。

BIOS是用来执行POST(Power On Self Test,自检)的。

自检是检查计算机的完整性(比如外设是否工作正常、键盘是否连接等)。

这一切完成以后,你就会听到PC喇叭发出一声清脆的响声。

如果一切正常,BIOS就会选择一个启动设备,并且读取该设备的第一扇区(即启动扇区),然后控制过程就会转移到指定位置。

启动设备可能是一个软盘、光盘、硬盘,或者其它所选择的设备。

在此我们把软盘作为启动设备。

如果我们已经在软盘的启动扇区里写了一些代码,这时它就被执行。

因此,我们的目的很明确,就是往软盘的启动扇区写一些程序。

首先使用8086汇编来写一个小程序,然后将其拷贝至软盘的启动扇区。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

参看
《自己动手写操作系统》
《30天自制操作系统》
需要的软件
1.虚拟机VM/VirtualBox/bochs
2.映像编辑工具:FloppyWriter,EasyBoot,UltraISO
3.汇编工具:yasm/nasm/masm
基本思路:所谓开发操作系统,就是想办法制作一张“含有操作系统的能够自动启动的存储介质”。

步骤:
1.编写boot.asm汇编源文件
2.通过汇编器得到boot.bin二进制文件
3.通过映像读写工具将二进制文件写入存储介质。

//Boot.asm
org 07c00h
mov ax,cs
mov ds,ax
mov es,ax
call DispStr
jmp $
DispStr:
mov ax,BootMessage
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
ret
BootMessage:db "Hello world!"
times 510-($-$$) db 0
dw 0xaa55
真正开发操作系统
前面说过,所谓开发操作系统,就是想办法制作一张“含有操作系统的能够自动启动的存储介质”。

【至少也是适用于某一介质的映像文件】
并且所有开发工作都是基于另一台已有的计算机。

编写只显示hello world!的操作系统就不再讲了。

接下来写真正的IPL(启动程序装载器)
首先来说一说安装系统和运行系统的区别。

我们是开发操作系统,即没有任何已有的可启动设备,我们现在要写的IPL就是装载真正的操作系统的,虽然它现在存在于软盘中,如何自定义安装路径是以后的问题了
注意我们的IPL和os是处在同一映像文件之中的。

启动的时候,bios读取软盘(操作系统安装介质)的第0扇区到内存并执行,然后通过这一段程序装载真正的os。

完成IPL之后,我们就可以转用C语言开发os了
从实模式到保护模式。

保存bios 的一系列信息到BOOT_INFO
一些前期准备
调色板
字体
鼠标指针
GDT
中断(IDT)
PIC
FIFO缓存区
按键编码
激活鼠标控制
鼠标解读/显示鼠标动作
内存管理
叠加处理
窗口
PIT和定时器
多任务
……
分析
1.安装
设置bios启动顺序,启动安装介质
安装系统
2.运行已安装系统
bios启动到系统分区
IPL把Kenel装入内存
执行init进程
3.功能
键盘和命令行
鼠标和GUI、多任务
文件系统
Api
开发
所谓开发操作系统,就是想办法制作一张“含有操作系统的能够自动启动的存储介质”。

工具
1.一台已安装os的计算机
2.CPU指令参考手册
3.BIOS中断参考手册
4.GNU等系统开发工具
步骤(略去系统安装程序,即直接从介质中运行操作系统)
1.编写IPL
2.用C写系统核心组件
3.编译所有代码
4.打包成映像文件
5.写入映像文件到启动介质。

相关文档
最新文档