用户空间和内核空间

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Sophisticated_/article/details/82998028

内核模块和应用程序的对比

应用程序是从头到尾执行单个任务。 模块只是预先注册自己以便服务于将来的某个请求,,模块初始化函数的任务就是为以后调用模块函数预先做准备,就像模块说:“我在这,并且我能做这些工作。”模块的退出函数将在模块被卸载前调用,他告诉内核:“我要离开了,不要再让我做任何事了。”

应用程序在退出时,可以不管资源的释放或其他清除工作,但模块的退出函数必须仔细撤销初始化函数所做的一切。

应用程序可以调用它并未定义的函数,这是因为连接过程能够解析外部引用从而使用适当的函数库。而模块仅仅被链接到内核,因此它能调用的函数仅仅是由内核导出的那些函数,不存在任何可链接的函数库。

应用程序开发过程的段错误是无害的,并且总是可以使用调试器跟踪到源码中的问题所在,而一个内核错误即使不影响整个系统,也至少会杀死当前进程。

内核空间和用户空间

内核运行在最高级别,应用程序运行在最低级别(即用户态),在用户态,处理器控制着对硬件的直接访问以及对内存的非授权访问。
每个模式都有自己的内存映射,也即自己的地址空间。
每当应用程序执行系统调用或被硬件中断挂起,unix将执行模式从用户空间切换到内核空间。执行系统调用的内核代码运行在进程上下文中,它代表调用进程执行操作,因此能够访问进程地址空间的所有数据。

在用户空间编写驱动程序

用户空间驱动程序的优点:

  1. 可以和整个C库链接。
  2. 可以使用通常的调试器调试驱动程序代码,不用费力的调试正在运行的内核。
  3. 用户空间驱动程序被挂起,简单的杀掉就行了。
  4. 和内核内存不同,用户内存可以换出,驱动程序很大但不经常使用,不会占用太多内存。
  5. 良好的驱动程序仍支持对设备的并发访问。

用户空间驱动程序的缺点:

  1. 中断在用户空间不可用。
  2. 只有用过mmap映射/dev/mem才能直接访问内存。
  3. 只有在调用ioperm过iopl后才能访问I/O端口
  4. 响应时间慢。在客户端和硬件直接传递数据需要上下文的切换。
  5. 如果驱动程序被换出到磁盘,响应时间会难以忍受。
  6. 用户空间不能处理非常重要的设备,包括网络接口和块设备。

猜你喜欢

转载自blog.csdn.net/Sophisticated_/article/details/82998028