问题标签 [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 投票
2 回答
17596 浏览

x86 - 使用 iret 切换到用户模式

我正在编写一个小型操作系统,它将在用户模式(权限级别 3)下执行一些代码。从该用户级代码中,我想将中断调用回打印消息的操作系统。现在我真的不在乎我的中断处理程序如何接受参数或类似的东西,我真的只是想要一个中断处理程序来通知我(用户)代码已经执行。

我的问题是:如何在用户模式下运行代码?我有一个函数可以设置一个带有代码段和数据段的本地描述符表(都具有用户模式权限)。我不明白我应该如何将这些段加载到csssds. 我成功加载了我的 LDT,但我不知道如何实际使用它。我听说我应该使用iret,但我不明白如何。

我的另一个问题是我的中断处理程序应该如何工作。假设我为向量编号 0x40 安装了一个中断处理程序,我想打印“你好,用户模式!”。我知道如何设置中断处理程序,但我不完全了解从用户模式进入内核中断处理程序时如何切换上下文。我知道cs寄存器必须更改,因为我的例程将从 IDT 条目中指定的代码段运行。我也知道堆栈选择器也可能会发生变化,但我不能确定这一点。

有人可以向我解释一下调用中断门时会发生什么上下文变化吗?

0 投票
3 回答
3495 浏览

security - 更改BIOS代码/刷新BIOS

我花了很多时间开发一个操作系统并研究我的低级引导加载程序。但是现在我想在不离开低级环境并做一些涉及安全的事情的同时,从我的操作系统中抽出一些时间。

所以我选择按照预引导身份验证方案构建自己的标准密码实用程序。由于我希望该软件至少具有一点便携性,因此我希望它尽可能少地使用外部支持。我认为,如果我设法从正在运行的实模式操作系统中的自检和 int 19 引导程序之间的某个地方“挂钩”到 bios,我会是最好的。

然而,事实证明不可能找到有关如何修改 BIOS 代码的信息。我没有发现如何实现前面提到的。我只找到了描述如何刷新你的 BIOS 的页面。

有谁知道我如何读/写bios代码?或者有人可以提供描述这个页面的链接吗?

我知道不仅有可能让我的设备变砖,而且很有可能,我知道风险并愿意承担。

0 投票
2 回答
857 浏览

c++ - 我自己的操作系统内核上的 C++ 中的静态构造函数

我正在尝试用 c++ 编写内核,并且我是操作系统开发的初学者。现在我正在实现cout在显示器上显示,但我遇到了一些问题。我知道我问的问题很愚蠢,但我也是 C++ 的新手。

我写了一个 OStream 类,它调用系统函数write来显示在屏幕上。它的基类是我的 Video 类。此类包含在命名空间 std 中。所以主要问题是,当我创建 OStream 的对象时,它没有调用它的构造函数,因此没有调用其基类的构造函数,因此视频内存没有初始化,因此屏幕上不会显示任何内容。

这是我的代码:

在上面的代码中,我OStream在 OStream.cpp 文件本身中创建了一个类对象。但是,如果我在我的主模块中创建一个对象,那么它会成功调用其构造函数,但随后cout无法正常工作。

这意味着如果我显式地创建一个对象,它可以完美地工作,但是我如何才能隐式地创建一个对象。

我的 Interrupt.cpp 模块也发生了同样的事情。

所以请帮我解决这类问题。请帮我。任何帮助将不胜感激。谢谢你。

0 投票
3 回答
1444 浏览

c++ - 如何在我的内核中使用 STLPort?

我正在用 C++ 开发内核。但我不想写一个stdlib;为此我下载了STLport http://www.stlport.org/,但我不知道如何安装和使用它。

我正在使用 Linux 来构建我的内核。

如何在我的内核中使用 c++ 标准库?

而且我不想从 STLport 移植所有库。如何排除选择的库?像std::stringstd::vector

0 投票
1 回答
1069 浏览

device-driver - 确认 ATA/IDE 中断的正确方法是什么?

我目前正在开发一个爱好操作系统,特别是 ATA 驱动程序。我在使用带有中断的 PIO 数据输入命令时遇到了一些问题。我正在尝试执行 READ MULTIPLE 命令以逐块读取驱动器中的多个扇区,并为每个块触发一个中断。

如果我请求读取 4 个块(每块 1 个扇区)。我希望得到 4 个中断,每个数据块一个。在收到第四次中断后,我可以确定我已经传输了所有数据并相应地更新了我的请求结构。但是,在 VirtualBox 中,我发现在传输最后一个数据块后,我收到了另一个中断(状态 = 0x50,就绪,重叠模式服务器请求)。我可以简单地读取状态寄存器然后将其清除,但我认为根据规范我不应该收到第 5 个中断。

那么,什么是正确的方法来确认 ATA 设备发出的中断呢?

在这个例子中,我发出一个 READ MULTIPLE 命令,然后我的 ISR 执行以下操作:

  1. 禁用 CPU 中断,设置 nIEN
  2. 从 DATA 寄存器读取单个数据块(不是扇区!),
  3. 如果已读取所有数据,则读取 STATUS 寄存器以清除“额外”中断
  4. 通过清除 nIEN 退出,并向主从 PIC 发送 EOI

PIO 数据输入命令协议的 ATA 规范并不表示您需要读取状态寄存器。由此我假设当我收到中断时,我所要做的就是遵循协议并通过将 EOI 发送到 PIC 来完成。至于 nIEN 的设置/清除,在处理 VirtualBox 时,我发现如果我不这样做,我不会收到任何超过第一个中断的中断。所以我在进入ISR的时候设置了nIEN,然后在我离开之前清除它。我认为这不会有任何影响,但它必须与读取/写入该特定寄存器有关。

0 投票
2 回答
374 浏览

assembly - 我需要 GDT 来构建 IDT 吗?

我正在研究 Atom-32bit 板(AT&T 组件),这个板上还没有软件。

我需要构建 GDT 来构建/使用 IDT 吗?

这个想法只是将 ISR 与 APIC 计时器一起使用。

0 投票
1 回答
2799 浏览

assembly - 加载引导加载程序的第二阶段并启动它

最近,我试图了解引导加载程序的工作方式。我正在用 nasm 汇编器编写我的加载程序,并用 bochs 和软盘映像对其进行测试。

第 1 阶段和第 2 阶段的编译二进制文件通过复制加入到一个图像中。这张图正是我想要的。512Bytes stage1 代码(包括幻数,它加载得很好)和第 2 扇区中的 512 个 stage2 代码。

但我认为我的问题是将扇区加载到内存中并跳入其中。我的代码有问题吗?

Stage1.asm

阶段2.asm

我彻底搜索了一下,没有找到任何描述如何将扇区加载到内存中并跳入其中的确切信息。我的程序甚至找不到第二扇区的 Magicnumber。

如果只是地址上的一些错误计算,那就太好了。

更新:当前源代码,它有锁定的行被标记。出于纯粹的偏执,我将所有 4 个主要寄存器都设置为 0。

Update2:再次是当前版本。在设置寄存器和发出 int 13h 之间没有做任何事情。

0 投票
1 回答
455 浏览

c++ - 将内核项目从 DJGPP 移植到 MinGW

尝试使用 MinGW 和 NASM(以前的 DJGPP 和 NASM)编译 C++ 内核项目。实际上也尝试过 Cygwin,结果完全相同:

  • 首先,刚刚换\DJGPP\bin\MinGW\bin. 收到以下链接错误:target coff-go32 not found.
  • 将目标交换为elf32-i386,并得到了cannot perform PE operations on non PE output file 'build/kernel.elf'这是一个奇怪的错误,因为据我所知,我没有做任何“PE 操作”。
  • 再次将目标更改为pe-i386,出现新错误build/Common.o:Common.cc:(.text+0x2a): undefined reference to 'atexit'

似乎 MinGW 正在生成atexit对静态类的调用。DJGPP 没有。内核在关机期间进行自己的 DTOR 处理。我知道定义atexit会“解决”这个问题,但在这一点上这更像是一种破解,而不是一个长期的解决方案。我宁愿让 MinGW 编译现有代码而无需任何(或最少)修改。

坦率地说,我对 Windows 构建环境并不熟悉,并且可以使用任何提示来做什么。该项目(减去上面列出的更改)在 DJGPP 下可以正常编译和启动。区别似乎在于 DJGGP 和 MinGW 处理编译时类声明的方式?

编辑:最后崩溃并在 Cygwin 上构建了一个交叉编译器。现在都在工作。

0 投票
1 回答
1291 浏览

linux-kernel - 在启动时分配内存

我需要在启动时分配一些内存。我需要它的物理地址,而不是虚拟地址。另外,我不希望它来自 DMA 区域,这不是我的目的。

我尝试了 alloc_bootmem()、alloc_bootmem_pages() 但它们返回虚拟地址。我还查看了 alloc_low_page()... 并没有按预期工作。

问题是,我需要一些 RAM 中的保留区域.. 不必由内核映射.. 我将尝试自己管理该区域。我需要每次启动时的物理区域都相同。

我还尝试在 init/main.c 中分配一些内存: start_kernel() 但这也不起作用。

现在有点卡在哪里/要找什么了。

我更喜欢将答案作为指向正确方向的指针,而不是告诉 do_it_here_in_this_way 。

谢谢 :)

0 投票
1 回答
455 浏览

android - 为 Android 操作系统开发

我有兴趣学习如何为 Android 操作系统开发,以便我可以开始贡献错误修复和补丁。我对为 Android 开发应用程序不感兴趣。尽管我没有任何 Linux 或 OS 开发经验,但我从事软件开发已有几年了。对于像我这样的人来说,从哪里开始是个好地方?

我去了 developer.android.com,它似乎只用于在 android 上开发应用程序。source.android.com 似乎是获取源代码并学习如何设置我的构建环境的地方,但它似乎并没有太多关于系统内部如何工作的信息或提供很多关于源代码本身。我想我可能可以使用与为其他发行版开发相关的文档,但是有没有专门用于在 Android 上开发的资源?在进行研究时,我应该考虑为 Android 开发与其他主要发行版之间的主要区别吗?

我怎样才能获得我可能需要的关于我的特定硬件的任何其他技术信息?在浏览论坛时,有些人似乎知道不同手机上存在的特定无线电或 GPS 硬件型号,甚至对一种型号的功能可能与另一种型号有所不同有所了解。我已经简单地看了看,但似乎我不能只用谷歌搜索“Samsung Fascinate Hardware”并获取组件列表及其文档。进行高级设备编程的人如何获得这些信息?

谢谢,

麦克风