如何用c语言编写简单的操作系统?
C语言当然是可以写操作系统的,但是操作系统的编写一般都不仅仅只是用C语言编写的。
写操作系统需要编程语言提供以下几个特征:
1、跨平台,不能是只在某个平台下编译(VB就不行);
2、必须是编译型语言(PHP就不行),或者有一个非常高效的解释器;
3、必须有方便的操作硬件的功能,容易嵌入汇编(Java就不行);
4、兼容性要好,最好不同编译器编译的符号要基本相同,容易链接(C++不行,如果放弃Class的话C++基本可以);
5、编译器本身最好是由该语言自己完成的(大部分语言的编译器都是用C/C++写的);
6、开发者可以很方便的扩展、改造、或者使用第三方的运行库(大部分语言的库都无法修改);
7、开发者众多(小众语言就不行);
8、该语言开发操作系统的资料要足够完善。
所以总结下来,C语言是首选。
怎么编写电脑系统?
1. 建立开发环境
这一步非常的简单。
将masm613和vc15的压缩包分别解压到e:masm615和e:msvc15目录下。你也可以放到其他目录下,根据自己的情况而定,但是下面用到的编译命令需要作相应的修改。也不需要添加或修改任何的环境变量。
2. IBM PC的启动及当时的内存使用情况
这一部分内容已经是老生常谈了,但又不能不说。我们只说从硬盘引导的情况。
当BIOS经过POST(Power On Test Self)后,将硬盘MBR读到内存0x0000:0x7C00的位置,然后从这里开始执行。一般的情况,MBR将选择活动分区进行操作系统的启动。在MBR开始执行时,内存使用的情况如下图所示,地址数据用16进制表示:
这已经是老掉牙的内容了,但是,在20年前却十分流行。如果想更详细的了解这方面的内容,找本讲解DOS的书看看吧。
我们自己的操作系统将被加载到0x1000:0x0100。这不是必需或者必然的,是人为选择的,你也可以将其放在0x4321:1234等其他地方。但是,上图中注明有其他用途的内存区域,应该保留,否则,你会后悔的。
3. 开发操作系统
我们自己的操作系统运行在实模式环境下(如果您不知道什么是实模式,也请看看20年前出版的当时非常流行的书,或者直接请教当时的前辈高手)。即使你的电脑是P4的CPU,刚启动时,也只相当于主频较高的8086而已。但是,没有关系。
首先,使用汇编语言写一个框架,文件名是entry.asm:
;
; entry.asm
; Copyright (C) 2004, Tian XiangYuan
;
.MODEL TINY,C
.386p
option expr32
option casemap:none
cmain PROTO NEAR C
.CODE
ORG 0100h ;偏移地址
_start:
jmp begin
nop
DB 'TianXiangYuan',0 ;the magic of my os
begin:
cli
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0FFFFh
sti
call cmain ;调用C语言写的主函数
mov ax,4c00h ;调用DOS的功能(为了调试),与我们自己的操作系统无关
int 21h
这段代码非常简单,应该没有什么问题。
已经说了,操作系统将从0x1000:0x0100加载,说是无心,实则有意。我们知道,TINY模式的程序,在DOS下运行时,其起始地址就是0x0100,前面的256Byte是参数部分。如果直接将操作系统在系统启动时加载到0x1000:0x0100,调试时非常麻烦。我们将其起始地址设为0x0100,使其可以在DOS下运行(这也是在程序的最后包含int 21h指令的原因),确认正确无误后,再进行下一步的开发。
下面再看C语言的代码,文件名是main.c:
……
static void InitShell()
{
}
void cmain()
{
InitShell();
TermShell();
}
顾名思义,其中实现了一个简单的shell。因为该程序本身是操作系统的一部分,所以,平时经常使用的一些C库函数,在这里就不能使用了。总之,一切都要自己动手实现。幸好,在实模式下,几乎所有的设备的驱动都包含在BIOS中了,我们可以直接使用。否则,连从键盘读一个键值这样的事都需要自己写键盘的驱动程序,实在太难了。也是这个原因,我们自己的操作系统没有将CPU转到保护模式下,有心之人可以试试。
下面的事情几乎都可以使用C语言实现了。
第一,初始化显示模式。系统启动时,显卡已经被初始化成3模式了,就是80X25的彩色模式(除非你的显示器是单色显示器),我们不需要再做什么了。当然,你也可以将显卡设成VGA甚至SVGA模式,只要你的BIOS和显卡支持。
第二,实现一个具有简单交互功能的shell。代码不全,请自己补齐,或参看附件。
/*
*从键盘读一个字符,如果没有输入,则等待;返回值的低字节为asii码,高字节为键盘扫描码
*/
static int getch()
{
int chr=0;
__asm
{
mov ah,00h
int 16h
mov chr,ax
}
return chr;
}
/*
*使用TTY模式向屏幕输出一个字符
*/
static void putch(unsigned char key)
{
__asm
{
mov bh,0
mov al,key
mov ah,0Eh
int 10h
}
}
#define KEY_BACKSPACE 0x08
#define KEY_ENTER 0x0D
#define KEY_NEWLINE 0x0A
#define KEY_ESCAPE 0x1B
static int printk(const char* str,...)
{
…… //给大家一点空间,自己实现吧
}
static void endline()
{
putch(KEY_NEWLINE); //Line Feed (LF)
putch(KEY_ENTER); //Enter (CR)
}
static char msg_prompt[]="CMD:";
static void deal_cmd(char* cmd_line,int cmd_len)
{
…… //也请大家自己实现吧,例如,可以实现help,dir,cls,halt等命令
…… //其实,就是字符串比较的过程
}
static void TermShell()
{
char cmd_line[80]={0,};
int cmd_len=0;
endline();
printk(msg_prompt,sizeof(msg_prompt));
for (;;)
{
cmd_line[cmd_len]=getch();
switch(cmd_line[cmd_len])
{
case KEY_ENTER:
if (cmd_len>1)
deal_cmd(cmd_line,cmd_len);
//break;
case KEY_ESCAPE:
cmd_len=0;
endline();
printk(msg_prompt,sizeof(msg_prompt));
break;
case KEY_BACKSPACE:
if (cmd_len>0)
{
putch(0x08);
putch(' ');
putch(0x08);
cmd_len--;
}
break;
default:
putch(cmd_line[cmd_len]);
cmd_len++;
}
}
}
更复杂、功能更强大的方法请参考BIOS的相关文档。也请大家发挥想象力,不断的扩展功能。说心里话,这个“操作系统”比dos还原始!但毕竟是自己的操作系统。
半个月可以写出一个电脑操作系统吗?
绝大多数人对于半个月写出一个电脑操作系统这件事都是嗤之以鼻,认为这是根本没有可能的一件事情。
因为目前除了Windows、MacOS、Linux外,绝大多数的操作系统都是基于开源操作系统Linux进行二次开发的。二次开发的代码量不会超过操作系统总代码量的1/10,而且会远远小于这个数值,一般不会超过1/100。这里的开发单位包括了大型以及超大型企业、绝大多数的 科技 单位及院校。
但我们可不可以换一种思路想一想:有谁规定只有做到Windows、MacOS、Linux这样的程度才能叫操作系统呢?难道房子的模型就不能称作房子吗?
如今华丽的Windows 10操作系统也是从最初简陋的DOS系统发展而来。不积跬步无以至千里,想要一个普通的程序员在短期的时间内做出一个媲美Windows、MacOS、Linux界别的操作系统根本不可能,那是无数人几代迭代出来的结果,要不然怎么可能还不出现第四大操作系统。
做一个产品级的操作系统(OS)确实不是一己之力能够实现的,也不是一朝一夕就可以完成的。但做一个Toy级的操作系统玩一玩并没有那么困难。这不日本的川合秀实编写了一本《30天自制操作系统》的书,来告诉大家编写一个操作系统并不是一个难于上青天不可挑战的事情,实际上是没有人能将这件事讲述得通俗易懂而已。
这样一个操作系统只有40KB,虽然简陋,但已经是一个真正意义上的操作系统了,实现了图形界面、多任务等等高级功能。假如跟着做一遍,抄抄他的代码,半个月写出一个电脑操作系统也并不是什么难事。如果一开始就想开发出像Windows、MacOS、Linux这样的庞然大物,好比盲人摸象,连个脉络都摸不清楚。但是如果从一个简单的初级的操作系统开始写起,某一天变成一个举世闻名的操作系统也并不是没有可能。
开发一个成熟的商业系统为什么就这么难?拿我们常用的Window10来说,它的代码在2500万~6500万行,合理估计读完需要130年左右。
最初的Windows版本也仅仅是存放在1.4MB的3.5英寸软盘上,而如今的Windows10 安装包就有好几个GB,安装完的系统占用直逼20GB。
造成这样的原因一点也不难理解:假如一个上班族收入提升了10倍,它依然会为钱发愁。随着他收入的增加,消费的等级也会随之提升,消费的等级哪怕仅仅只是提升了一点点,开销就会提高到好几倍。很多年入成百上千万的家庭照样觉得钱不够花,因为他们住着更大的房子、开着更好的车,孩子也受着更好的教育。
假如现在让你用过去的dos系统和老人机,你肯定不愿意。对于电脑而言,哪怕鼠标实现一个简单的特效功能都需要大量的程序代码和数据做支撑,更别提那些办公、 游戏 、制图、3D之类的应用。电脑的硬件性能每年都在跟随着“摩尔定律”呈现指数级别的提升,但很快就会被随着增加的程序代码迅速淹没,这就是著名的“安迪·比尔定律”。
一个操作系统商业化成功的很重要一个原因就是:能否建立完善的生态系统。如果没有人使用,也就基本上没有几个开发人员会基于这个操作系统进行软件开发,如此就会产生恶性循环。微软(Microsoft)的Windows能占据80%以上的桌面操作系统很大一部分原因是基于x86架构的Wintel硬件产商生态链和软件生态系统。
总结写一个成熟的商业操作系统确实是难于上青天,但并不代表第四大操作系统不会诞生。我们需要曲线救操作系统,用自己的兴趣爱好编写一个五脏俱全能运行的操作系统,然后逐渐地去完善它。
光自己瞎琢磨还不够,这个简陋的操作系统极有可能会成为抛砖引玉的这块砖。实际上Linux就是这样成为三大操作系统之一的。众人拾柴火焰高,假如全世界70亿人口中的1亿人参与到这个简陋的操作系统的完善进程中,那么几十年的时间做出一个成熟的商业操作系统也并不是不可能。
以上个人浅见,欢迎批评指正。
怎么可能呢?电脑操作系统是非常庞大而复杂的工程,如果半个月都能写出电脑操作系统的话,那么win系统还能一统天下吗?
熟练的话可以半个月完成一个具备基本功能的操作系统,对于高手来说完成操作系统包含窗口功能、移植网络功能也是可能的,只要一个人。需要基本功比较扎实,我等普通程序员是做不到的,但能达到这水平的程序员即使在国内也有一些。
当然,操作系统有很多分类,侠义上广义上有不同的定义,每个人的理解也不一样。现代大众理解的通用型操作系统半个月基本不可能完成,人多也没用。
很多人觉得国内没有完全自主的操作系统,其实是有的,只是应用生态不行,并不是技术上做不到。高校和科研机构也有很多技术积累,这里还是希望国产系统能发展起来。
我觉得可以,我大学有一个舍友,电脑非常厉害,有一次,我的电脑坏了,让他来帮我看。他来了,三两下就搞好我电脑了,然后无聊,对着我说要玩一下我的电脑,然后就定定坐在那里敲代码,我偷偷看过去,他敲的代码都是0101这种的,反正我也看不懂,就先睡觉了。半夜起床,看到他还在敲,一样是010101这种,我和他说,夜深了早点休息,他不理我,我继续睡。第二天起来,发现他不见了,电脑室关闭的。我开电脑,感觉不对劲,从开机到进入系统,完全和之前不一样!忽然手机有短信发过来,是他的,他说,昨晚我帮你重新写了一个操作系统,你之前的操作系统太low了!
作为一个工作多年的老码农,从专业的角度来分析下这个问题,然后自然会得到答案。
首先要明确一下什么是操作系统,从理论上来讲操作系统就是能驱动计算机运行并管理相关软硬件的一套软件,从实际的角度来讲,比较优秀的操作系统有Unix,Linux,MacOS,Windows以及Andriod等,这些都是一些大型的操作系统,除此之外还有一些嵌入式操作系统,相对来说规模会小一些。
下面让我们分情况讨论。
对于大型专业操作系统,别说半个月就是半年,想写出类似的操作系统都是不可能的事情,原因很简单,这些操作系统太复杂了,光是源代码和文档都是以G计的,这是什么概念?要知道1G大约能保存5亿个汉字的内容,所以,就是光把这些操作系统的源代码读一遍,可能都得数年时间,还不算是否理解,写的话就更不可能。实际上以公开的资料看,Windows系统的开发人员超过数千人,而且平均也要三到五年才能发布一款合格的操作系统。
对于一个简单的非专业操作系统,一般来说复杂度要低一些,开发难度相对较低,但是涉及到的基础技术并不会比专业操作系统少,所以在专业技术足够的情况下,还是有可能开发出来的,记得当年Linus开发出Linux的雏形也就用了几个月时间,不过他也是在一款叫Minix系统的基础上开发的。所以如果有一些现成的系统做参考,在此基础上开发一套新操作系统还是有可能的,不过即使一个优秀的软件工程师也不可能在半月之内开发完成。
对于嵌入式系统,特别是类似单片机等结构简单,硬件单一的系统的来说,开发一套驱动该系统的嵌入式软件还是比较简单的,如果有一些现成的框架做支撑,几个优秀的工程师还是有可能在半个月之内做出来的。
总之,想要在半个月内开发一套专业的操作系统,不管有多少开发人员,基本都是不可能的;而对于一些简单的操作系统,特别是嵌入式系统,短时间内开发出来倒是有可能,至于时间的长短则取决于系统的复杂度以及对各种硬件支持的程度等。但是想半个月开发一套真正的操作系统,我认为是不可能的事!
可用的操作系统半个月的时间足够了,好用么,不可能。
我想题主来问这个问题的目的,要么是感兴趣,一时性起问这么个问题,要么是真想动手写个操作系统。
操作系统核心部分代码其实并不多,重点就是能够提供对硬件请求,这部分代码如果熟练的话半个月搞定并不成问题的。
如果你是入门的话,那估计半个月只能是照着抄一遍吧,不太可能真的理解并灵活运用。
不过万事开头难,开头并坚持才是真正重要的,并不是我能不能超越xxx。
也许想象“要是我能和xxx一样牛就太棒了”会更好些?
看你的操作系统是什么概念,如果是当初Linus写的Linux 0.1那么简单的系统,本个月加加班理论上也可以写出来。但是如果是Windowa这种,也基本上不可能。写这种系统,是一个系统工程。
就现在这个 科技 水平和人类智商,没有一个人能在半个月内写出一个真正的操作系统。
首先,说一下操作系统是什么?操作系统是一管理电脑硬件与软件资源的程序,同时也是计算机系统的内核与基石。
操作系统是一个庞大的管理控制程序,大致包括5个方面的管理功能:进程与处理机管理、作业管理、存储管理、设备管理、文件管理。
操作系统是电脑与用户之前沟通的桥梁,用户的输入的任何命令都需要操作系统进行转化电脑能识别的语言,没有配置操作系统的电脑是无法使用的。
操作系统为所有应用程序提供一个运行的环境,并将应用程序同具体硬件隔着。比如声卡,网卡,键盘,鼠标等等。没有操作系统是无法正常使用这些硬件的。
操作系统还是电脑的一个大管家,管理着计算机的各种资源,应用程序想使用计算机里这些资源,需要先向操作系统申请,由操作系统统一安排和分配,并且使用完后还要将这些资源回收回去,以便其他应用程序使用。这样才能保证计算机系统有条不紊地高效运行。
这个问题可以去问问比尔·盖茨,看他当年写出Basic花了多长时间
可以问Java之父,james gaoslin,看他写出Java花了多长时间
可以去问问Dos之父蒂姆·帕特森,看他写Dos花了多长时间
可以去问问Linus Benedict Torvalds,看他开发Linux花了多长时间
怎么会提出这么无聊的问题?关键我还答了
《自己动手写操作系统》pdf下载在线阅读,求百度网盘云资源
《自己动手写操作系统》(于渊)电子书网盘下载免费在线阅读
资源链接:
链接: https://pan..com/s/1FzjPZMKL5IIX5nIFxOLchg 提取码: 1234
书名:自己动手写操作系统
作者:于渊
豆瓣评分:7.9
出版社:电子工业出版社
出版年份:2005-8
页数:374
内容简介:本书在详细分析操作系统原理的基础上,用丰富的实例代码,一步一步地指导读者用C语言和汇编语言编写出一个具备操作系统基本功能的操作系统框架。本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。全书共分7章。附CD-ROM光盘一张。

写一个操作系统内核有多难?大概的内容,步骤是什么
“一个好一点儿的计算机硕士毕业的学生。写一个操作系统的内核绝对是应该办到而且肯定可以办到的事儿。” ------这句话我们可以理解为”一个好的计算机硕士掌握的理论知识足够他搭建起一个简单的操作系统框架“。
我上操作系统课(大二)的第一天就问我的老师,学完了这门课可以自己实现一个操作系统了吗?老师说:”你可以基本掌握操作系统中要处理的主要问题,但是即使实现最简单的五脏俱全的操作系统还需要掌握很多很多东西,而且前提是你已经有很不错的代码能力。“
回到题目上来,我们要实现一个简单的操作系统,最先需要解决的是哪些问题?这个问题我相信翻开任何一本操作系统书都可以得到答案,一般都是操作系统书的前五,六章内容(第一章基本是操作系统概念及发展历史)。
包括:
进程管理
存储管理
文件系统
输入/输出
这些大部分是讨论理论类的书,比如我们上课用的书是西电汤子瀛老师的《计算机操作系统》,后来自己为了深入学习买了Andrew S. Tanenbaum的《Modern Operating Systems》。
如果想写个操作系统,除了理论知识外,动手之前最好先看看操作系统源代码,Linux的代码都是开源的,可以先学习学习。不过对于我们这种初学者千万不要看最新的Linux内核代码,因为那是很多人的杰作,可能一辈子都看不完。最好先看看国内同济大学赵炯基于0.11的《Linux完全注释》,即使只看懂30%也至会让自己懂很多之前不知道的东西。
理论类的书很少有提到Bootload问题的,就是加电之后从哪里开始执行的部分。仅仅是这个步骤也需要花不少时间去了解CPU知识,汇编语言知识等,相当不容易。不话说回来,这部分如果能处理好之后会发现组成原理,汇编语言,微机原理的知识被自己运用到了,成就感巨大。这部分内容,可以参看MIT的课程6.828 Operating System Engineering的课程,Google一下就能搜到不少大牛关于这门课的博客。如果英语不太好我记得华中科技大学有一个叫32位操作系统实践的课,资料都放到网上了,看起来很不错。
过了这一关,用《深入理解计算机系统》加上《现代操作系统》看一下虚拟存储器的内容,这两本书这部分说得都很棒。虚拟存储器的概念贯穿所有,如果能弄懂,对很多方面都有很大的帮助,不仅仅是操作系统这块。有了虚拟存储器概念之后对于链接,加载等知识理解就会深刻许多。 不过,这部分内容也需要对硬件部分有所了解,又是一坑。
之后回到进程上来之后,终于可以把工作重心从硬件部分转移过来了。但是我们又将面对进程创建,进程调度,进程通信三大问题,既然是简单实现,就先不考虑线程的事。算法书中会给很多,不过这些算法都是有一定的局限性,比如调度算法,对应的调度算法优劣差异很大,至于如何抉择就看个人需求。不过话说回来,操作系统里的”算法“和ACM里的算法在难度上差很多,还是比较容易实现的。
内容太多了,就不完全展开了,后面就看自己“耐力”了,写操作系统是需要坚持很长实践+大量知识积累的。有些问题还涉及到哲学的观点,这里推荐上海交大邹恒明教授的《操作系统之哲学原理》。除了理论方面的书,现在市面上也有直接教如何实现一个操作系统的,比如《Orange'S:一个操作系统的实现》和《30天自制操作系统》(仅有的几本“XX天XX”而不是烂书的书),起步阶段跟着这些书来还是很不错的。
总之,实现最最基本的功能也许可以做到。实现功能强大,鲁棒性强的操作系统极难。
自己可以重装电脑系统吗|怎样自己安装电脑系统
电脑系统非常脆弱,稍微出现问题,都有可能需要重装,重装电脑系统一般需要用到光盘或U盘,电脑系统未损坏时还可以硬盘重装,这时候有用户就问了:自己可以重装电脑系统吗?答案自然是可以的,重装电脑系统并不是难事,我们自己就可以装电脑系统,下面小编就跟大家介绍自己装电脑系统怎么装的方法。
安装须知:
1、硬盘安装仅适用当前有系统且系统可以正常使用的电脑,否则需要光盘或U盘安装
2、如果是ghost系统,通过本文的方法安装,如果是原版系统,通过nt6hdd来硬盘安装
3、如果是预装win8/win10机型,一般是2012年以后买的电脑,不建议直接从硬盘安装系统,要用U盘安装
相关教程:
onekeyghost安装系统步骤
nt6hddinstaller硬盘安装win7系统教程(原版)
u盘装系统如何直接安装win7iso文件
uefiu盘装系统教程
一、操作准备:
1、系统iso文件下载:win7系统硬盘版下载
2、解压工具:WinRAR或好压等等
二、电脑系统自己安装步骤如下
1、将下载完的电脑系统iso文件下载到C盘之外的分区,比如下载到F盘,右键使用WinRAR等工具解压到当前文件夹或指定文件夹,不能解压到C盘和桌面,否则无法安装;
2、弹出对话框,执行电脑系统iso压缩包解压过程,需要等待几分钟;
3、解压之后,我们打开安装目录,找到【安装系统.exe】程序;
4、双击【安装系统.exe】打开这个安装界面,选择【还原系统】,映像文件路径选择gho文件,勾选要安装的位置C盘,如果不是显示C盘,要根据卷标或容量来判断C盘,再勾选【执行完成后重启】,最后点击【执行】;
5、弹出提示框,提示映像文件即将还原到分区C,点击确定继续;
6、这时候电脑会重启,进入到这个界面,默认选择SysCeoRecovery项启动;
7、启动进入这个界面,执行C盘格式化以及系统安装到C盘的部署过程,需要等待3-5分钟;

8、上述执行完成后会自动重启,进入这个界面,执行系统驱动安装和配置过程;
9、安装电脑系统过程5-10分钟,最后启动进入全新系统桌面,这样电脑系统就重装好了。
以上就是自己重装电脑系统的方法,只要肯动手学习,不用找电脑师傅,自己就可以完成电脑系统的安装,有需要的朋友可以学习下。
如何开发操作系统?

汇编和C语言
因为你知道最开始计算机运行在实模式下,整台机器由BIOS控制,所以你的任务主要就是先用汇编写一个loader(对的,就像lilo或者grub一样 ;p),用于从实模式跳到保护模式,然后加载你操作系统的内核,最后把控制权交给操作系统。当然你的loader需要是纯二进制,不能是其他的可执行文件格式例如ELF格式等等。
接下来就是操作系统内核的实现了,这个比较复杂,开始的页式储存等恐怕多半要用汇编完成,其后的多任务,文件系统或者是硬盘驱动就可以用纯C写了,要是你写一个宏内核还比较好实现些,微内核光看逻辑脑袋就大了,比较难实现的就在内核上。
具体的实现我也不明白,现在正在复读呢没空搞这个,曾经只写过一个由实模式跳转到保护模式的汇编程序,扩展了下下改成了500来行操作点显存还出了点问题,你要感兴趣自己动手试试吧,挺有意思的。
至于开发方式当然就是那么开发了,我汇编编译器用的nasm,C编译器用的gcc,其他的用到gdb和objmp等等,当然你也可以自己用自己喜欢的开发环境啦,适合就好。
至于虚拟机我都用qemu的,很多人都喜欢用bochs来运行调试自己写的操作系统,不过我编译bochs的时候不知道怎么少了一些库,于是就用了qemu了,编译大约十几分钟,别忘了./configure --help看看调试选项把它打开,要不然你的虚拟机只能运行不能调试你的操作系统的,调试的感觉和gdb差不多撒。
顺便做个广告,编辑器推荐vim,操作系统推荐使用slackware linux,感觉比fedora或者ubuntu等等发行版给力多了,分区格式推荐reiserfs,秒杀ext* ;p
顺便能不能多加点分呀 :D