许老师, 我在前面11.多任务:进程,线程与协程 中, 对"从操作系统内核的主线程来说,内核是独立进程,但是从系统调用的角度来说,操作系统内核更像是一个多线程的程序,每个系统调用是来自某个线程的函数调用." 这个说法不是太理解?
1. 从操作系统内核的主线程来说,内核是独立进程. 这个说法, 就是说操作系统内核就是一个多线程的进程,这些线程没有用户态的地址空间; 内核的各个线程共享3G~4G的地址空间, 共用一份内存地址映射表;这样理解对吗?
2.从系统调用的角度来说, 操作系统内核更像是一个多线程的程序,每个系统调用是来自某个线程的函数调用. 这里我有些困惑. 比如, 应用程序A, 运行起来是一个进程A, 其中通过系统调用进行操作系统内核执行代码时, 这时使用的是谁的堆栈?是进程A的堆栈, 还是操作系统进程的堆栈? 我的理解进程A应该有用户态堆栈, 但是有没有内核态堆栈?这个内核态堆栈是属于进程A还是操作系统进程的堆栈?这个地方没有理解?请帮忙解惑.
展开
作者回复: 1、内核主线程是一个独立进程,地址空间是3G-4G。其他用户进程系统调用(syscall)时,用的地址空间是自己的,只不过到了内核后提权了,而且内核地址空间是共享的,所以从内核函数角度感觉上相当于在一个线程中执行一个函数,并不需要做太多的特色处理。
2、关于堆栈,用户系统调用时参数压入的是用户堆栈。到了内核这边后,这些仍然是不变的,并不需要切换到内核自己的堆栈。