介绍

  内核开发不是件容易的事,这是对一个程序员编程能力的考验。开发内核其实就是开发一个能够与硬件交互和管理硬件的软件。内核也是一个操作系统的核心,是管理硬件资源的逻辑。

  处理器或是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。

概述

  本教程的旨在向读者展示如何搭建起内核的基础,包括:

  1. 配置开发环境
  2. 基础知识:GRUB引导程序设置
  3. 链接到其他文件并调用main()
  4. 屏幕输出
  5. 设置自定义全局描述符表(GDT)
  6. 设置自定义中断描述符表(IDT)
  7. 设置中断服务程序(ISR)处理中断和IRQs
  8. 重映射可编程中断控制器(PIC)到新的IDT条目
  9. 安装和维护IRQ
  10. 管理可编程间隔定时器/系统时钟(PIT)
  11. 管理键盘IRQ和键盘数据
  12. ... ...其他的你来定!

原文链接: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 介绍的更多相关文章

  1. Bran的内核开发教程(bkerndev)-02 准备工作

    准备工作   内核开发是编写代码以及调试各种系统组件的漫长过程.一开始这似乎是一个让人畏惧的任务,但是并不需要大量的工具集来编写自己的内核.这个内核开发教程主要涉及使用GRUB将内核加载到内存中.GR ...

  2. Bran的内核开发教程(bkerndev)-04 创建main函数和链接C文件

    目录 创建main函数和链接C文件 PS: 下面是我自己写的 Win10安装gcc编译器 本节教程对应的Linux下的编译脚本 _main的问题 创建main函数和链接C文件   一般C语言使用mai ...

  3. Bran的内核开发教程(bkerndev)-07 中断描述符表(IDT)

    中断描述符表(IDT)   中断描述符表(IDT)用于告诉处理器调用哪个中断服务程序(ISR)来处理异常或汇编中的"int"指令.每当设备完成请求并需要服务事, 中断请求也会调用I ...

  4. Bran的内核开发教程(bkerndev)-06 全局描述符表(GDT)

    全局描述符表(GDT)   在386平台各种保护措施中最重要的就是全局描述符表(GDT).GDT为内存的某些部分定义了基本的访问权限.我们可以使用GDT中的一个索引来生成段冲突异常, 让内核终止执行异 ...

  5. Bran的内核开发教程(bkerndev)-03 内核初步

    目录 内核初步 内核入口 链接脚本 汇编和链接 PS: 下面是我自己写的 64位Linux下的编译脚本 内核初步   在这节教程, 我们将深入研究一些汇编程序, 学习创建链接脚本的基础知识以及使用它的 ...

  6. Bran的内核开发教程(bkerndev)-08 中断服务程序(ISR)

    中断服务程序(ISR)   中断服务程序(ISR)用于保存当前处理器的状态, 并在调用内核的C级中断处理程序之前正确设置内核模式所需的段寄存器.而工作只需要15到20行汇编代码来处理, 包括调用C中的 ...

  7. Bran的内核开发教程(bkerndev)-05 打印到屏幕

    打印到屏幕   现在, 我们需要尝试打印到屏幕上.为此, 我们需要管理屏幕滚动, 如果能允许使用不同的颜色就更好了.好在VGA视频卡为我们提供了一片内存空间, 允许同时写入属性字节和字符字节对, 可以 ...

  8. Bran的内核开发指南_中文版

    http://www.cnblogs.com/liloke/archive/2011/12/21/2296004.html 最近在看<orange’s>一书,有点想自己写一个轻量级OS的想 ...

  9. Android开发教程大全介绍

    Android是由谷歌在2007年推出的一个开放系统平台,主要针对移动设备市场,目前版本为Android 4.0.Android基于Linux,开发者可以使用Java或C/C++开发Android应用 ...

随机推荐

  1. SpringBoot 2.0 + Nacos + Sentinel 流控规则集中存储

    前言 Sentinel 原生版本的规则管理通过API 将规则推送至客户端并直接更新到内存中,并不能直接用于生产环境.不过官方也提供了一种 Push模式,扩展读数据源ReadableDataSource ...

  2. selenium WebDriver 截取网站的验证码

    在做爬虫项目的时候,有时候会遇到验证码的问题,由于某些网站的验证码是动态生成的,即使是同一个链接,在不同的时间访问可能产生不同的验证码, 一 刚开始的思路就是打开这个验证码的链接,然后通过java代码 ...

  3. Vue最全指令大集合————VUE

    # Vue指令大集合(无slot) #### 包含内容: 1. v-cloak2. v-html3. v-text4. v-bind5. v-show6. v-model7. v-for8. v-if ...

  4. 使用 Envoy 和 AdGuard Home 阻挡烦人的广告

    原文链接:使用 Envoy 和 AdGuard Home 阻挡烦人的广告 通常我们使用网络时,宽带运营商会为我们分配一个 DNS 服务器.这个 DNS 通常是最快的,距离最近的服务器,但会有很多问题, ...

  5. Android四大组件之服务的两种启动方式详解

    Service简单概述 Service(服务):是一个没有用户界面.可以在后台长期运行且可以执行操作的应用组件.服务可由其他应用组件启动(如:Activity.另一个service).此外,组件可以绑 ...

  6. C++类拷贝控制 深拷贝 浅拷贝

    普通类型对象之间的复制很简单,而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量,这篇文章将帮你理清C++类对象的拷贝方式 拷贝构造函数,拷贝赋值运算符 首先我们简单了解下默认的拷贝 ...

  7. jenkins自动化部署项目3 --设置用户

    我直接设置的admin ,jenkins可以新建多个用户,并赋予不同的权限(TODO) 等后续需要严格规范操作人的时候再补充

  8. Android Studio [ListView]

    ListViewActivity.java package com.xdw.a122.listview; import android.app.Activity; import android.os. ...

  9. 两个变量交换数字 不用第三个变量的情况下 int a = 5,b = 6

    今天可是涨见识额 记录一下 第一种方法: a=a+bb=a-ba=a-b 第二种: b= a+(a=b)*0 一句话搞定

  10. Redis数据库之经典考核习题

    Redis数据库之经典考核习题-题目 一.Redis数据库安装 要求每个学生首先对数据库进行安装,并最终能使用客产端进行数据库的登录. 二.数据库启动文件参数调整 假设数据库服务器默认端口6379已经 ...