miniOS_V2.0更新

本文介绍了miniOS V2.0的更新内容,包括支持64个任务运行,内存管理优化,异常处理增强,添加了栈信息打印和内存数据打印等功能。作者强调了操作系统学习对理解计算机系统的重要性,并分享了miniOS的设计理念和改进细节,旨在帮助读者更好地理解和实践嵌入式底层软件开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面的:

    本人所著《深入浅出嵌入式底层软件开发》书中裸机部分实验为一个小型的多任务操作系统,由底层到上层应用程序全部知识面均涉及到,不过,当时由于交稿所催,很草率的实现了其功能,最近一直也在忙于其它不相关事情,所以没有将其完善。这几天,给几个大学里的学生做实训,拿出来了这个做Topic,用了两天时间接合书籍技术讨论群里对该OS代码的建议做了下功能的改善和更新,希望读者们或意图从事ARM相关嵌入式开发的朋友们能继续多多关注与支持,谢谢~

本实验的意义:

    学过Linux的朋友们应该都知道Linux的发展史,Linux操作系统是Linus本人借鉴了Andrew S. Tanenbaum所写的MINIX操作系统,然后加入了具有前瞻性的开源思想,借助于网络的兴起而著名的网络操作系统。

其背景如下:

  当时欧洲和美国大学计算机课程中,关于操作系统的课程是一门全新的课程,而操作系统在当时数量很少,只有在大学里开源的Unix比较普及,而Unix操作系统是一个大工程学科,不太适合于教学,因此,两会会员Andrew S. Tanenbaum自己写了一个小型的MINIX操作系统,用于其就职的大学里教学,虽然是Andrew 这哥们很出名,但是它也可能是年纪大了,仅将其用于教学中,没有将其商业应用和推广。而这时大学生Linus在看了MINIX全部源码后,感觉很多地方需要进行改进,于是,自己根据MINIX,写下了Linux操作系统,当然后面的事情就不在多说了。

  通过上面的背景,我想表达的:

  1.   欧美等发达国家,技术的研究是跑在企业前面的,而大学和研究机构是最新技术的倡导和规划者,指导着新技术的发展方向。

反观国内,由于本人一边从事IT行业,一边从事教育工作,所以,对国内大学还是比较了解的。Android系统从2008年上市到现在已经过去了快4年了,去年年底即2010年,国内的大学里才开始打算开这门课,申请新专业要一年时间,从新生招生到大四毕业要4年,也就是说,最早一批Android专业学生毕业应该是在2015年,而当前Android应用开发人员,市场上几近饱和(指应用层),国内的教育是走在企业的后面的,这种机构出来的学生,能跟上企业的需要吗???

       2.   欧美等发达国家,大学里学习C语言,学习操作系统是用的Linux或Unix。

反观国内,清一色的选用Windows平台,我不是说Windows平台不好,而是整个中华人民共和国被Microsoft养懒了,做软件,拖拖拽拽,不知道数据结构的应用场合?不了解应用程序的工作机制?不知道编译是怎么回事?更不知道文件系统和内核有什么关系?

我们大学里开了很多计算机课程,大学毕业了,第一感觉是,大学里学的东西太多,根本就联系不起来?这其实就是教育方式的问题,我不敢说,我的这种说法是对的,但是,经过实验证明,我的做法让很多朋友更加明确了:计算机系统是什么?大学里的操作系统和大学里的数据结构及计算机组成原理和上层语言有什么关系。

      我不敢说这个实验能让多少人会喜欢上计算机、更了解计算机、能成为计算机编程高手和老鸟,但是我可以告诉你一些你看书学不到的东西。

 

miniOS V2.0

版本改进:

   2010.05:  为了将《深入浅出嵌入式底层软件开发》这本书里前面的裸机驱动部分全部串起来,借鉴Linux操作系统和网上前辈们的总结,写了一个小型多任务操作系统,主要有以下功能和特点:

  • 支持62个任务同时运行(包含内核任务)
  • 开启了MMU内存管理
  • SDRAM,LED,KEY,watch dog,时钟,UART串口,中断,定时器等嵌入式入门常用案例
  • 将大学里操作系统的理论知识:任务调度,进程管理,进程切换等完全用代码实现
  • 将ARM中的所有异常全部进行了处理
  • 使用了SWI指令,更深入理解System Call系统调用的实现及与应用程序的意义
  • 通过简单的内存管理方式,实现对多任务支持
  • 通过自己编写的简单应用程序,让你了解,谁调用了main函数,main函数的参数与main函数的返回处理
  • 通过ADS环境进行编译(很多人不太理解为什么使用ADS,我承认ADS编译器太老了,但是,对于入门的朋友来说,调试更便宜,方便)

  2012.03.08:

  • 支持64个任务同时运行(包含内核任务)
  • 优化了内存页表映射关系(相对V1.0)
  • 应QQ技术群里读者建议,增加了异常时打印栈信息(stack_dump),内存数据打印(mem_dump)等调试功能
  • 增加了蜂鸣器驱动(这个没有什么值得作为更新的)
  • 更改了目录结构(重新整理了目录结构,不在是全部放在工程目录里)
  • 调度器做了一点简单优化(内核空闲进程不会与用户进程抢占CPU)
  • 增加了s3c2440_h.S汇编头文件,减少大量变量的重复定义,使代码更容易阅读
  • MMU初始化移到了start.S中,内存页表分前后二次初始化,保证虚拟地址正常映射(后面有详细解释)
  • 代码的运行地址从0x33ff0000换到了0x800f0000

 

miniOS V2.0内存分布图:

看过V1.0代码的朋友会记得:原先的物理内存地址有2M空间是未使用的,在这次的版本上,物理内存空间全部用上了。

Linux内核中内核地址空间分为:

  • 直接内存映射区(Direct Memory Region)即:低端物理内存
  • 动态内存映射区(VMalloc Region)即:高端物理内存
  • 其它映射区

miniOS的0x80000000~0x84000000相当于直接内存映射区,可以通过线性减一个偏移地址来管理物理内存0x30000000~0x34000000

同样外设寄存器空间0x48000000~0x60000000也是直接内存映射区,可以直接来访问。

Norflash的2MB空间被映射到了更高的地址处:0xC0000000~0xC0200000

 

07-04
minios目前已经完成的功能:<br>bootsector<br>进入保护模式<br>内存分配模块<br>简单的线程调度模块<br>信号量<br>时钟<br>统一的设备驱动模型<br>标准输入输出设备驱动<br>内存及字符串相关的标准C库函数<br><br><br>附件codes.zip的目录结构如下:<br>codes<br>|-relocate 连接程序的源代码,将bootsector和minios连接成一个可启动的磁盘镜像<br>|-bootsector bootsector的源代码<br>|-minios minios的源代码<br>|-bin 所有的目标都在此目录中。其中minios.vhd就是可启动的磁盘镜像<br><br>如何启动minios:<br>你必须安装Microsoft的Virtual PC 2007<br>你可以在微软的官方网站下载他的安装程序,程序大小约30M<br>http://download.microsoft.com/download/8/5/6/856bfc39-fa48-4315-a2b3-e6697a54ca88/32%20BIT/setup.exe<br>安装完成后就可以双击codes/bin/vm.vmc运行minios了<br><br>如何编译minios:<br>编译minios共需要三种编译器。<br>codes/bootsector/bootsector.asm必须用nasm进行编译,将编译的结果命名为bootsector并且拷贝到codes/bin<br>codes/minios/platform/platform.asm必须用masm32进行编译,编译的结果在codes/minios/platform/platform.obj<br>其余的代码都用vc6编译即可,vc6的工程在codes/minios/minios.dsw<br>如果你手边没有nasm和masm32,不要紧,因为这两个文件一般不需要改动,直接用我编译好的目标文件就可以了<br><br>双击minios.dsw打开vc6,点击菜单Project->Project Setting->Debug,修改Executable for debug session一栏<br>将Virtual PC.exe的完整路径填入。如果你安装在默认的路径下,就不需要修改它。<br>然后直接Ctrl-F5运行就可以编译并且运行了。<br>
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值