问题标签 [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.
linux - Linux中的页表
问题 1:- 在引导过程中,Linux 会创建页表。但是,当一个新进程执行时,它也有自己的页表。这两张表有何不同?
问题 2:- 在 x86 架构上,Linux 使用定义明确的方案(包括页面目录、页表条目等)将线性地址转换为物理地址。假设我们在进程地址空间 A 中有一个线性地址 X,当使用页表进行转换时,它对应于物理地址 Y。还有一些其他进程 B 也有属于它自己的地址空间的有效线性地址 X。现在如果进程 B 想要访问 X,X 是否会再次对应相同的物理地址 Y?
assembly - 在保护模式下进行间接远跳转/调用
如何在保护模式下执行间接远跳转/呼叫?首先,我认为这样做是允许的:
(不用担心段选择器。我的 GDT 的第二个条目是有效的代码段)
但是当 nasm 组装它时,这是一个语法错误。查看 Intel (instruction set reference) 手册的 Book 2a,只能使用jmp ptr16:32
,其中ptr16:32
是立即数,或使用jmp m16:32
,其中m16:32
是包含 48 位跳转地址的内存位置(16:32 )。
现在我尝试以这种方式对其进行编码:
它组装成功,但是当我尝试运行它时,处理器出现一般保护故障并重新启动。我不知道发生了什么。
我假设编码是这样的:
(例如我想使用间接跳转跳转到 0x10:0x8010)
这可能有什么问题?是不是应该用小端编码48位内存值?它应该这样编码吗?
我还没试过做最后一个。
c - 在 C 中访问过程的 PCB
我在 Linux 中工作,我有点困惑,我是否可以访问进程的 PCB?如果是,那么我们可以访问它的哪些内容并将它们打印到终端上,如果不是,那为什么不呢?
谢谢回答 .....
assembly - 在软盘映像文件中使用 grub 在 bochs 中启动您自己的内核
基本上我已经按照这里的说明http://sig9.com/bochs-grub创建了一个裸映像文件,它什么都不做,只是让 BIOS 启动 GRUB。
问题是:
- 我正在编写的内核将是 32 位的,首先使用http://www.jamesmolloy.co.uk/tutorial_html/index.html,但我的主机(物理)机器是 x86_64,bochs 配置如下:
./configure --prefix=/usr --enable-vbe --without-wx --enable-cpu-level=6 \ --enable-fpu \ --enable-plugins --enable-x86-64 --enable -smp \ --enable-long-phy-address --enable-debugger --enable-disasm --enable-debugger-gui \ --enable-raw-serial --enable-vmx --enable-x86-debugger - -启用-iodebug
所以我不确定这是否可行,即使在解决了下一个问题之后:
- 当我启动 bochs 时,grub shell 不会启动。
我得到的是:
有谁知道我做错了什么?
我怀疑按照http://sig9.com/bochs-grub的说明将主机的 64 位 grub 二进制文件复制到应该是 32 位仿真系统的 floppy.img 上。
memory-management - 简单的玩具操作系统内存管理
我正在用 C 和汇编开发一个简单的小玩具操作系统作为实验,但我开始担心自己对系统内存缺乏了解。
我已经能够编译内核,在 Bochs(由 GRUB 加载)中运行它,并让它打印“Hello, world!” 现在我开始尝试制作一个简单的内存管理器,这样我就可以开始尝试其他东西了。
我找到了一些关于内存管理的资源,但他们并没有足够的代码可以关闭(因为我理解了这个概念,但我不知道如何实现它)。
我尝试了一些或多或少复杂的策略,然后选择了一个非常简单的策略(只需在内存中保留一个偏移量并根据分配对象的大小增加它),直到需要更改。还没有碎片控制、保护或任何东西。
所以我想知道当我确实需要一个更强大的经理时,我可以在哪里找到更多信息。而且我还想了解更多关于分页、分段和其他相关内容的信息。到目前为止,我还没有处理过分页,但我在操作系统开发站点中经常提到它,所以我猜我迟早会处理它。
我还阅读了某种形式的间接指针,其中应用程序持有一个由内存管理器重定向到其实际位置的指针。我敢肯定,这对我来说还有很长的路要走,但如果我想尝试虚拟内存或碎片整理似乎很重要。
而且,我应该把我的记忆偏移量放在哪里?我不知道最好的位置是什么,所以我只是随机选择了0x1000
,而且我确信稍后当我覆盖我的内核或其他东西时它会回到我身边。
我还想知道在性能方面我应该期望什么(例如分配和释放的大 O 值)以及内存管理结构与实际托管内存的合理比率是多少。
当然,请随意回答这些问题的一部分。非常感谢任何反馈!
filesystems - 简单的内存文件系统
任何人都可以指出一个简单的(不能强调这一点)内存文件系统的实现吗?如果我可以创建一个文件并执行一个简单的 cat file.txt 就足够了。
我想将它用作我的玩具操作系统的一部分。
assembly - 如何让鼠标在我自己的操作系统中工作?INT 33h 在 EMU8086 之外不起作用
我已经完全在汇编中开发了自己的操作系统,现在我想实现一个鼠标驱动程序,因为我看到带有 EMU8086 的 Windows 中的 INT 33h 可以工作,但是当我从软盘启动时它不起作用。我尝试过 USB 和 PS/2 鼠标,结果相同。谁能解释我必须做什么才能使操作系统识别鼠标?
c# - C# 中的 OS(操作系统)编程
我知道这个项目。问题是“我们可以用托管代码创建一个真正的操作系统,还是用这个项目创建的操作系统是一个 hello world 操作系统?” 操作系统需要完全控制硬件。我们可以用这个来做吗?如果还有其他项目,请告诉我
Cosmos Project
x86-64 - x86-64 处理器的 NUMA 文档?
我已经查找了 X86-64 处理器的 NUMA 文档,不幸的是我只找到了 NUMA 的优化文档。
我想要的是:如何在系统中初始化 NUMA(这将包括获取系统的内存拓扑和处理器拓扑)。有谁知道关于 X86-64 AMD 和 Intel 处理器的 NUMA 的好文档?
c - 将 C 函数的值返回给 ASM
我正在尝试从 ASM 中调用一个函数。我知道如何调用它,但我无法找到如何获取此函数的返回值。一个例子如下:
C代码:
(N)ASM 代码:
有任何想法吗?