打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
linux内核分析笔记----linux内核简介
操作系统的概念我就不细说了。
对于提供保护机制的现代操作来说,内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限,这种系统态和被保护起来的内存空间,统称为内核空间。相对的,应用程序在用户空间执行,它们只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,不能直接访问硬件,还有其他一些使用限制。当内核运行的时候,系统才进入内核空间。
应用程序通过系统调用和内核通信来运行。应用程序通常调用库函数----比如C库函数-----再由库函数通过系统调用界面让内核代其完成各种不同任务。在这种情况下,应用程序被称为通过系统调用在内核空间运行,而内核被称为运行于进程上下文中。
内核还要负责管理系统的硬件设备。当硬件设备想要和系统通信的时候,它首先要发出一个异步的中断信号去打断内核正在执行的工作,中断通常对应着一个中断号,内核通过这个中断号查讯相应的中断服务程序,并调用这个程序响应和处理中断。为了保证同步,内核可以停用中止---既可以停止所有的中断也可以有选择的停止某个中断号对应的中断。许多操作系统的中断服务程序都不在进程上下文中执行,它们在一个与所有进程都无关的,专门的中断上下文中运行。
Linux内核和Unix内核的比较这里就不说了,网上一大把,是不。
Linux内核版本(如2.6.32),第一个数字是主版本号;第二个数字是从版本号,偶数代表着稳定版,奇数代表着开发版;第三个是修订版本号;头两个数字在一起描述了内核系列。内核源代码通常安装在/usr/src/linux子目录中,最好别直接用这里的代码进行开发,因为你的C库通常是根据这个子目录下代码对应的版本进行链接的。
相对于用户空间内应用程序的开发,内核开发有很多不同于用户空间开发的特点。如下:
1.内核编程时不能访问C库.
原因:简单一点讲,就是先有鸡还是先有蛋的悖论,复杂一下就在于速度和大小。对于内核来说,完整的C库太大了,即便是从中抽取一个合适的子集,大小和效率也是不能接受的。但也不用担心,大部分常用的C库函数在内核中都已经得到实现,只要包含相应的头文件就可以了,需要说明一点的是,这里说明的都文件,是指内核代码树中的内核头文件。内核代码中不能包含外部的头文件,因为它们无法调用外部的库函数。
2.内核编程时必须使用GUN C. Linux内核是用C语言编写的。让人略感惊讶的是,,内核并不完全符合ANSI C标准。实际上,只要有可能,内核开发者总是要使用到gcc提供的许多语言扩展部分。(gcc是多种GNU编译器的集合,它包含了可以用于编译内核的C编译器)。下面简要介绍下内核中所涉有的C语言扩展部分。
1)内敛函数(inline)
不用多说了,需要说的是,定义一个内核内敛函数的时候,你需要使用static作为关键字。使用static关键字,编译时不会为内敛函数单独建立一个函数体。
2)内敛汇编
gcc编译器支持在C函数中嵌入汇编指令,linux内核支持混合使用了C和汇编指令。
3)分支声明
对于条件选择语句,gcc内建了一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候,编译器可以根据这条指令对条件分支进行优化, 内核把这条指令封装成了宏,比如likely()和unlikely().这样使用起来比较方便。
例如,下面是一个条件选择语句:
if (foo){     如果想要标记中绝少发生的分支:if(unlikely(foo)){     反之为:    if(likely(foo)){
…                                                              ….                                         ….
}                                                            }                                           }
3.内核编程时缺乏像用户空间那样的内存保护机制.
如果一个用户程序试图进行一次非法的内存访问,内核会发现并结束它,但如果内核本身也这样做,那就没辙了。内核发生的内存错误会导致oops,这是内核中出现的最常见的一类错误。此外,内核中的内存也不分页,也就是说,你每用掉一个字节,物理内存就减少一个字节,所以,你想往内核里加入什么新功能的时候,物理内存就减少一个字节。
4.内核编程时浮点数很难使用.
和用户空间进程不同,内核并不能完美地支持浮点操作。在内核中使用浮点数时,除了要人工保存和恢复浮点寄存器,还有其他一些琐碎的事情要做,或者一句话:内核中,还是不要浮点运算了吧。
5.内核只有一个很小的定长堆栈.
内核栈既不大也不能动态增长,它很小且长度固定。32位机的内核栈是8kB,而64位机是16kB.
6.由于内核支持异步中断,抢占和SMP,因此必须时刻注意同步和并发。
这主要是从下面几个方面考虑的:
1)Linux内核支持多处理器并发处理。
2)中断是异步到来的,完全不顾及当前正在执行的代码
3)Linux是可以抢占的
解决竞争的方法最常用的就是自旋锁和信号量。这个我们后面再说
7.要考虑可移植性的重要性.
应用程序很少考虑可移植的问题,但linux内核要是一个可移植的操作系统,并且一直要保持这种特点,因为你的系统要在各种不同的体系结构上运行。
编译内核的部分,我这里就不细说了,什么make menuconfig啦,安装内核啦,System.map文件啦,这个就是操作部分了,后面如果有时间我再细说,毕竟这不是linux内核思想的关键,是不?
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
个人对鸿蒙系统的看法
Nucleus Plus在嵌入式系统应用
嵌入式Linux系统及如何开发自己的嵌入式Linux系统
Linux系统下USB摄像头驱动开发
ARM与uClinux - ARM - EDN China 技术论坛 - 电子工程师的设计灵感之源
作为一个Linux新人,你必须知道的事
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服