Bran的内核开发教程(bkerndev)-01 介绍
介绍
内核开发不是件容易的事,这是对一个程序员编程能力的考验。开发内核其实就是开发一个能够与硬件交互和管理硬件的软件。内核也是一个操作系统的核心,是管理硬件资源的逻辑。
处理器或是CPU是内核需要管理的最重要的系统资源之一。内核对其的管理体现在:给特定操作分配时间,并允许在另一个调度事件发生时中断任务或进程。也就是多任务处理(multitasking)。多任务处理的实现方式有:
- 协作式多任务处理(cooperative multitasking):当程序自身想要放弃处理下一个可执行进程或任务的时间时,将调用“yield”函数主动放弃时间片。
- 抢占式多任务处理(preemptive multitasking):使用系统定时器来中断当前进程切换到新的进程。这种强制切换形式,更好地保证了进程可以得到一段运行时间。
目前有几种调度算法用于寻找下一个要运行的进程,其中最简单的是轮循调度(Round Robin),你只需要在列表中获取下一个进程,然后选择该进程运行。复杂的调度涉及优先级,那些优先级高的任务比优先级低的任务允许分派到更多运行时间。更为复杂的是实时调度(Real-time scheduler),用来保证某个进程至少运行一定数量的定时器时间。实时系统的计算正确性不仅仅取决于计算的逻辑正确性,还却决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效,也可认为没有得到正确的计算结果。
系统的另一个重要的资源显然是内存(Memory)。有时候内存资源甚至比CPU时间资源更加珍贵,因为内存是有限的,而CPU时间确不是。你可以将你的内核设计成内存高效,但会牺牲大量CPU。你也可以设计成CPU高效,使用内存存储缓存和缓冲区来记住常用项而不是查找它们。最好的当然是两者兼顾:争取最佳的内存使用,同时保留CPU时间。
还有一个内核需要管理的资源是硬件资源,包括:
- 终端请求(IRQ):键盘、硬盘等硬件设备发送的特殊信号,用来告诉CPU我已经准备好数据了,你可以执行某个例程来处理它。
- 直接存储器访问(DMA)通道:DMA通道允许设备锁定存储器总线并在需要的时候将数据直接传输到系统存储器中,而不停止处理器的执行。支持DMA的设备可以在不打扰CPU的情况下传输数据,再通过IRQ中断告诉CPU数据传输完完成,很好地提高了系统的性能。声卡和以太卡就是使用这种方式。
- 寻址:比如内存其实是I/O总线端口下的一个地址。设备可以使用I/O端口被配置或读写数据。设备可以使用的I/O端口有很多,通常使用8路或16路I/O。
概述
本教程的旨在向读者展示如何搭建起内核的基础,包括:
- 配置开发环境
- 基础知识:GRUB引导程序设置
- 链接到其他文件并调用main()
- 屏幕输出
- 设置自定义全局描述符表(GDT)
- 设置自定义中断描述符表(IDT)
- 设置中断服务程序(ISR)处理中断和IRQs
- 重映射可编程中断控制器(PIC)到新的IDT条目
- 安装和维护IRQ
- 管理可编程间隔定时器/系统时钟(PIT)
- 管理键盘IRQ和键盘数据
- ... ...其他的你来定!
原文链接:Bran's Kernel Development A tutorial on writing kernels Version 1.0 (Feb 6th, 2005) http://www.osdever.net/bkerndev/Docs/title.htm
本人英语水平一般,专业水平也不高,错误怕会很多,欢迎指正。不接受批评哈,本来就是写给自己看到 :)
Bran的内核开发教程(bkerndev)-01 介绍的更多相关文章
- Bran的内核开发教程(bkerndev)-02 准备工作
准备工作 内核开发是编写代码以及调试各种系统组件的漫长过程.一开始这似乎是一个让人畏惧的任务,但是并不需要大量的工具集来编写自己的内核.这个内核开发教程主要涉及使用GRUB将内核加载到内存中.GR ...
- Bran的内核开发教程(bkerndev)-04 创建main函数和链接C文件
目录 创建main函数和链接C文件 PS: 下面是我自己写的 Win10安装gcc编译器 本节教程对应的Linux下的编译脚本 _main的问题 创建main函数和链接C文件 一般C语言使用mai ...
- Bran的内核开发教程(bkerndev)-07 中断描述符表(IDT)
中断描述符表(IDT) 中断描述符表(IDT)用于告诉处理器调用哪个中断服务程序(ISR)来处理异常或汇编中的"int"指令.每当设备完成请求并需要服务事, 中断请求也会调用I ...
- Bran的内核开发教程(bkerndev)-06 全局描述符表(GDT)
全局描述符表(GDT) 在386平台各种保护措施中最重要的就是全局描述符表(GDT).GDT为内存的某些部分定义了基本的访问权限.我们可以使用GDT中的一个索引来生成段冲突异常, 让内核终止执行异 ...
- Bran的内核开发教程(bkerndev)-03 内核初步
目录 内核初步 内核入口 链接脚本 汇编和链接 PS: 下面是我自己写的 64位Linux下的编译脚本 内核初步 在这节教程, 我们将深入研究一些汇编程序, 学习创建链接脚本的基础知识以及使用它的 ...
- Bran的内核开发教程(bkerndev)-08 中断服务程序(ISR)
中断服务程序(ISR) 中断服务程序(ISR)用于保存当前处理器的状态, 并在调用内核的C级中断处理程序之前正确设置内核模式所需的段寄存器.而工作只需要15到20行汇编代码来处理, 包括调用C中的 ...
- Bran的内核开发教程(bkerndev)-05 打印到屏幕
打印到屏幕 现在, 我们需要尝试打印到屏幕上.为此, 我们需要管理屏幕滚动, 如果能允许使用不同的颜色就更好了.好在VGA视频卡为我们提供了一片内存空间, 允许同时写入属性字节和字符字节对, 可以 ...
- Bran的内核开发指南_中文版
http://www.cnblogs.com/liloke/archive/2011/12/21/2296004.html 最近在看<orange’s>一书,有点想自己写一个轻量级OS的想 ...
- Android开发教程大全介绍
Android是由谷歌在2007年推出的一个开放系统平台,主要针对移动设备市场,目前版本为Android 4.0.Android基于Linux,开发者可以使用Java或C/C++开发Android应用 ...
随机推荐
- Python网络爬虫实战(三)照片定位与B站弹幕
之前两篇已经说完了如何爬取网页以及如何解析其中的数据,那么今天我们就可以开始第一次实战了. 这篇实战包含两个内容. * 利用爬虫调用Api来解析照片的拍摄位置 * 利用爬虫爬取Bilibili视频中的 ...
- zookeeper与kafka集群部署实现
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终, ...
- Android入门学习教程PDF免费下载
场景 CSDN: https://blog.csdn.net/badao_liumang_qizhi 博客园: https://www.cnblogs.com/badaoliumangqizhi/ 哔 ...
- Qt线程实现分析-moveToThread vs 继承
最近抽空研究了下QThread,使用起来方式多种多样,但是在使用的同时,我们也应该去了解Qt的线程它到底是怎么玩儿的. Qt的帮助文档里讲述了2种QThread的使用方式,一种是moveToThrea ...
- 49 (OC)* layoutSubviews和drawRect调用
layoutSubviews: 简单的说就是你如果想调用此方法.不要直接调用,需要调用setNeedsLayout方法来刷新布局! drawRect:刷新布局 一:layoutSubviews在以下 ...
- C#下载http/https的pdf、excel等文件(非在线打开,绕开插件)
非本服务器文件,如PDF,excel等,下载一般是通过href=‘远程文件的http或者https’的方式下载,但是如果浏览器已经有PDF插件了,则用href不是下载,而是在线打开了,影响体验,所以远 ...
- windows下安装vue教程
前言:前段时间学习了下vue,也算是能简单开发了,今天就记录下怎么通过vue-cli来安装vue. 因vue是基于node环境的,如果你还不会安装的话,可以看下我的这个教程:安装node.js和npm ...
- JVM 调优 - jhat
Java命令学习系列(五)——jhat 2016-01-21 分类:Java 阅读(8708) 评论(3) 阿里大牛珍藏架构资料,点击链接免费获取 jhat(Java Heap Analysis To ...
- Python邮件发送功能
import smtplibfrom email.mime.text import MIMEText_user = "1147016115@qq.com"#发件人_pwd = &q ...
- python使用代理ip
python使用代理的方法有两种 1. #先创建代理ip对象 proxy_support = urllib.request.ProxyHandler({'https':'117.64.149.137: ...