linux启动时怎么选择新旧内核?
1是手动选择在开机时候按方上下方向键界面会停留在选择内核的界面2自动选择系统默认会选择最新安装的内核.如果要更改默认使用的内核则修改配置文件/boot/grub/menu.lst(直接修改grub.conf同样可行)下default默认为0是表示第一个菜单选项(开机时的内核选择菜单),改为1就是使用第二个菜单项了。timeout表示菜单等待时间,单位为秒。
linux内核态和用户态的区别?
主要区别:是代码执行的层级;性能损失来源于缓冲区的复制。
首先内核态和用户态的堆和栈是不一样的,所以必然会发生寄存器状态的切换,其实单纯切换寄存器影响倒不是特别大,大概就是会影响 CPU 方面的一些比如指令流水,分支预测等
最大的问题是用户态程序发生系统调用相当于把控制权交给内核,内核甚至会剥夺当前进程的执行,去执行另一个进程,那这个时候要发生 TLB flush,这个对性能影响非常大不说,整个进程的执行都会停止
核心态用户态切换到内核态的方式有哪些?
(1) 系统调用这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
(2) 异常当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
(3) 外围设备的中断当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。
具体的切换步骤:
① 从当前进程的描述符中提取其内核栈的ss0及esp0信息。
②使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令。
③ 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。