模拟Linus Torvalds:从头开始创建自己的操作系统(VII)

欢迎阅读有关的另一篇文章 如何创建我们自己的操作系统 (该系列中的先前文章: 1, 2, 3, 4, 5 y 6)。 自上一篇文章以来已经有很长的时间了,主要是由于我今天所拥有的错误。 我们会看到 如何在x86架构上处理时钟.

以前,我们以通用方式激活了IRQ,但是存在一个小问题,因为我们没有正确激活它们,并且传递了额外的数据。 我们终于解决了 Carlosorta 并且我和我可以继续评论如何继续。

好吧,时钟是一个IRQ,特别是第一个。 要配置它,我们将使用上面定义的函数来一般安装IRQ,即ND_IRQ_InstallHandler。

int ND_TIMER_TICKS = 0; 无效ND ::计时器::相位(int hz){int除数= 1193180 / hz; ND ::端口:: OutputB(0x43,0x36); ND ::端口:: OutputB(0x40,除数&0xFF); ND ::端口:: OutputB(0x40,除数>> 8); } void ND ::计时器::等待(整数刻度){无符号长刻线; eticks = ND_TIMER_TICKS +刻度; while(ND_TIMER_TICKS <eticks){void ND ::计时器::设置(){ND ::屏幕:: SetColor(ND_SIDE_FOREGROUND,ND_COLOR_BLACK); ND ::屏幕:: PutString(“ \ nSetup timer ...”); ND_IRQ_InstallHandler(0,和ND_Timer_Handler); ND ::屏幕:: SetColor(ND_SIDE_FOREGROUND,ND_COLOR_GREEN); ND ::屏幕:: PutString(“ done”); } extern“ C” void ND_Timer_Handler(struct regs * r){ND_TIMER_TICKS ++; if(ND_TIMER_TICKS%18 == 0){// ND ::屏幕:: SetColor(ND_SIDE_FOREGROUND,ND_COLOR_BROWN); // ND ::屏幕:: PutString(“ \ nOne more second”); 我们应该刷新屏幕}}

代码运行如下:初始化系统调用 ND ::计时器::设置,即 ND_IRQ_InstallHandler 在事件发生时在第一个位置IRQ0插入一个回调函数,即 ND_定时器_处理程序 这增加了 。 正如我们将时钟速度设置为18 Hz一样,正如我们稍后将看到的,如果将其除以18并给我们一个整数,那么将过去一秒钟。

功能 ND ::计时器::阶段 它可以帮助我们调整 计时器,该奢侈数字是1.19 MHz,这是一个常见值。 好吧,如果我们想改变速度的话应该调用这个函数 计时器,默认情况下为18,22 Hz,这是某人必须在 IBM 直到今天。

功能 ND ::计时器::等待 这非常简单,只需循环即可 直到 需要继续。

在图像中,我们可以看到,如果取消注释ND_Timer_Handler内部的代码,则会得到以下信息:

NextDivel中的秒数

在下一章中,我们将看到如何阅读键盘输入并做一些 与我们的系统互动。 与往常一样,代码 可用于 GitHub上 在许可下 GNU GPL v2.


14条评论,留下您的评论

发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责数据:MiguelÁngelGatón
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。

  1.   诺亚

    非常有趣的系列教程,就我个人而言,我从头开始并没有看到太多有关从头开始创建Linux发行版的信息,甚至西班牙语和完整的教程也很少见。 我认为您可以从中学到很多东西,只要有时间,我希望能够学习这些教程。
    我要问的是,您不要灰心并完成本教程,因为我发现了很多从未完成的优秀教程。
    问候和感谢:)。

    1.    路人

      它不是linux发行版,而是内核😛。

    2.    设计者

      你错了。 创建linux发行版并不意味着要进行任何编程,例如,从头开始在linux中不编程,而要做的是安装(基于编译)构成发行版的基本软件包。 这是非常不同的。 它正在创建自己的操作系统。 它与linux无关。 这是托弗拉德斯在他的时代受到minix启发而做的,并且托弗拉德斯和安德鲁斯之间进行了热烈的讨论。 单核与微核上的tanenbaum。

      Saludos!

  2.   伊卢基

    谢谢车。 到目前为止,我还没有对您的帖子给予太多关注,但是我处于一个项目中,因此我将对其进行研究。
    问候。

  3.   路人

    值得一提的是可以使用其他语言,例如Objective-C(++),C ++,D或Rust。

    1.    阿德里安·阿罗约街

      这是在C ++中,而不是C中。但是,由于许多C ++运算符都需要库支持(例如new和delete运算符),因此很难看到它们之间的差异。 在Rust中制作一个操作系统将非常有趣。 实际上,Rust上有一个专用于操作系统的IRC通道(irc.mozilla.net上的#rust-osdev)。 编译机器代码的任何人都真的值得,包括Java(如果我们使用GCJ)。

      1.    路人

        是的,的确,Rust对于操作系统是一种非常有趣的语言,因为它不仅比C或C ++更容易学习(它仍会不断进行更改,但更容易),而且更加安全。

  4.   路人

    在70年代,在没有操作系统的情况下直接在硬件上进行编程非常普遍。

  5.   克里斯托弗

    很好...现在我只需要了解:3 ...

  6.   MMM

    你好非常感谢您提供这些文章。 但是,如果我没有编程知识,我认为我不应该这样做,对吗? 我的意思是,如果不是这样的话,那将是“好,现在我应该复制并粘贴什么?”……真可惜,我一直想知道如何编写那么多东西,而我却一无所获,我更像是一头驴子!

    1.    设计者

      不要怪自己,你不是驴。 首先,并不是所有的程序员都知道如何编写内核,这是一个非常简单的任务,而实际上却更大。 例如,在这里,作者创建了用于键盘和屏幕的通用驱动程序,以操纵屏幕阵列,这是今天完全不使用的方法。 如今,Linux中的tty非常非常复杂,并且不依赖于具有屏幕阵列的x86体系结构。 另外,当理想的情况是在汇编器中创建体系结构代码并且C代码可在任何处理器中工作时,C中的许多代码都取决于体系结构。 但是,我并没有贬低作者的意见,因为例如,内核具有当今我们认为在Linux内核中正常的特性,这并不是一件容易的事,并且请放心,一个人绝对不能做到这一点。 对于某些事情,像linux,gcc,glibc等大型项目不是一个人完成的,而是有很多合作者。

      另外,如果您要开始编程,尽管必须小心,但网上有很多指南,请选择合适的指南。 我开始用linux编程,尽管头脑不费力地跳入游泳池(即使用心爱的C语言),但是现在我有了python的一些基本概念(这也是一种很好的语言)。 在第6页上,您会放弃一些C书籍,尽管您会感到头疼,但这些书籍比经验更重要。 它与OSI网络模型一样发生。 对于osc模型的文档,对于新手来说绝对是不可能理解的,但是,如果您找到一个对网络层有很好解释的站点,那么您很快就会获得处理RFC等技术文档的概念。

      简而言之,那里有不错的网站和手册,这是深入了解它并找到好的材料的问题。

      问候

  7.   自由

    您好,在尝试解决“错误:找不到多重引导头”之后。 以及“错误,您需要先加载内核”,因为我在任何地方都找不到第一篇文章的问题的解决方案,就像我一样……这是解决方案,如果它适用于某人……

    我不知道我的错误原因理论是否正确,但是无论如何,问题是,在32位操作系统中编译文件时,它不会产生错误,但是由于我使用的是64位操作系统系统(Gnu / Linux Debian 7),并且在编译和测试时出现“找不到多重引导头”的错误,并且有一个疑问,那么我认为该错误是由于操作系统的环境或体系结构引起的我们在其中编译文件...而我所做的就是编译文件,指定32位环境或体系结构。
    * sudo为-o kernel.o -c kernel.asm -32
    *须藤gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestand
    奇怪的是,我有些怀疑,哈哈哈,那么我们逐步创建的操作系统是针对x86体系结构的,还是我错了……

    PS:有人可以帮助我解决疑问,请原谅一些拼写错误或我的表情不好,但是我并不完美,所以“ Perfection有其代价”……。最重要的是,模仿32位操作系统,神圣的解决方案……。哈哈哈

    1.    马丁·维拉尔巴(Martin Villalba)

      天才 ! 我真的很想做本教程,但一开始我就犯了这个错误哈哈

  8.   奥斯卡

    恭喜,这是一个杰出的贡献。 从现在开始,我与您分享您通过我和其他人所做的良好工作将得到扩展;

    问候