- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一点介绍,
我目前正在编写一个小型(读微型)RTOS 内核,它应该与内核中的大多数内容是一体的。然而,我找不到关于下面列出的一些事情的太多信息,这会很有帮助,除此之外,它实际上不是某种大学项目,而是我按照自己的意愿做的事情。
回答所有问题的一个更好的选择是,如果您可以向我推荐一个免费的适用于arm的RTOS(甚至是一本免费的书),最好是实现用户空间并且是可抢占的(但不复杂)像Linux)。 Linux 有一些我迄今为止见过的最糟糕的文档(我确实尝试从 Linux 代码中找出一些东西,但是只有大量的定义分散在数百万个文件和函数钩子(Hook)中,它们的名称很奇怪,而且每个版本都被重命名。有时会移动...)
“抢占”和“上下文切换”有什么区别?
抢占式内核和非抢占式内核之间的主要区别是什么?程序员需要做哪些工作才能使内核抢占?
如何创建和使用用户模式?
ARM 文档说,在用户模式下,任何切换到特权模式的指令都将被视为未定义指令。
如果是这样,用户空间程序使用内核代码的唯一方法是系统调用?
内核如何响应或与用户空间交互?
这是否意味着启动后(在简单系统中)唯一的内核线程将是空闲线程?
如果切换到用户进程时内核代码和数据所在的页面未映射,那么在系统调用或中断时,内核代码如何在没有映射到虚拟地址空间的情况下执行?
“可抢占式内核”是否仅意味着内核的设计方式可以在内核代码执行期间安全地进行上下文切换?或者是否需要做更多的工作(如果有的话)?
哦,如果这里不允许提出这样的多个问题,抱歉,找不到任何相关内容。
最佳答案
正如 Mat 所写,这可能是不合理的范围。不过,我会尽力像关注一个合理范围的问题一样关注这些问题的总和,希望这能帮助您开始研究。
1 What is the difference between "preemption" and "context switch" ?
抢占是在没有进程参与的情况下中断进程的行为。在这种情况下,这可能意味着将触发计时器中断。这个词来源于法律概念preemption :在其他人之前或优先于其他人主张或购买的行为或权利。就您的目的而言,这意味着当定时器中断触发时,中断服务例程 (ISR) 优先于执行该操作的代码。之前正在运行。这根本不需要涉及内核;您可以在任何 ISR 中运行代码,这些 ISR 会抢占式运行。
当操作系统代码(抢占式运行)在一个进程或线程的上下文与另一个进程或线程的上下文之间改变处理器的状态(寄存器、模式和堆栈)时,就会发生上下文切换。处理器的状态可以位于一个线程中的某一行代码处。它将在寄存器中包含临时数据、位于内存特定区域的堆栈指针以及其他状态信息。抢占式操作系统可以存储此状态(存储到静态内存或进程的堆栈上)并加载前一个进程的状态。这称为上下文切换。
2 What are the key differences between a preemptive and nonpreemptive kernel ? What all work is required from a programmer to make the kernel preemptive ?
在抢占式内核中,可以在任意两个汇编指令(称为“序列点”)之间触发中断。在非抢占式内核中,正在运行的进程必须调用yield()函数以允许其他线程运行。抢占式内核更复杂,但提供了更好的并发假象。非抢占式内核可以通过setjmp.h
非常简单地完成,但每个线程必须定期调用yield()
,否则其他线程将无法运行。
当调用像 yield()
这样的函数时,处理器的状态会自动存储。当您想让操作系统抢占时,您必须手动存储此信息。
3 How to create and work with user mode ?
ARM docs say that in user mode, any instruction switching to a privileged mode will be treated as undefined instruction.
正确。然而,他们还说任何中断都会自动在特权模式下运行。在 ARM 系统上,您可以使用 svc 指令生成软件中断。然后,SVC 代码(操作系统的一部分)将能够在特权模式下运行。
4 If so, the only way for a userspace program to use kernel code is syscalls ?
正确。至少,这是唯一安全或正确的方法。
5 How does a kernel respond or interact with userspace then ?
在ARM上,SVC指令可以获得8位值。这可用于生成 256 个系统调用,例如yield、启用中断、禁用中断或任何您需要的内容。如果需要,您还可以选择创建共享内存或消息传递交互机制。
6 Does that mean the only kernel thread after booting (in a simple system) would be the idle thread ?
这完全取决于您如何设计系统。如果您选择仅在创建所有线程后启动内核,这可能会更简单 - 这样您就不需要担心动态分配线程。或者,您可以从空闲线程开始,稍后添加其他线程(通过远程 shell?我认为您希望至少有一个用户线程持续运行...)
7 If the Page where kernel code and data resides is unmapped when switching to a user process, then on a syscall or interrupt, how does the kernel code execute without being mapped in the virtual address space ?
正如内核模式代码在特权模式下运行(即使该代码之前在用户模式下执行)一样,内核模式代码也将从主堆栈指针 (MSP) 运行,即使进程代码使用不同的地址空间。
8 Does a 'preemptible kernel' only mean that the kernel was designed in a way that it would be safe to have context switch during execution of kernel code ? or does it require more work to be done if any ?
我认为这意味着内核可以抢占用户代码,而不是内核本身可以被抢占。对于任何事情来说,中断内核都是困难且不寻常的。这需要更多的工作,我很难理解你为什么想要它。
关于architecture - 抢占和上下文切换的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11602395/
如果您设计分布式应用程序以实现轻松扩展,或者您只想使用 Amazon、Google 或 Microsoft 提供的任何新的“云计算”产品,那么您通常最终会使用一些典型的概念或组件: 分布式 blob
根据uncle Bob's Clean Architecture 、企业和应用程序业务规则(概念上由命令组成)位于外部接口(interface)层之下的层中。因此,无论何时调用接口(interface
我在网上找不到它的任何实现实际上为您提供了一种与框架无关且实用的实现方式。 我已经看到了几个解决它的低于标准的建议: 使存储库方法成为原子 使用例原子化 它们都不是理想的。 案例#1 :大多数用例依赖
我正在查看 Sparkle 项目的配置并注意到它们设置: 架构 = ppc i386 x86_64 有效架构 = i386 x86_64 来自苹果的有效架构描述: Space-separated li
只听本周的podcast并认为将您的一些经验组合在一起会很好,在这些经验中,您已经看到设计的“架构”方面比应有的支配更多东西。 Java 在这方面经常受到负面报道,而且随着 Java EE 的复杂性增
我正在阅读 Bob Martin (https://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html) 的清洁架构
OSGi是模块化架构,JavaBeans是组件架构。有什么区别? 最佳答案 OSGi 和 Java Beans 之间的主要区别在于类加载器的工作方式。在标准 .jar 文件或 EJB 中,rt.jar
我对 Clean Architecture 中的 Gateway to Entity 依赖有疑问。我认为以下同心圆图形经常被介绍为整洁的架构。 在上图中,Gateway并没有直视Entity。但是,还
我试图理解 TOGAF 9 的核心概念。 无论我多长时间阅读 TOGAF 手册中的解释,我都无法理解 Enterprise Continuum 和 Architecture Repository 之间
如果 Kappa 架构直接对流进行分析,而不是将数据拆分为两个流,那么在像 Kafka 这样的消息系统中,数据存储在哪里?或者它可以在数据库中进行重新计算? 单独的批处理层是否比使用流处理引擎重新计算
它们的含义是什么,我可以将它们设置为不同的值吗? 最佳答案 架构是您想要构建的架构,有效的架构是您可以设想使用您的代码库构建的架构。 所以也许您只想为 armv7 构建二进制文件,但相同的源代码可以为
我现在正在尝试在 Xcode 4.0 中构建的项目遇到问题,希望有人可以为我解释一下。 我正在尝试使用 ZBar SDK 并遵循此处概述的指南中概述的说明: http://zbar.sourcefor
在基于 Apple Silicon 的机器上使用 Interface builder 时,我当前的项目会引发 IBDesignable 错误。 我尝试排除用于调试的 arm64 架构,以及我在互联网上
Xcode 项目中出现警告: crypto was rejected as an implicit dependency for 'libcrypto.a' because its architect
我正在 Xcode 5 中开始新项目。我想使用 iOS SDK 7 开发应用程序,但部署目标为 iOS 5.0。当我在 Xcode 中创建新项目并尝试将部署目标更改为 5.0 时,我收到了这条消息:
编辑 :这个问题可能是旧的,它与 xcode 3 有关。 我正在开发一个需要 voip 支持的 iPhone 应用程序,所以我添加了 pjsip 的 ARM 版本图书馆。但如果我使用 iPhone 模
我们最近将最低 iOS 支持设置为 4.0,并开始使用 LLVM 编译器对当前可用的应用程序进行新更新。 将“架构”和“有效架构”设置为仅 armv7 是否会排除 iPhone 3G 等 armv6
我想在我的 64 位机器上启用额外的架构(32 位)。我做了 dpkg --print-architecture 来了解已知的架构,即 amd64 。之后我做了 dpkg --print--forei
操作系统:OS X Yosemite 版本 10.10.1 XCode:未安装 应用程序加载器3.0 (620) PhoneGap:3.7.0 PhoneGap 构建:在线 (build.phoneg
我们已经构建了一个具有多个 native 绑定(bind)的 Xamarin 应用程序(iOS、Android)。该应用程序在设备和模拟器上运行良好,我们能够毫无问题地构建存档(显然)。 问题是当我们
我是一名优秀的程序员,十分优秀!