当前位置: 技术问答>linux和unix
Linux内核,我的理解
来源: 互联网 发布时间:2016-07-19
本文导语: 读《深入理解linux内核》把理解用自己的话写下来,望高人指教。 一个进程要运行,首先由内存管理单元,分配内存,这块内存由逻辑地址标识。这块地址就是一个数据结构,有代码段,数据段,也有stack和heap。逻辑...
读《深入理解linux内核》把理解用自己的话写下来,望高人指教。
一个进程要运行,首先由内存管理单元,分配内存,这块内存由逻辑地址标识。这块地址就是一个数据结构,有代码段,数据段,也有stack和heap。逻辑上是连续存储的,但在实际内存中可能不连续。重点是这个数据结构中的stack是在内核态工作的。当有中断或者异常时,就把寄存器保存在这个内核态的stack中,esp和ss保存在TSS数据结构中。TSS可以由GDT中的相关指针得到。问题是这么多的进程,每个进程的ss和esp都保存在TSS中?由于进程大都运行在用户态,如果放生中断,且中断处理程序段处于内核态,则会发生#GP错误。所以系统中有不同特权级的中断处理程序。不知道这么理解对不对。另外内核的系统调用,也需要stack和heap那么系统调用的stack和heap在那里?如果系统调用时发生中断,又是什么情况?
请高人指教。
一个进程要运行,首先由内存管理单元,分配内存,这块内存由逻辑地址标识。这块地址就是一个数据结构,有代码段,数据段,也有stack和heap。逻辑上是连续存储的,但在实际内存中可能不连续。重点是这个数据结构中的stack是在内核态工作的。当有中断或者异常时,就把寄存器保存在这个内核态的stack中,esp和ss保存在TSS数据结构中。TSS可以由GDT中的相关指针得到。问题是这么多的进程,每个进程的ss和esp都保存在TSS中?由于进程大都运行在用户态,如果放生中断,且中断处理程序段处于内核态,则会发生#GP错误。所以系统中有不同特权级的中断处理程序。不知道这么理解对不对。另外内核的系统调用,也需要stack和heap那么系统调用的stack和heap在那里?如果系统调用时发生中断,又是什么情况?
请高人指教。
|
是的,内核如果要访问用户空间,需要一些检查,保证页面在内存里。
|
1. 每次只需要在TSS中保存正在运行的进程的esp,当从用户态进入内核态时,esp就是task的内核态堆栈位置。其他的task的esp在(task里面?or thread_info,忘记了)
2. 对linux来说,中断只有一个级别,对于硬件来说,中断可能有多个级别。中断可以嵌套,中断发生时,用的是正在运行task的内核态stack,不会发生#GP,如1所说,在用户态进入内核态时,堆栈会被切换。另外,4K的内核态stack应该会有专用的exception堆栈,用于中断,所以在中断发生时,可能会切换到这个堆栈中。
3. 系统调用需要stack和heap能不能清晰说一说你指的是什么?
2. 对linux来说,中断只有一个级别,对于硬件来说,中断可能有多个级别。中断可以嵌套,中断发生时,用的是正在运行task的内核态stack,不会发生#GP,如1所说,在用户态进入内核态时,堆栈会被切换。另外,4K的内核态stack应该会有专用的exception堆栈,用于中断,所以在中断发生时,可能会切换到这个堆栈中。
3. 系统调用需要stack和heap能不能清晰说一说你指的是什么?
|
一个进程运行时,首先由分段机制将进程的逻辑地址转换成线性地址,大小为4G,对于用户空间来说为0-3G)。在进程描述符task struct中有个指向mm_struct的指针,mm_struct结构描述了进程的线性地址空间。进程的线性地址空间又根据其类型以及访问权限等特性分成很多个虚存区vm_area_struct{},进程的代码段数据段以及堆栈段等均以虚存区的形式表示。
进程创建的时候,OS会给每个进程分配一个进程描述符task struct,并将该数据结构保存在内核空间(3G-4G)与内核栈(进程由用户空间进入内核空间使用的湛)保存在一个8k大小的空间中。
线性地址经过分页机制转换成物理地址!
|
stack只有内核态和用户态之分,系统调用其实涉及了两个方面。在用户态的时候当然用的是用户态的stack,在内核态的时候会切换到内核态的stack。两者的分界点在一个int指令或者是sysentry指令(x86)。当用户态的程序执行这两条指令其中之一时,会切换到内核态stack。具体做法正是把task切换(调度)的时候,把内核态的esp保存为TSS的esp0,当进行system call的时候把TSS esp0放到esp寄存器中。当然,也要保存用户态的esp寄存器的值(这个我忘记了是保存在此时的内核态stack中还是硬件会自动保存),等到system call返回的时候需要恢复用户态的stack。
|
1。"系统中有不同特权级的中断处理程序"
好像PC上的linux 中断的优先级是一样的。
2。"如果系统调用时发生中断,又是什么情况"
好像不会发生系统调用事产生中断。因为系统调用是靠一个软中断来实现的。
以上两点,希望更明白的同好更明确的解释。我也可以再学习一下。
好像PC上的linux 中断的优先级是一样的。
2。"如果系统调用时发生中断,又是什么情况"
好像不会发生系统调用事产生中断。因为系统调用是靠一个软中断来实现的。
以上两点,希望更明白的同好更明确的解释。我也可以再学习一下。
|
在内核态下执行就会用内核堆栈
在用户态执行就用用户堆栈
如果在系统调用中发生中断 在中断完成之后 会根据不同的情况来决定是否重新调用改系统调用 还是直接从系统调用中返回
在用户态执行就用用户堆栈
如果在系统调用中发生中断 在中断完成之后 会根据不同的情况来决定是否重新调用改系统调用 还是直接从系统调用中返回
|
系统调用一般用软中断来实现。
内核的线程有heap和stack, 只是它们处于内核态,位于内核空间中。
应用程序运行后,进程会有自己的heap和stack.
内核的线程有heap和stack, 只是它们处于内核态,位于内核空间中。
应用程序运行后,进程会有自己的heap和stack.
|
有用户态api和内核态api之分。
|
正在学习中,不敢开口, 此帖注定技术含量高, 顶。
|
mark
|
学习~