应用程序和内核模块的区别及中断

应用程序和内核模块的区别及中断,第1张

(1)应用程序基本上是从头到尾执行单个任务,而模块却需要事先向系统注册自己以便为将来的请求服务,并且模块有自己的模块初始化函数和模块退出函数。

(2)不是所有的应用程序都是事件驱动的,但内核模块却是,应用模块在退出时,可以不需要释放自己之前申请的资源或者其他的清除工作,但模块的退出却需要使用模块退出函数来仔细撤销初始化函数所做的一切,否则在系统重新引导之前某些东西就会残留在系统中。

(3)应用程序可以调用用户未定义的函数,但这个函数在某个库中,在链接过程中,编译器能够解析外部引用从而使用适当的函数库来调用这个函数,例如,定义在libc中的printf函数就是这种可直接调用的函数,但对于内核模块来说,模块仅仅被链接到内核中,只能调用由内核定义导出的函数,如printk就是由内核提供给模块使用的一个类printf的内核版本,故而模块源文件中不能包含通常的头文件。另外,printf和printk最大的不同在于printk缺乏对浮点数的支持。

(4)还有一点不同在于不同环境下二者处理错误的方式不同,对于应用程序,在开发过程中发生段错误是无害的,可以使用调试器跟踪到源代码问题所在,但内核错误即使不影响整个系统,也至少会杀死当前进程。

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。

内核态与用户态是 *** 作系统的两种运行级别,跟intel cpu没有必然的联系,intel

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

至于说保护模式,是说通过内存页表 *** 作等机制,保证进程间的地址空间不会互相冲突,一个进程的 *** 作不会修改另一个进程的地址空间中的数据。

在内核态下,CPU可执行任何指令,在用户态下CPU只能执行非特权指令。当CPU处于内核态,可以随意进入用户态;而当CPU处于用户态,只能通过中断的方式进入内核态。一般程序一开始都是运行于用户态,当程序需要使用系统资源时,就必须通过调用软中断进入内核态

以上就是关于应用程序和内核模块的区别及中断全部的内容,包括:应用程序和内核模块的区别及中断、内核态程序和用户态程序的区别、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9461443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存