内存段由操作系统或体系结构定义吗?

时间:2018-07-03 19:04:18

标签: memory linux-kernel virtual-address-space

x86体系结构具有用于地址空间各个段(ss,ds等)的段寄存器。如果我想在进程地址空间中添加一个新的内存段,是否可以仅通过修改内核来实现,还是需要硬件支持?只是好奇并不想去做任何特定的事情,而是试图了解Linux如何使用段寄存器。

2 个答案:

答案 0 :(得分:0)

来自此链接 https://www.cs.princeton.edu/courses/archive/fall02/cs318/proj2/pc-arch.html

  

现代操作系统和应用程序使用(未分段的)内存   模型¾所有段寄存器都加载了相同的段   选择器,以便程序对所有内存的引用都指向一个   线性地址空间。

     

编写应用程序代码时,通常会创建段选择器   带有汇编指令和符号。汇编器和/或链接器   然后创建与这些对象关联的实际细分选择器   指令和符号。如果您正在编写系统代码,则可能需要   直接创建细分选择器。

此外,您不能在不更改包括硬件支持在内的许多内容的情况下添加新细分。

答案 1 :(得分:0)

内存通常由名为内存管理单元(MMU)的专用硬件进行管理。 任何x86 CPU都有一个MMU,但这并不意味着必须必须在硬件中进行内存管理。 Linux本身可以通过在软件中模拟MMU来运行。 当然,如果没有硬件支持,实现某些功能将非常困难(在某些情况下甚至是不可能)。 从纯粹的理论角度来看,您可以在软件(内核空间)中模拟具有您喜欢的所有细分的类似细分的行为,但是在现实世界中,这将是一个坏主意。

正如您所说,x86_32支持内存分段,但是自i386以来,它还支持分页。如今,分段被视为已被弃用,并且没有现代的操作系统(AFAIK)使用该分段(也许有些补丁补丁,例如grsecurity / PaX及其UDEREF功能)。 还需要注意的是,x86_64完全不支持分段。