Linux内核

举报
yd_221104950 发表于 2020/12/05 00:52:25 2020/12/05
【摘要】 Linux内核是用C(GNU C)语言编写的。 没有保护机制 内核是没有内存保护机制的。就是说,如果一个用户程序试图进行一次非法的内存访问,尚且有内核在保护它,因为内核会发现这个错误,发关SIGSEGV信号,并结束整个进程。但是如果内核自己非法访问了内存,就没有人能保护它了。内核中就会发生内存错误会,导致oops(哎呀)错误。它哎呀一下,就马上死掉,根本不告诉你一声...

Linux内核是用C(GNU C)语言编写的。

没有保护机制

内核是没有内存保护机制的。就是说,如果一个用户程序试图进行一次非法的内存访问,尚且有内核在保护它,因为内核会发现这个错误,发关SIGSEGV信号,并结束整个进程。但是如果内核自己非法访问了内存,就没有人能保护它了。内核中就会发生内存错误会,导致oops(哎呀)错误。它哎呀一下,就马上死掉,根本不告诉你一声。所以在内核中不应该做访问非法的内存地址,或引用空指针之类的事情。
内核中的内存都不做分页。就是说每用掉一个字节,物理内存就减少一个字节。

没有libc库

内核不能链接使用标准C函数库,其他的库也不行。对内核来说,运行一个完整的C库或它的一个子集,效率都会大打折扣。

不要使用浮点数

在用户空间的进程内进行浮点数操作时,内核会完成从整数操作到浮点数操作的模式转换。内核不能调用C函数库的函数,另外内核自身也不能陷入,再说做浮点数操作与CPU的架构有关,要做的工作也很多,假如在内核中做浮点数操作,将会牺牲运行效率。所以最好的方式就是不要在内核中做浮点数操作了。

内核栈小且固定

用户空间的程序可以从栈上分配大量的空间来存放变量,因为用户空间的栈本身比较大,还可以动态地增长。
内核栈的准确大小是随体系结构而变的。如在x86上,栈的大小在编译时就配置好,可以是4KB或8KB。内核栈一般是两页,32位机上是8KB,64位机上是16KB,这都是固定不变的,而且每个处理器都有自己的栈。

内核支持异步中断、抢占、SMP

内核的许多特性都要求能够并发地访问共享数据,这就要有同步机制来保证不出现竞争条件。

  • Linux是抢占多任务操作系统:调度程序会对进程进行调度和重新调度
  • Linux内核支持对称多处理器系统(SMP),要有适当的保护,否则两个或两个以上的处理器上执行的内核代码很可能会同时访问共享的同一个资源。
  • 中断是异步到来的。如果没有适当的保护,中断完全有可能在代码访问资源的时候到来,这样一来,中断处理程序有可能访问同一资源。
  • Linux内核可以抢占,如果没有适当的保护,内核中一段正在执行的代码可能会被另外一段代码 抢占,从而有可能导致几段代码 同时访问相同的资源。

移植性

在进行内核代码开发时,所写的大部分C代码应该与体系结构无关,这样才可以在更多的不同体系结构的计算机上运行Linux。

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/90748868

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。