问题标签 [osdev]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
3292 浏览

operating-system - 使用 nasm 混合 32 位和 16 位代码

这是一个低级系统问题。

我需要混合 32 位和 16 位代码,因为我试图从保护模式返回到实模式。作为一些背景信息,我的代码在 GRUB 启动之后执行此操作,因此我没有任何讨厌的操作系统来告诉我我能做什么和不能做什么。

无论如何,我在我的程序集中使用 [BITS 32] 和 [BITS 16] 来告诉 nasm 它应该使用哪些类型的操作,但是当我测试我的代码使用 bochs 时,看起来对于某些操作 bochs 没有执行的代码我写。看起来汇编程序正在添加额外内容0x660x67's,这让 bochs 感到困惑。

那么,在同一文件中混合 32 位和 16 位代码的情况下,如何让 nasm 成功组装代码?有什么技巧吗?

0 投票
12 回答
5527 浏览

linux - 了解 linux 或 BSD 内核内部的最佳方式是什么?

我想更好地了解操作系统内部。进程管理、内存管理和类似的东西。
我正在考虑通过了解 linux 或 BSD 内核来学习。
哪一个内核更适合学习目的?
最好的起点是什么?
能推荐一些好书吗?

0 投票
28 回答
122873 浏览

operating-system - 操作系统开发入门有哪些资源?

我一直想做的一件事是开发自己的操作系统(不一定像 Linux 或 Windows 那样花哨,但比我已经做过的简单引导加载程序更好)。

我很难找到资源/指南来帮助您完成编写简单的“Hello World”操作系统。

我知道很多人可能会建议我看一下 Linux 或 BSD;但是像这样的系统的代码库(大概)太大了,我不知道从哪里开始。

有什么建议么?

更新:为了让通过谷歌登陆这篇文章的人更容易,这里有一些操作系统开发资源:

其他资源:

我找到了一个名为MikeOS的好资源,“MikeOS 是一个学习工具,用于演示简单操作系统的工作原理。它使用 16 位实模式进行 BIOS 访问,因此不需要复杂的驱动程序”

2008 年 11 月 14 日更新

我在Freebyte's Guide to...Free and non-free Operating Systems中找到了一些资源,这些资源链接到诸如 OSKit 和 ExOS 库之类的工具包。这些似乎对开始操作系统开发非常有用。

2009 年 2 月 23 日更新

Ric Tokyo在这个问题中推荐了 nanoos。Nanoos 是一个用 C++ 编写的操作系统。

2009 年 3 月 9 日更新

Dinah 为有抱负的 OS 开发人员提供了一些有用的 Stack Overflow 讨论:创建自定义操作系统的路障讨论了您在开发 OS 时可能遇到的陷阱,而OS 开发是一个更普遍的讨论。

2009 年 7 月 9 日更新

LB 提供了Pintos Project的链接,这是一个为学生学习操作系统开发而设计的教育操作系统。

2009 年 7 月 27 日更新(依然强劲!)

我偶然发现了来自伯克利的一门在线操作系统课程,其中有 23 节课。

TomOSMikeOS的一个分支,其中包括一个小内存管理器和鼠标支持。作为 MikeOS,它被设计成一个教育项目。它是用 NASM 汇编程序编写的。

2009 年 8 月 4 日更新

我发现幻灯片和其他材料与上面列出的在线伯克利讲座一起使用。

2009 年 8 月 23 日更新

stackoverflow 上所有标记为 osdev 的问题

OS/161是一个用 c 语言编写的、在模拟硬件上运行的学术操作系统。这个操作系统在 Nachos 中是类似的。谢谢小说家!

tangurena 推荐http://en.wikipedia.org/wiki/MicroC/OS-II,一个为嵌入式系统设计的操作系统。还有一本配套书

Anders 建议 Robert Love 的Linux Kernel Development 。这是“广受好评的内部人士对 Linux 内核的看法”。

2009 年 9 月 18 日更新

感谢 Tim S. Van Haren 向我们介绍了Cosmos,这是一个完全用 c# 编写的操作系统。

tgiphil 向我们介绍了托管操作系统联盟 (MOSA) 框架,“一套工具、规范和源代码,用于促进基于通用中间语言的托管操作系统的开发。”

2009 年 9 月 24 日更新

Steve 找到了一些使用 Visual Studio 在 Windows 上进行开发的资源,请查看BrokenThorn 的 VS 2005 指南设置OSDev 的 VS 部分

2012 年 9 月 5 日更新

kerneltrap.org 不再可用。linux 内核 v0.01 可从kernel.org获得

更新于 2012年 12 月 21 日 一个基本的操作系统开发教程,设计为一个学期的项目。它指导您构建具有基本组件的操作系统。对初学者来说非常好的开始。相关论文。谢谢斯鲁扬!

2013 年 11 月 15 日更新

从零开始编写一个简单的操作系统。谢谢詹姆斯摩尔!

2013 年 12 月 8 日更新

如何制作电脑操作系统 谢谢ddtoni!

2014 年 3 月 18 日更新

ToAruOS 一个主要从头开始构建的操作系统,包括 GUI

2016 年 9 月 12 日更新

编写自己的玩具操作系统

2016 年 12 月 10 日更新

编写一个简单的操作系统——从零开始(谢谢@Tyler C)

0 投票
13 回答
9007 浏览

operating-system - 为 x86 架构开发操作系统

我正计划为 x86 架构开发一个操作系统。

  • 我有哪些编程语言选项?
  • 有哪些类型的编译器可用,最好是在 Windows 环境中?
  • 有什么好的资源可以帮助我更多地了解操作系统开发吗?
  • 在虚拟机或物理硬件上测试我的操作系统更好吗?

有什么建议么?

0 投票
7 回答
5493 浏览

operating-system - 除了 malloc/free 程序是否需要操作系统来提供其他任何东西?

我正在为我正在开发的操作系统设计内核(我实际上将其称为“核心”只是为了不同,但它基本相同)。如果我无法启动并运行多任务、内存管理和其他基本功能,那么操作系统本身的细节就无关紧要了,所以我需要先解决这个问题。我有一些关于设计 malloc 例程的问题。

我认为 malloc() 要么是内核本身的一部分(我倾向于这个)要么是程序的一部分,但我将不得不编写自己的 C 标准库的实现方式,所以我开始写一个malloc。在这方面我的问题实际上相当简单,C(或C++)如何管理它的堆?

我在理论课上一直被教导的是,堆是一块不断扩展的内存,从指定的地址开始,并且在很多意义上表现得像一个堆栈。这样,我知道在全局范围内声明的变量在开头,更多的变量在各自的范围内声明时被“推送”到堆上,超出范围的变量只是留在内存空间中,但是该空间被标记为空闲,因此如果需要,堆可以扩展更多。

我需要知道的是,C 究竟如何以这种方式处理动态扩展堆?编译后的 C 程序是否会自己调用 malloc 例程并处理自己的堆,还是需要为它提供自动扩展空间?另外,C 程序如何知道堆的开始位置?

哦,我知道同样的概念也适用于其他语言,但我希望任何示例都使用 C/C++,因为我最熟悉那种语言。我也不想担心堆栈等其他事情,因为我认为我能够自己处理这样的事情。

所以我想我真正的问题是,除了 malloc/free(它自己处理获取和释放页面等)之外,程序是否需要操作系统来提供其他任何东西?

谢谢!

编辑我对 C 如何使用与堆相关的 malloc 比对 malloc 例程本身的实际工作更感兴趣。如果有帮助,我会在 x86 上执行此操作,但 C 是交叉编译器,所以没关系。^_^

进一步编辑:我知道我可能会混淆术语。我被告知“堆”是程序存储诸如全局/局部变量之类的东西的地方。我习惯于在汇编编程中处理“堆栈”,我刚刚意识到我可能是这个意思。我的一些研究表明,“堆”更常用来指代程序为自己分配的总内存,或者操作系统提供的内存页的总数(和顺序)。

那么,考虑到这一点,我该如何处理不断扩大的堆栈?(看来我的 C 理论课有点……有缺陷。)

0 投票
5 回答
7548 浏览

operating-system - 内核开发中使用的堆栈大小

我正在开发一个操作系统,而不是编写内核,我正在设计内核。该操作系统针对 x86 架构,而我的目标是针对现代计算机。所需 RAM 的估计数量为 256Mb 或更多。

使每个线程的堆栈在系统上运行的合适大小是多少?我是否应该尝试以这样一种方式设计系统,即如果达到最大长度,堆栈可以自动扩展?

我想如果我没记错的话,RAM 中的一个页面是 4k 或 4096 字节,这对我来说似乎并不多。我绝对可以看到时间,尤其是在使用大量递归时,我希望一次在 RAM 中拥有超过 1000 个整数。现在,真正的解决方案是让程序通过使用malloc和管理自己的内存资源来做到这一点,但我真的很想知道用户对此的看法。

4k 是否足以容纳现代计算机程序的堆栈?堆栈应该比那个大吗?堆栈是否应该自动扩展以适应任何类型的大小?从实际开发人员的角度和安全的角度来看,我对此都很感兴趣。

4k对于堆栈来说太大了吗?考虑到正常的程序执行,特别是从 C++ 中的类的角度来看,我注意到好的源代码倾向于malloc/new在创建类时提供所需的数据,以最大限度地减少函数调用中抛出的数据。

我什至没有进入的是处理器高速缓存的大小。理想情况下,我认为堆栈将驻留在缓存中以加快速度,我不确定我是否需要实现这一点,或者处理器是否可以为我处理它。我只是打算使用常规无聊的旧 RAM 进行测试。我无法决定。有什么选择?

0 投票
2 回答
2053 浏览

operating-system - 启用 GRUB 自动从内核引导

我正在为操作系统开发内核。为了执行它,我决定使用 GRUB。目前,我有一个附加到 GRUB 的脚本stage1stage2一个 pad 文件和内核本身,这使得它可以启动。唯一的问题是,当我运行它时,你必须让 GRUB 知道内核在哪里以及它有多大,然后手动启动它,如下所示:

KERNELSIZE是以块为单位的内核大小。一开始这很好,但是否可以在二进制文件中获取这些值并让 GRUB 自动引导内核?关于如何做到这一点的任何建议?

0 投票
3 回答
7619 浏览

keyboard - x86 程序集上的保护模式键盘访问

我正在为我正在开发的一个非常基本的内核处理键盘输入,但我完全被卡住了。我似乎无法在网上找到任何可以显示我需要知道的信息的信息。

我的内核现在在保护模式下运行,所以我不能使用实模式键盘例程而不跳转到实模式并返回,这是我试图避免的。我希望能够从保护模式访问我的键盘。有谁知道如何做到这一点?到目前为止,我发现的唯一一件事是它涉及直接使用输入/输出端口与控制器对话,但除此之外,我感到很困惑。当然,这不是经常出现的事情。通常,Assembly 教程假定您在下面运行操作系统。

我对 x86 程序集非常陌生,所以我只是在寻找一些很好的资源来使用受保护模式下的标准硬件。我正在使用 NASM 编译程序集源代码,并将其链接到使用 DJGPP 编译的 C 源代码。有什么建议么?

0 投票
15 回答
30682 浏览

operating-system - 开发操作系统的资源

我打算写一个操作系统,但我对操作系统不太了解。有什么好的资源或书籍可供我学习吗?你有什么建议?

0 投票
2 回答
2843 浏览

memory-management - 操作系统通常如何管理内核内存和页面处理?

我正在研究内核设计,我有一些关于分页的问题。

到目前为止,我的基本想法是:每个程序都有自己的(或者它认为的)4G 内存,减去我为程序可以调用的内核函数保留的部分。因此,操作系统需要找出某种方法来加载程序在运行期间需要使用的内存页面。

现在,假设我们有无限量的内存和处理器时间,我可以加载/分配程序写入或读取的任何页面,因为它使用不存在(或被换出)的页面的页面错误,因此操作系统可以快速分配或交换它们。但在现实世界中,我需要优化这个过程,这样我们就不会有一个程序不断消耗它曾经接触过的所有内存。

所以我想我的问题是,操作系统通常是如何解决这个问题的?我最初的想法是创建一个程序调用来设置/释放页面的函数,然后它可以自行管理内存,但是程序通常会这样做,还是编译器假设它有自由支配权?此外,编译器如何处理需要分配相当大的内存段的情况?我是否需要提供一个尝试按顺序给它 X 页的功能?

这显然不是一个特定于语言的问题,但我偏爱标准 C 并且擅长 C++,所以我希望任何代码示例都在那个或汇编中。(汇编应该不是必需的,我完全打算让它与尽可能多的 C 代码一起工作,并作为最后一步进行优化。)

另一件事也应该更容易回答:通常如何处理程序需要调用的内核函数?是否可以只拥有一个包含程序可以调用的大多数基本功能/进程特定内存的内存区域(我正在考虑虚拟空间的末尾)?我的想法是让内核函数做一些非常花哨的事情并在程序需要做任何重大事情时交换页面(这样程序就无法在自己的空间中看到敏感的内核函数),但我不是真的在这一点上专注于安全。

所以我想我更担心一般的设计理念而不是细节。我想让内核(以某种方式)与 GCC 完全兼容,并且我需要确保它提供了普通程序所需的一切。

感谢您的任何建议。