我喜欢操作系统,最终想成为一个主要从事内核工作的操作系统开发人员.在未来,C仍然是首选语言,我还应该学习什么?
由于上学原因,我最近没有编码,但我决定再次开始从事OS开发工作.最近我听说EFI作为BIOS的替代品.我想为使用EFI而不是BIOS的平台开发操作系统.我无法确定从哪里开始.谁能指出我正确的方向?也许解释一下EFI对OS开发的意义,也许可以告诉我可以使用哪些测试环境(最好是虚拟的).坦率地说,我真的不确定EFI到底是什么.我也应该花时间研究ARM组装吗?我知道x86汇编,但我觉得这也已经过时了.我真的迷路了,我很想听听你的意见.
谢谢
我正在为键盘输入工作,我正在开发一个非常基本的内核,而且我完全卡住了.我似乎无法在网上找到任何可以向我显示我需要知道的信息.
我的内核现在正在保护模式下运行,所以我无法使用实模式键盘例程而不会跳转到实模式和后退,这是我试图避免的.我希望能够从保护模式访问我的键盘.有谁知道如何做到这一点?到目前为止我唯一发现的是它涉及使用输入/输出端口直接与控制器通信,但除此之外我感到难过.当然,这不是经常出现的事情.通常,Assembly教程假设您正在运行下面的操作系统.
我是x86程序集的新手,所以我只是在寻找一些好的资源来处理来自保护模式的标准硬件.我正在用NASM编译汇编源代码并将其链接到用DJGPP编译的C源代码.有什么建议?
我的实验代码在裸机x86_64-metal上运行时崩溃(当IDT尚未设置时页面错误),但在aarch64上运行完美.
通过仔细的跟踪,我发现这个页面错误的原因包括损坏的地址(远高于0x200_000,而只有前2M页面被映射为1:1)的函数"f"作为参数传递给core :: fmt :: ArgumentV1 :: new()函数:
#[doc(hidden)]
#[unstable(feature = "fmt_internals", reason = "internal to format_args!")]
pub fn new<'b, T>(x: &'b T,
f: fn(&T, &mut Formatter) -> Result) -> ArgumentV1<'b> {
unsafe {
ArgumentV1 {
formatter: mem::transmute(f),
value: mem::transmute(x)
}
}
}
Run Code Online (Sandbox Code Playgroud)
AFAIK这个值是由rustc编译器硬编码的,是format_args编译时处理的结果!可变参数.
也许你有建议这个案子有什么问题.谢谢.
我正在编写自己的操作系统.到目前为止,我的代码超过512字节,这太大了,无法容纳在简单的引导扇区中.
据我所知,我现在必须编写一个读取任意代码的引导加载程序,这些代码可能会也可能不会超过一个512字节的扇区.
引导程序需要:
这也是提出涉及操作系统开发的Stack Overflow问题的一个很好的起点.程序员经常很难创建一个Minimal,Complete和Verifiable示例.一个常见的样板/模板将允许其他Stack Overflow用户希望通过有限的大惊小怪来帮助测试代码.
我将如何构建这样一个可重用的引导程序?
我正在为操作系统开发内核.为了执行它,我决定使用GRUB.目前,我已经连接到GRUB的脚本stage1,stage2,垫文件,这使得它可引导内核本身一起.唯一的问题是,当我运行它时,你必须让GRUB知道内核的位置和手动的大小然后启动它,如下所示:
kernel 200+KERNELSIZE boot
KERNELSIZE是块中内核的大小.这很好,一开始就没问题,但是可以在二进制文件中获取这些值并使GRUB自动启动内核吗?有关如何实现这一目标的任何建议?
我正在编写一个小内核,只是为了解决一些低级别的问题.现在,它在Virtual Box中启动,我可以在屏幕上显示文本,分配一些内存,以及其他非常基本的东西.它是用C++和一点点asm编写的.
我想探索的一件事是多任务背后的机制.据我了解,它是这样的:
因此,它在概念上似乎很简单,但我知道细节会变得更加毛茸茸.我发现了一些在线的东西,但术语变化很大,而且这些例子似乎来自我没有的上下文(比如Linux内核中的内容).
但是,设置描述符表的方式似乎是这样的:
outb以及什么不是)以初始化它.lidt.但是,我找不到具体做这些事情,或者这是否正确.有没有人有一个困惑的内核作家的资源?
我正在编写一个小型操作系统,它将在用户模式下执行一些代码(权限级别3).从该用户级代码,我想将中断调回到打印消息的操作系统.现在我真的不关心我的中断处理程序如何接受参数或类似的东西,我真的只想要一个中断处理程序来通知我(用户)代码已执行.
我的问题是:如何在用户模式下运行代码?我有一个函数,它设置一个带有代码段和数据段的本地描述符表(都具有用户模式权限).我不明白是我应该如何这些段装入cs,ss和ds.我成功加载了我的LDT,但我不知道如何实际使用它.我听说我应该使用iret,但我不知道具体如何.
我的另一个问题是我的中断处理程序应该如何工作.假设我为向量号0x40安装了一个中断处理程序,我想打印"你好,用户模式!".我知道如何设置中断处理程序,但我不完全理解从用户模式进入内核中断处理程序时如何切换上下文.我知道cs寄存器必须更改,因为我的例程将从我的IDT条目中指定的代码段运行.我也明白堆栈选择器可能也会改变,但我无法确定.
有人可以向我解释当调用中断门时会发生什么情况变化吗?
我正在为学习目的编写一个玩具内核,我遇到了一些麻烦.我做了一个简单的引导加载程序,从软盘加载一个段(用32位代码写入),然后引导加载程序启用A20门并打开保护模式.如果我用汇编程序写它,我可以跳到32位代码,但是如果我用C语言写它,我会得到一个三重错误.当我反汇编C代码时,我可以看到前两条指令涉及设置一个新的堆栈帧.这是工作ASM代码和失败的C代码之间的关键区别.我使用NASM v2.10.05作为ASM代码,使用来自DJGPP 4.72集合的GCC作为C代码.
这是引导加载程序代码:
org 7c00h
BITS 16
entry:
mov [drive], dl ;Save the current drive
cli
mov ax,cs ; Setup segment registers
mov ds,ax ; Make DS correct
mov ss,ax ; Make SS correct
mov bp,0fffeh
mov sp,0fffeh ;Setup a temporary stack
sti
;Set video mode to text
;===================
mov ah, 0
mov al, 3
int 10h
;===================
;Set current page to 0
;==================
mov ah, 5
mov al, 0
int 10h
;==================
;Load the sector
;=============
call load_image …Run Code Online (Sandbox Code Playgroud)