用户空间与内核空间(模块与应用程序)

用户空间与内核空间

         现代的计算机体系结构中存储管理通常都包含保护机制。提供保护的目的,是要避免系统中的一个任务访问属于另外的或属于操作系统的存储区域。如在IntelX86体系中,就提供了特权级这种保护机制,通过特权级别的区别来限制对存储区域的访问。基于这种构架,Linux操作系统对自身进行了划分:一部分核心软件独立于普通应用程序,运行在较高的特权级别上,(Linux使用Intel体系的特权级3来运行内核。)它们驻留在被保护的内存空间上,拥有访问硬件设备的所有权限,Linux将此称为内核空间。

       相对的,其它部分被作为应用程序在用户空间执行。它们只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,不能直接访问硬件,不能直接访问内核空间,当然还有其他一些具体的使用限制。(Linux使用Intel体系的特权级0来运行用户程序。)

 

 

  内核模块与应用程序

          内核模块是一些可以让操作系统内核在需要时载入和执行的代码,这同样意味着它可以在不需要时有操作系统卸载。它们扩展了操作系统内核的功能却不需要重新启动系统。举例子来说,其中一种内核模块是设备驱动程序模块,它们用来让操作系统正确识别,使用安装在系统上的硬件设备。

        如果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜像来加入新的功能。

   (1)用户程序通常从函数main()开始,执行一系列的指令并且当指令执行完成后结束程序。内核模块有一点不同。内核模块要么从函数init_module 或是你用宏module_init指定的函数调用开始。这就是内核模块的入口函数。它告诉内核模块提供那些功能扩展并且让内核准备好在需要时调用它。当它完成这些后,该函数就执行结束了。模块在被内核调用前也什么都不做。

   

所有的模块或是调用cleanup_module或是你用宏 module_exit指定的函数。这是模块的退出函数。它撤消入口函数所做的一切。 例如注销入口函数所注册的功能。 所有的模块都必须有入口函数和退出函数。

 

(2)应用程序可以调用它未定义的函数,因为在连接过程能够解析外部引用从而使用适当的函数库;模块仅仅被连接到内核,因此它仅能调用有内核导出的函数(如printk),而没有任何可连接的库。

 

(3)应用程序开发过程中的段错误是无害的,并且总是可以使用调试器跟踪到源代码中的问题所在;内核模块的一个错误即使不对整个系统是致命的,也至少会对当前进程造成致命错误。

(4)应用程序运行于用户空间,处理器禁止其对硬件的直接访问以及对内存的未授权访问;内核模块运行于内核空间,可以进行所有操作。

(5)应用程序一般不必担心发生其他情况而改变它的运行环境;内核模块编程则必须考虑并发问题的处理。

 

 

 

你可能感兴趣的:(用户空间与内核空间(模块与应用程序))