UNIX内核(5):内核开发的特点

原文转自:http://blog.chinaunix.net/uid-7471615-id-83765.html

内核开发不是洪水猛兽。一旦你了解到其中的规则,你就会发现,跟开发应用程序一样;两者区别在于要遵守的规则集合不一样。

Linux是UNIX家族的一员,而且其内核源代码唾手可得,因此这里用其来作说明。

规则上,与应用程序(运行于用户空间)的开发不同,主要表现在:

  1. 没有C库
  2. 用GNU C编程(对于Linux内核而言)
  3. 没有内存保护
  4. 在内核中很难使用浮点数
  5. 内核栈大小固定且很小
  6. 由于异步中断、抢占以及支持SMP,需要额外小心同步和并发
  7. 移植性问题

下面就来逐个解释。

内核没有链接任何C库。这里面涉及到很多问题,比如鸡生蛋还是蛋生鸡的问题:因为C库都会包裹一些系统调用,可是没有内核时就没有系统调用,那么……呵呵,明白了吧?另一个问题就是大小问题。任何一个C库,甚至其一个子集,对于内核来说都太大了。不过,不要着急,很多常用的库函数在内核中都有实现。

这里面涉及到一个著名的函数:printf(),内核提供了一个替代品:printk()。如果你要做内核开发,就会频繁使用该函数。记住:Linus本人不允许在内核中嵌入调试器(这是另外的话题,有兴趣的可以自己去google一下),因此很多情况下要依靠printk()。

毫无疑问,Linux的内核是用C语言写的。但所用的C并不是ANSI C,而是经过GNU扩展之后的C,这就是为什么Linux内核对于gcc编译器的依赖程度如此之高。GNU对C的扩展中就包括:内联函数(inline functions),分支预测和内联汇编(inline assembly)。分支预测用于判断哪些情况是几乎永远不可能发生的,或者哪些情况几乎永远都会发生——unlikely()和likely()。

当用户空间的代码访问非法地址时,内核能够捕获该错误,然后向进程发送SIGSEGV并终止进程。在UNIX世界,人们总是说kill/杀掉进程,其实,kill仅仅是用来向进程发送信号的,并不是杀掉它——太残忍了。这是题外话了,呵呵。那么,当内核代码访问非法地址时,谁来照顾内核呢?只能自己照顾自己了。非法的地址访问将导致oops,这是重大的问题,没人会告诉你访问了非法地址,但是你可以通过日志来查询/调试。

另外,内核内存是不分页,因此你没申请一个字节,物理内存就少掉一个字节。小心了!

在内核中使用浮点数非常困难,如果你想给自己找麻烦的话,可以试试。用户空间代码要使用浮点数指令时,一般来说会产生一个中断,内核捕获该中断并作相应的处理。然而,内核没法捕获自己。而且,要使用浮点指令,不但要保存浮点寄存器,还要做很多繁琐的事情——光看看内核如何为用户空间代码使用浮点数就知道了,可以参考进程调度里的上下文切换。

用户空间的程序可以在栈上申请大量的空间——定义足够多的局部变量,因为用户空间的栈非常大,而且可以动态增长。不过有些不够智能的系统做不到动态增长。然而,内核的栈非常小,而且无法动态增长。

作为一个抢占式多任务、支持对称多处理(SMP)的系统,同步和并发是任何一个内核hacker都需要时时刻刻小心的问题。调度器“兴之所至”,调度进程,这就需要同步;加上来自CPU外的各种中断导致内核需要对某些代码或数据加以保护。而抢占的意思就是,无论谁占用了CPU,都有可能被其他进程抢掉,内核也不例外。Linux对于竞态条件提供了spinlock(自旋锁)和semaphore(信号量)。

最后就是移植性问题。这个问题从来都不见简单,而且linux的目标是多种平台都能运行,因此移植性显得更为重要。字节序问题就是一个典型的移植性问题。然而,应用程序可能仅仅为一个平台开发。

看了这些,是不是觉得,其实内核开发也不难呢?

有雄心的hacker们,不要被OS kernel这个名词吓倒。看看Linux Kernel Development,准备好Linux内核源码,沏上一杯茶,然后你就可以开发内核了!

参考:

Linux Kernel Development, 2nd edition, by Robert Love

Copyleft (C) 2007 raof01. 本文可以用于除商业用途外的所有用途。若要用于商业用途,请与作者联系。

时间: 2024-12-23 06:28:09

UNIX内核(5):内核开发的特点的相关文章

《Linux设备驱动开发详解 A》一一第3章Linux内核及内核编程

第3章Linux内核及内核编程 本章导读本章有助于读者打下Linux驱动编程的软件基础.由于Linux驱动编程的本质属于Linux内核编程,因此我们有必要熟悉Linux内核及内核编程的基础知识.3.1-3.2节讲解了Linux内核的演变及新版Linux 内核的特点.3.3节分析了Linux内核源代码目录结构和Linux内核的组成部分及其关系,并对Linux的用户空间和内核空间进行了说明.3.4节讲述了Linux内核的编译及内核的引导过程.除此之外,还描述了在Linux内核中新增程序的方法,驱动工

linux内核驱动-内核初涉

  一.为什么要学习内核? 有些人要学习内核,而有些人则可以不学习它.你如果以后要从事系统研发或驱动开发的话,就要学习内核. 刚刚接触内核,主要学习内核的接口函数.不要深入的去读内核,因为你读也读不懂,内核代码庞大如野兽一般不可驾驭. 学习内核主要掌握层次学习法,即从头开始学习,一环紧扣一环. 内核学习的四步学习法:1.核心理论学习-概念与函数原型2.范例程序分析3.思维导图设计4.亲自编写代码 二.linux内核简介 1.linux体系结构 分为两部分:用户空间和内核空间 2.linux为什么

Linux编译内核,内核源码在哪里?

Linux编译内核,内核源码在哪里? 1.一般在发行版的盘里都有,比如 RedHat,一般在第二.第三张上 2.4 内核的叫 kernel-source-2.4.xx-xx.rpm2.6 内核的叫 kernel-devel-2.6.xx-xx.rpm 2.去www.kernel.org 下载一份你喜欢的内核版本,重新编译安装也可以.

移植linux内核到S3C2410开发板的问题...

问题: 内核配置时使用smdk2410的默认配置. U盘不能挂载!   插拔U盘提示信息为: $ usb 1-1: USB disconnect, address 2 usb 1-1: new full speed USB device using s3c2410-ohci and address 3 usb 1-1: configuration #1 chosen from 1 choice   办法: 重新配置内核 配置USB设备支持 General setup ---> [*] Confi

Linux0.11内核剖析--内核体系结构

一个完整可用的操作系统主要由 4 部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如下图所示: 用户应用程序是指那些字处理程序. Internet 浏览器程序或用户自行编制的各种应用程序: 操作系统服务程序是指那些向用户所提供的服务被看作是操作系统的部分功能的程序. 在 Linux 操作系统上,这些程序包括 X 窗口系统. shell 命令解释系统以及那些内核编程接口等系统程序:操作系统内核程序即是本书所感兴趣的部分,它主要用于对硬件资源的抽象和访问调度. Linux 内核的主要用途就

Linux内核及内核缓冲区技术详解

Linux 内核简介 现在让我们从一个比较高的高度来审视一下 GNU/Linux 操作系统的体系结构.您可以从两个层次上来考虑操作系统,如图 2 所示. 图 2. GNU/Linux 操作系统的基本体系结构 最上面是用户(或应用程序)空间.这是用户应用程序执行的地方.用户空间之下是内核空间,Linux 内核正是位于这里. GNU C Library (glibc)也在这里.它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制.这点非常重要,因为内核和用户空间的应用程

Linux芯片级移植与底层驱动(基于3.7.4内核) 内核节拍

1.SoC Linux底层驱动的组成和现状 为了让Linux在一个全新的ARM SoC上运行,需要提供大量的底层支撑,如定时器节拍.中断控制器.SMP启动.CPU hotplug以及底层的GPIO.clock.pinctrl和DMA硬件的封装等.定时器节拍.中断控制器.SMP启动和CPU hotplug这几部分相对来说没有像早期GPIO.clock.pinctrl和DMA的实现那么杂乱,基本上有个固定的套路.定时器节拍为Linux基于时间片的调度机制以及内核和用户空间的定时器提供支撑,中断控制器

Linux0.11内核剖析--内核代码(kernel)--sched.c

1.概述 linux/kernel/目录下共包括 10 个 C 语言文件和 2 个汇编语言文件以及一个 kernel 下编译文件的管理配置文件 Makefile.其中三个子目录中代码注释的将放在后面的文章进行.本文主要对这 13 个代码文件进行注释. 首先我们对所有程序的基本功能进行概括性地总体介绍, 以便一开始就对这 12 个文件所实现的功能和它们之间的相互调用关系有个大致的了解,然后逐一对代码进行详细地注释. 本文地址:http://www.cnblogs.com/archimedes/p/

arm 内核-ARM内核,Cortex-A 系列,比较

问题描述 ARM内核,Cortex-A 系列,比较 想了解ARM的内核,Cortex-A 系列,比较他们的不同点和相同点. 解决方案 http://www.myir-tech.com/resource/448.asp

Mac OS X 内核Rootkit开发指南

1.引言  1.1 背景介绍          困 扰着不同操作系统的Rootkit已经由来已久,Linux,Windiws,还有各种类BSD等系统都受到了Rootkit的极大危害.目前广泛使用的 一类"内核Rootkit",是原来"文件转移Rootkit"的衍生和发展.这种发展趋势的必然性,来源于Rootkit和Osiris. Tripwire等安全软件之间的竞争--后者的出现使得Rootkit开发者不得不在内核空间中寻找更加隐秘的途径,以达到渗透和颠覆系统的目的