我最近阅读了一些操作系统的书籍。所有这些都详细介绍了如何“制作”操作系统。
但问题是,与操作系统一样,程序也被编译成机器代码,操作系统如何在证券方面执行它们?
假设部分程序将修改操作系统或其他正在运行的程序。操作系统如何阻止它?
答案 0 :(得分:3)
操作系统整体上并不关心语言。它们都是可执行代码,他们并不关心是谁创造的。
他们关心自己和其他程序的完整性。这通常由虚拟内存机制修复 - 程序根本无法形成指向它无权访问的内存的指针。如果至少允许程序读取它,物理内存只有一个地址。
答案 1 :(得分:1)
典型的解决方案是不同的处理器模式。通常相同的指令集但在不同的模式下存在不同的保护机制。
例如,经常使用MMU,它做了一些事情,一个是虚拟化内存,一个副作用是程序可以认为它们都在同一个地址空间。例如,所有程序都可以认为它们是从零地址运行的。其次,mmu通常用于定义可缓存和不可缓存的内存区域。第三个(但不是最后一个)是mmu通常用于将程序保存在自己的内存空间中,如果它超出该空间,则发生故障并且操作系统接管。
因此,操作系统本身将以超级用户模式或功耗最大且限制最少的模式运行。但是,用户代码理想地以具有最多限制的模式运行,并且操作系统在调用用户代码并为其提供时间片之前设置该环境。细节都是特定于处理器的,并且代代相传,并且从一个家庭/架构到另一个不同。
对于大多数无关的编程语言,编译器不需要和IMO不应该知道你在什么模式,它的工作是将高级代码转换为低级代码,句点。由于各种原因,内核代码将周期性地使用汇编来辅助,例如,不需要直接映射到高级编程语言的处理器特定指令。围绕这个少量asm或调用基于asm的函数的高级代码来自编译器的透视图。现在,这并不意味着某些编译器将创建编译器特定的指令(读取:非可移植,有时是环境或处理器特定,丑陋)以保存程序员一点点汇编语言。
答案 2 :(得分:0)
确切的实现高度依赖于操作系统和底层架构,因为某些架构可以提供安全性的硬件机制(例如,将内存区域标记为只读)。