问题标签 [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.
assembly - x86 cr3 和 linux swqpper_pg_dir
在 Linux 源代码(版本 2.6.18)中:
还有load_cr3(pgdir)
andwrite_cr3(x)
宏:
似乎整个cr3
控制寄存器都存储了Page Directory的地址。但是,当我参考 intel ia-32 Developer's_Manual 时,它讲述了一个不同的故事。以下是英特尔手册的内容:
手册说 20 个最高有效位cr3
存储页面目录的地址而不是整个cr3
寄存器。这也是合理的,因为页面目录正好是 4kb,所以地址的 12 个最低有效位始终为零。
是不是有点奇怪?linux 代码只是将页面目录的地址分配给 .cr3
而不是swapper_pg_dir
. 寄存器存储的究竟是什么cr3
,地址或英特尔手册建议的格式?
以下链接是英特尔手册: http: //www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
c - 循环参考和低级组装
我有一个名为 的文件idt.c
,在这个文件中,我需要idt_load
从程序集中调用该函数。现在,这可以正常工作,除了我需要idtp
从程序集文件中访问一个变量,并且该变量在 idt.c 中声明
这不起作用,因为链接器会告诉我 idt_load 未定义或 idtp 未定义。我怎样才能让它工作?
idt.c 的相关部分
idt.asm
x86 - 多核/NUMA 上的 CPUID
我正在为我的爱好操作系统开发 CPU 检测和一般环境检测代码。是否存在需要多次调用 CPUID 的情况?也就是说如果系统有多个核心,操作系统是否需要在每个核心上调用CPUID?NUMA 也是如此。
AMD和Intel CPUID 手册都不清楚这一点。osdev wiki 上有一篇文章提到调用 CPUID 称为Detecting CPU Topology,但我的阅读并不清楚何时需要调用 CPUID 以及调用多少次。
c++ - 为“gdt_flush”指定的存储类
我正在编写一个需要与一些外部汇编器函数交互的操作系统。我将声明放在标题中:
当代码运行时,它会产生
DescriptorTables.h:10:31:错误:为“gdt_flush”指定的存储类
我以前从未见过这个错误,关于如何解决这个问题的任何想法?
x86 - 需要LDT吗?
作为 32 位 x86 处理器的某些操作系统开发的一部分,我正在考虑在中断描述符表中使用任务门来处理页面错误向量。目的是强制任务切换,以便保证映射处理程序的堆栈(并避免中断任务的部分堆栈未映射的情况)。
我在 QEMU 下运行我的内核(例如它),但我发现当页面错误发生时,它崩溃了(我回到命令提示符)。我一直在阅读和挖掘寻找可以帮助我找出确切原因的提示。我认为我遗漏了一些东西和/或误解了一些东西。顺便说一句,当我将页面错误向量设置为使用中断门时,我可以让事情按我的预期工作。当我尝试为此使用任务门时,我遇到了问题(是的,我确实想坚持尝试使用任务门)。
IDT 部分被正确设置为页面错误向量注册一个任务门。它的选择器指的是 GDT 中 TSS 的描述符。至于 GDT 中 TSS 的描述符,我确信它也设置正确。
但是,我不能 100% 确定我是否正确填充了 TSS,并且到目前为止还无法准确确定如何设置其所有字段。其中一些,如 esp、eip、cs、ds、es、fs、gs、ss 和 eflags 相对直接。但是,诸如 LDT 段选择器之类的其他内容则不太清楚。LDT 段选择器必须非零并且指向 GDT 中的 LDT 描述符吗?必须为上述场景设置哪些字段?我有很多时间来解决这个问题。
任何帮助将不胜感激。
user-interface - 在自制操作系统中开发 GUI 环境
我制作了一个带有 c 内核的桌面操作系统,可以打印“hello world”。我正在尝试在 c 中为我的操作系统制作一个 GUI(自定义窗口管理器、按钮),但我遇到了麻烦。我看了一个教程:
http://www.osdever.net/tutorials/view/gui-development
是否有任何类型的 GUI 教程适用于C中的桌面操作系统?
ps 没有 Linux,也没有 DOS。只有C标准。
c++ - 无法将 'idt_entry_t (*)[256] 转换为 u8int*
我正在尝试做
产生
错误:无法将参数 '1' 的 'idt_entry_t (*)[256] {aka idt_entry_struct ( )[256]}' 转换为 'u8int {aka unsigned char*}' 到 'void memset(u8int*, u8int, u32int)'
如果有帮助,它是包含在extern "C" {...}
.
谢谢!
operating-system - 内核模式和内存保护
在操作系统用户模式应用程序的虚拟地址空间是私有的,一个应用程序不能更改属于另一个应用程序的数据。每个应用程序都是独立运行的,如果一个应用程序崩溃,崩溃仅限于那个应用程序。其他应用程序和操作系统不受崩溃影响
为什么在内核模式操作系统不保护内存和 BOSD 发生?
assembly - 我可以在这个 Intel 82340SX 上使用 8086 芯片教程中的知识吗?
我最近发现了旧的(非常旧的)笔记本电脑,尽管这可能是学习组装和一些基本操作系统开发的好机会。
组装教程通常专门针对 8086 芯片,所以我的问题是,这个 Intel 82340SX 有什么不同吗?语言使用有什么变化吗?
paging - 缺页后重启指令
我正在用 C 语言开发一个操作系统,但我在分页上苦苦挣扎。我通过分配内存并输出处理物理和虚拟页面分配的低级内存分配输出来循环测试我的内核堆。
当 时PDE 0
,一切都适用于页面0-1023
,但一旦分配移动到PDE 1
,就会引发页面错误并设置当前标志,rw
如果我从不同的物理地址开始分配,有时也会引发标志。
我是否需要从中获取错误地址cr2
并将其映射回PDE
它所属的页面,然后设置或使用 3 的地址?之后我需要重新启动指令,但我该怎么做?有什么建议么?