1

我已经阅读了很多关于虚拟地址和分页的内容。让我先告诉大家我的理解。当一个进程想要执行某事时,它会尝试将数据从硬盘加载到内存中。为此,它使用虚拟地址。所以我们的 MMU 验证虚拟地址查找 TLB 以找到相应的物理页面,如果它没有找到它会查找 Inverted Page Table,如果它没有找到那里的条目,最后它会查找页表它会产生页面错误,并且所有页面交换都已完成,并且所有表都将被更新。当我阅读时,所有进程都有不同的页表和相同的虚拟地址。因此,如果我尝试访问定义为 int a[100] 的数组元素 a[1000],我确信会出现分段错误,因为该指令可能正在尝试访问不属于它的内存。但是操作系统如何通过仅使用虚拟地址和物理页面的概念来知道 a[1000] 不属于正在运行的进程。我在这里遗漏了什么还是我的整个理解都是错误的?

我知道如果进程试图访问只读或支持真正的内存段,我们可以说内存访问是非法的。

最后,沸腾的问题是操作系统如何决定将哪些内存分配给哪个进程以及它如何决定这种内存访问是非法的。

Linux 上的分段错误是什么?

这个链接没有太大帮助。

非常感谢你们所有可爱的人的投入:)

4

2 回答 2

1

On x86, linux uses a combination of segmentation and paging, so the address generated by program first looks up for the corresponding segments base and limit registers values. This gives the virtual address which is then translated using the page table. When you try to access a memory which has not been allocated, the accessed page is beyond what the limit register allows, hence generating a segmentation fault.

于 2012-11-05T07:25:04.383 回答
1

实际上,Linux内核中的每个进程都有一些定义明确的结构,称为task_struct,它存储有关相应进程的所有信息,如其父进程、PID、子进程、地址空间、挂起的信号、与之关联的线程等. 现在地址空间条目在执行进程时告诉内核该进程的合法地址空间。每个进程从一开始就由内核分配给它自己的地址空间。因此,当一个正在执行的进程试图访问其合法内存之外的空间时,就会产生一个错误(称为分段错误Unix/Linux),并通过内核向它发出信号来终止该进程。它对于在操作系统中实现内存保护很重要。

于 2012-11-05T04:45:27.137 回答