对内核态和用户态的疑问
最近在看Linux用户态和内核态,看的是一头雾水,现在有几个疑问,想要问问:
1. 在网上查到,“每个用户进程,都映射在0-3GB的用户地址,而上层的第4GB,则是映射着内核地址”。
那么对于一个进程,内核态和用户态是相互对立的吗?也就是说当该进程被OS调用中断,要进入内核态处理时候,该进程就从用户态跳出,进入内核态?或者说,本来代码是映射在0-3GB的一段,此时进入内核态,地址映射到了4GB空间了,0-3GB就没有该进程了,在4GB的内核空间执行完后,该进程再映射回去,是这样吗?
2. 网上查到的”所有用户态的进程,都对应着同样的内核段“,也可以说就那么一个内核空间,而用户空间是对每个用户态进程都有的虚拟的0-3GB。假如是这样,那么假设有100个进程,全都发生中断要进入内核段,那是不是就发生了阻塞,处理完一个,下一个再进入内核态?那这样循环往复,内核态不是在不停的处理中断,内核态本来应该做的事情呢,不做了吗?
3. 在不处理中断时候,内核态在干嘛?
4. 从用户态到内核态,有好几种方式,例如可以通过调用ioctl函数。当使用此函数,将对应的module写入fd,然后内核态读取,处理。按照这种通信方式,让我感觉用户态和内核态好像又是独立的,或许所有用户态都是通过把中断写入ioctl文件,内核在不停的读取ioctl,当读取到,就去执行对应的要求。是这样吗?
综上4点疑问,其实主要对立的就是对内核态和用户态的性质的疑问,他们到底是对立的还是共存的?