- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
以 Unix 内核为例。在内核空间和用户空间方面,有些事情我不太了解。
我们将有用户空间应用程序代码和内核代码。内核代码可以不受限制地访问底层硬件,其代码和内存与用户空间代码完全分离。
当用户空间应用程序正在执行时,内核代码是否也在并行执行,例如内核线程总是检查事物?
我一直在阅读内核为试图访问受限内存部分的用户空间程序提供内存保护。这种内存保护是动态发生的,还是会在编译期间发生,如果用户空间代码试图写入内存的受限部分会出错?
一般来说,如果内核代码不同时执行,如何阻止用户空间程序写入内存中它想要的任何位置?我会猜测并说这是因为 MMU 和虚拟内存,但还有更多吗?谢谢
最佳答案
When a user space application is executing, is the kernel code also executing in parallel, such as kernel threads always checking things?
没有。
Is this memory protection happening dynamically, or will it be during compilation, an error if user space code tries to write to a restricted part of memory?
内存限制由内存管理硬件结合 CPU mode 动态强制执行。 .
内核在引导期间配置这些限制,即 MMU 初始化。
编译器通常不执行任何地址强制。生成越界访问数组的代码很容易。同样,很容易生成引用“受限”内存的指针。请注意,编译阶段通常不假设运行时环境(例如内核空间占用 32 位虚拟地址空间的 1GB 还是 2GB?),因此编译后的程序更具可移植性。
In general, what is to stop a user space program from writing to anywhere it wants in memory if the kernel code is not executing at the same time?
用户空间程序只是以限制某些操作的受限 CPU 权限执行。
此外,它在自己受限的虚拟内存空间中执行,与其他进程分开。
顺便说一句,CPU 一次(基本上)只能执行一条指令,因此不存在“内核代码...同时执行”,前提是无关紧要的。
is there more to it?
CPU 必须有 privilege mode(s) ;并非所有 CPU 都具有此功能。早期 PC 的英特尔 CPU,例如8088和80286,没有。
“当用户空间应用程序正在执行时”,CPU 处于用户模式,即具有最少特权/功能的模式。内核代码在主管/特权(又名内核)模式下执行。
When and where is the protection implemented?
在执行每条指令时,CPU 根据当前 CPU 模式验证该指令。试图在受限模式下执行特权指令会触发 CPU 异常。
如果指令还涉及内存引用,则 MMU 会根据当前 CPU 模式(即用户模式与内核模式)验证该虚拟内存地址(即用户空间与内核空间)。
对于有效的内存引用,MMU 将确认物理内存已映射到该虚拟地址,并且内存页已驻留。
附录
您似乎将访问虚拟内存和物理内存的限制混为一谈。
您的用户空间程序只能访问较低的虚拟内存。边界由内核定义。硬件拒绝访问内核空间,特别是 MMU 和 CPU 模式。
您的(用户空间)程序只能访问操作系统为其提供的内存空间。编程语言没有针对替代(例如物理而不是虚拟)地址空间的内置构造。保护模式 Windows(即 Windows NT 和更高版本,不是 Windows 3.x)不提供程序访问物理内存。 POSIX 操作系统提供伪设备 /dev/mem 用于将任何物理地址映射到用户(虚拟)地址空间的内存。
由于 ARM 处理器没有 I/O 指令或地址空间,因此所有 I/O 都是内存映射的。因此,/dev/mem 是用于访问连接到运行 Linux 的 ARM 处理器的外围设备的设备。
对伪设备 /dev/mem 的访问由内核使用文件系统权限控制(就像所有其他文件一样)。
关于linux - 写入任何地方的用户空间程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50656168/
运行 Tomcat 失败并出现 java.lang.OutOfMemoryError - 与缺少 PermGen 空间相关的错误。 我最近将 Tomcat 更改为以自己的用户(而非 root)运行。
我们有一个表,其中包含数百万行,其中包含 PostGIS 几何图形。我们要执行的查询是:落在边界几何内的最新条目是什么?这个查询的问题是我们经常会有大量的项目匹配边界框(半径大约为 5 公里),然后
我有一个Elasticsearch设置,它将允许用户搜索通配符作为索引。 array:3 [ "index" => "users" "type" => "user" "body" => arra
我创建了一个表,其中每行包含两个按钮,并且两个按钮连接在一起,我想将两个按钮分开。我用过 不起作用,css 也是,这是他们的另一种方式。 我有另一个问题,因为我不想在表格边框内显示操作按钮,而是在靠近
我试图在 jQuery Mobile 中的两个按钮之间留出空白。现实中的布局是这样的: Button 1 Button 2 (Hidden w/ display: none)
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
您好,我对图表应用程序还很陌生。现在我为我的应用程序创建了条形图。当我运行 create bar chart as separate project 时,输出如下所示。 然后当我将条形图与我的应用程序
我在使用 H2 和 GeoDB(内存中,junit)时遇到问题。 另外,使用 Hibernate 5(每个包的最新版本,包括 hibernate-spatial)和 Spring 4。 通过 id 实
我想画一张澳大利亚的 map ,并将每个城市表示为一个点。 然后突出显示人口众多(> 1M)的城市 library(sp) library(maps) data(canada.cities) head
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 6年前关闭。 Improve this
如何保持.txt文件中存在的空格?在.txt文件中,它表示: text :text text1 :text1 text23 :text2 text345 :text3 如果我写这段
以下哪个键最大? 选项 1:16 个数字 [0,9] 选项 2:30 个元音 选项 3:字母表中的 16 个字母 选项 4:32 位 有人可以帮助我,告诉我哪一个是正确的答案以及我们如何计算它吗?我知
在 Unity 3d 中使用 Azure 空间 anchor 来实现在 iOS 和 Android 上部署的室内和室外增强现实体验是否有益? 最佳答案 是的,对于 Azure Spatial Anch
我有一个绝对定位的圆形图像。图像只需占据屏幕宽度的 17%,并且距离顶部 5 个像素。 问题是,当我调整图像大小以占据屏幕宽度的 17% 时,它会这样做,但同时容器会变长。图像本身不会拉伸(stret
我在 Ubuntu 14.04 上使用 Cassandra。从文档中,我可以看到运行命令: nodetool snapshot 创建我的 key 空间的快照。 命令的输出是: nodetool sn
Heroku引入了“私有(private)空间”,是否可以将现有应用迁移到私有(private)空间? https://blog.heroku.com/archives/2015/9/10/herok
是否允许在语义记录中使用非绑定(bind)空格 或其他 HTML 编码字符?我遇到的问题是 ; 字符被软件视为记录的结尾。 例如:假设我有一份婚姻记录,其中包含 2 个结婚者的姓氏、结婚年份以及结
我正在研究“智能 parking ”项目,偶然发现了包含我们真正需要的YouTube视频。我们已经实现了第一部分,即从视频源进行实时透视变换,下一步是将其定义为一组矩形 我基本上需要知道他是如何做到的
我有两个类:Engine 和 Trainset(多个单元),这两个类共享其 ID 空间,其中包含名称和系列 id=- . 这是我的Engine类(它是抽象的,因为有引擎的子类型(DieselEngin
如果有人能帮助我,那就太好了。 我正在尝试使用Java的Split命令,使用空格分割字符串,但问题是,字符串可能没有空格,这意味着它将只是一个简单的顺序(而不是“输入2”将是“退出”) Scanner
我是一名优秀的程序员,十分优秀!