问题标签 [kernel]

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 投票
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 投票
3 回答
121237 浏览

kernel - 如何配置 modprobe 来查找我的模块?

我正在尝试让内核模块在启动时加载。

如果我运行insmod /path/to/module.ko,它工作正常。但是每次重新启动时都必须重复此操作。

如果我运行modprobe /path/to/module.ko,它找不到模块。我知道 modprobe 使用了一个配置文件,但是即使将 /path/to/module.ko 添加到 /etc/modules 后,我也无法让它加载模块。

什么是正确的配置?

0 投票
3 回答
1236 浏览

windows - C(++) 编译器转换 - 请让 DJGPP 消失

我正在写一个内核,我有几个朋友和我一起做这个项目。我们一直在使用 DJGPP 编译该项目,但我们在以这种方式编译时遇到了一些跨平台兼容性问题,导致我在该项目上的主要 Partnet 无法在 Windows XP 上编译。(DJGPP 的 GCC 在 Windows XP 上存在超过 127 个参数列表的问题,但在 Vista 上没有相同参数列表的问题。因此,这一次,Vista 在某些方面比 XP 工作得更好。oO)

任何人,与其尝试一些肮脏的技巧来使该死的东西用 DJGPP 编译,我们决定我们要完全放弃 DJGPP 并使用不同版本的 GCC for windows。问题是,MinGW(据我所知)不允许我们对代码的汇编部分使用 NASM 语法,此时将其全部转换为 AT&T 语法会有点痛苦。当然可能,因为它在项目的早期阶段,但很痛苦。

所以现在你知道问题所在了。我的问题是:Windows 的 GCC 编译器发行版将允许我们最轻松地将这个项目移植到自身?理想情况下,我们正在寻找可以执行 NASM 汇编器语法的东西,不依赖外部 dll(这里是内核,它无法访问它们)并且可以在 Windows 上的多个版本上一致地工作。您对执行此操作的最佳方法有何建议,以及您推荐什么版本的 GCC for windows?

请注意,如果我们需要将项目转换为 AT&T 语法,那没关系,我不想这样做。我们实际上是在使用 NASM 来组装它的组装位,并生成一个有效的 .o 文件,但 MinGW 出于某种原因无法将其链接。我认为内联汇编位(可能是 5 行)已经是 AT&T 语法,正如 GCC 所要求的那样。

谢谢!

0 投票
2 回答
724 浏览

linux - 冗余 Linux 内核系统调用

我目前正在开发一个项目,该项目挂钩各种系统调用并将内容写入日志,具体取决于调用的是哪个。因此,例如,当我更改文件的权限时,我会在日志文件中写入一个小条目来跟踪旧权限和新权限。但是,我在确定应该观看的确切位置时遇到了一些麻烦。对于上面的示例,strace 告诉我“chmod”命令使用系统调用 sys_fchmodat()。但是,还有一个 sys_chmod() 和一个 sys_fchmod()。

我确信内核开发人员知道他们在做什么,但我想知道:所有这些(看似)冗余系统调用的意义何在,是否有任何规则说明哪些系统调用用于什么?(即“at”系统调用还是以“f”为前缀的系统调用是为了做一些特定的事情?)

0 投票
1 回答
2625 浏览

linux - 实时 Linux 扩展已经过时了吗?

来自 Ingo Molnar 的新实时和低延迟补丁是否会使以前的 Linux 实时扩展(例如 RTAI、Xenomai)过时?

0 投票
2 回答
2843 浏览

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

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

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

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

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

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

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

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

感谢您的任何建议。

0 投票
2 回答
3853 浏览

assembly - 设置 IRQ 映射

我正在关注几个教程和参考资料,试图设置我的内核。我在一个根本没有解释它的教程中遇到了一些不熟悉的代码。我被告知将其映射16 IRQs (0-15)到 ISR 位置的代码32-47

的代码outportb()如下,但我已经清楚地掌握了它的作用:

我应该提一下,这是在保护模式下的 x86 架构上。此源代码工作正常,我了解它的作用,但我不明白它是如何做到的。有人可以向我解释这里发生了什么,以便万一我需要对此进行扩展,我会知道我在做什么?