1.内核调试手段

  1.printk打印内核状态

  2.产生opps时使用GDB查看调用栈

2.内核空间和用户空间区别,通信方式有哪些?

  Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。

  通信方式:到目前Linux提供了9种机制完成内核与用户空间的数据交换,分别是内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs,其中模块参数与sysfs、procfs、debugfs、relayfs是基于文件系统的通信机制,用于内核空间向用户空间输出信息;sysctl、系统调用是由用户空间发起的通信机制。由此可见,以上均为单工通信机制,在内核空间与用户空间的双向互动数据交换上略显不足。Netlink是基于socket的通信机制,由于socket本身的双共性、突发性、不阻塞特点,因此能够很好的满足内核与用户空间小量数据的及时交互,因此在Linux 2.6内核中广泛使用,例如SELinux,Linux系统的防火墙分为内核态的netfilter和用户态的iptables,netfilter与iptables的数据交换就是通过Netlink机制完成。

3.用户态和内核态区别,如何从用户态切换到内核态?

  用户态和内核态是系统运行的两个级别,主要用于系统的保护作用,他们和CPU没有必然联系。Intel cup提供了Ring0-Ring3四种运行级别,Ring0最高Ring3最低。Linux使用Ring0运行内核态Ring3运行用户态。

  Ring3状态不能访问Ring0的地址空间,包括代码和数据。Linux进程的4GB地址空间,3G-4G部 分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据。用户运行一个程序,该程序所创建的进程开始是运 行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过read、write、rcv、snd等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必 须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能 随意操作内核地址空间,具有一定的安全保护作用。

  用户态切换到内核态3种方式:

  1. 系统调用:

    用户态主动切换到内核态的一种方式,主要通过系统调用函数将进程切换到内核态执行,如:fork、read、write、ioctl等。

  2. 异常

    当程序运行在用户态时,系统发生了某种未知异常,系统将程序切换到处理此异常的内核态程序中,如:缺页异常

  3. 外围设备中断

    注册过中断的外围设备,当完成程序赋予的任务后会向系统发送中断信号。此时CPU将停止执行下一条语句转而进行跳转执行中断处理程序,此时系统就陷入了内核态。

最新文章

  1. poj 3280 Cheapest Palindrome
  2. MySQL 事务
  3. [转]Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能
  4. error MSB6006: “cmd.exe”已退出,代码为 3。
  5. maven继承parent,relativePath warn信息的解决办法
  6. Wall Street English
  7. 【LeetCode】139 - Word Break
  8. qwebkit - Open new window after click using QT - Stack Overflow
  9. Zend Server更新至6.2版本——虚拟主机全方位管理
  10. spring使用redis做缓存
  11. js的异步加载你真的懂吗
  12. margin-top的兼容问题
  13. Player 播放器开源项目总结
  14. Liunx百宝箱(Centos补充)
  15. Zabbix安装 Grafana安装
  16. error C3861: “xxxx”: 找不到标识符
  17. zookeeper选举状态介绍 摘自https://cloud.tencent.com/developer/news/303891
  18. golang sync.Pool包的使用和一些注意地方
  19. C语言学习笔记 (004) - 数组名和数组首地址(转)
  20. vertical解锁table

热门文章

  1. 判断系统是否安装了flash插件
  2. H5+SDK
  3. OpenGL 学习总结
  4. System.IO.Path 文件名、路径、扩展名处理
  5. linux 杂七杂八
  6. 力扣算法——133.CloneGraph【M】
  7. 搭建RAID10(5块硬盘)过程并模拟其中一块硬盘损坏
  8. Axon 3.0.x 框架简介官方文档
  9. redis zset 介绍
  10. leetcode.数组.565数组嵌套-Java