linux内核的行为方式和现实社会非常的相似,内核就好像一个管理机构,管理着所有的用户进程,所以当进程犯了错误的时候,内核绝对不能不管,而是当场缉拿,要么惩罚,要么判处死刑。这其中巧妙的地方就是这个从缉拿到判刑的过程,采用了类似三权分立的思想,各司其职。
如果一个进程在用户空间访问了一个不属于它的地址空间的一个地址,那么会被内核发现,其实就是发生了缺页中断,然后内核直接判了这个进程的死刑,发送越界信号,事实上就是杀死了这个进程(内核够残酷吧...)。曾几何时,每当用户需要和内核交换数据的时候,内核首先要检查用户传来数据的合法性,就是检查该数据是否属于该进程的地址空间,这个操作浪费了大量的时间,如果是人类社会,人们不会认为这浪费了时间,因为人类的行为效率总是十分低下,如果砍掉一些部 门,那么会带来大量的失业,会增加社会的不稳定因素,因此人类社会的很多机构都是冗余机构,和操作系统一样,人类社会最重要的也是稳定,不同的是,人类有自由意志,一些规则在某些人身上往往不好使,在操作系统中稀有现象,比如越界,在人类社会就会成为常见现象,比如偷盗,抢劫(实际上也可以理解为用户空间 越界)以及用×××去办银行卡(可以理解为往管理机构传递数据时的越界),如果砍掉相关的检查机构,后果将不堪设想。还是计算机最省心,让它干什么它就干什么。
为了节省开销,内核将数据的合法性检测推迟到不能再推为止,何时是不能再推的时候呢?当然是访问该数据的时候了,访问该数据的时候,如果它不是合法数据,当然就不可能有页表映射,因此会产生缺页中断,因此将合法性检测统统归到缺页处理当中就可以了,我们来看看代码的相关内容:

asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code)

{