Chinaunix首页 | 论坛 | 博客
  • 博客访问: 236822
  • 博文数量: 149
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1127
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-26 15:53
个人简介

喷泉之所以漂亮,是因为她有压力;瀑布之所以壮观,是因为她没退路。

文章分类

全部博文(149)

文章存档

2016年(25)

2015年(124)

我的朋友

分类: LINUX

2015-05-04 20:08:20

    内核的确是一头独一无二的猛兽:没有内存保护,没有靠得住的libc,小的堆栈,庞大的源码树。Linux内核遵循它自己的游戏规则,以大人物的架势运行,运行足够长的时间后才停止,打破了我们惯以为常的习俗。尽管如此,内核不外乎就是一个程序,它与我们司空见惯的程序没有多大区别。不必望而生畏:直面它、呼唤它、摆布它。

    意识到内核并不像乍看起来那样使人畏惧,这就是良好的开端。不过,要梦想成真,必须全身心地投入,阅读源码、剖析源码,并毫不气馁。

1.内核简介

用户界面是操作系统的外在表象,内核才是操作系统的内在核心。

内核有时候被称作是超级管理者或者是操作系统核心。

应用程序被称为通过系统调用在内核空间运行,而内核被称为运行于进程上下文中。

运行于内核空间,处于进程上下文,代表某个特定的进程执行。

运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。

运行于用户空间,执行用户进程。

Unix内核几乎毫无例外的都是一个不可分割的静态可执行块(文件)。

Linux是一个单内核。Linux内核运行在单独的内核地址空间 ,不过,Linux汲取了微内核的精华:其引以为豪的是模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力。


2.从内核出发

1)获取内核源码:

     linux内核官方网站:

    安装内核源代码:

tar xvjf linux-x.y.z.tar.bz2(压缩比例上有优势)

tar xvzf linux-x.y.z.tar.gz

    使用补丁:

     $ patch-p1 < ../patch-x.y.z(一般来说,一个给定版本的补丁都是打在前一个版本上)


2)内核源码树


3)编译内核

Makeflie是Makefile内核的基础,内核配置项要么是二选一,要么是三选一,驱动程序多支持三选一,可以以模块的方式编译。

内核配置的命令行工具推荐

make  menuconfig(适用于文本模式和图形界面模式的图形界面工具)

make xconfig(基于X11的图形工具)


另外命令

make deconfig(为你的体系结构创建一个默认的配置,据说是linus配置的)

make oldconfig(用旧的配置文件配置新的代码树)


减少编译的垃圾信息,在编译时只能看到错误和警告信息,可以采用下面的命令编译内核:

make>../some_other_file

make>/dev/null(把无用的信息扔入永无返回值的黑洞/dev/null)


衍生多个编译作业,改善内核编译时间,可以采用命令:
$ make -jn(n是要衍生的作业数,如make -j4)


把所有以编译的模块安装到正确的主目录/lib下,使用命令:

make modules install


4)内核开发的特点

内核开发与用户空间应用程序开发的区别:

>内核编程时不能访问C库

对内核来说,完整的C库太大了------即便是从中抽取一个合适的子集,大小和效率都不 能接受,但大部分常用的C库函数在内核中都已经得到了实现。比如说操作字符串的函数 组就位于lib/string.c文件中。只要包含头文件就可以使用它们。

>内核编程时必须使用GNU C

内核代码中所用到的C语言扩展中让感兴趣的那部分:内联函数,内联汇编,分支声明

>内核编程时缺乏像用户空间那样的内存保护机制

发生内核错误会导致oops,内核中的内存都不分页,每用掉一个字节,物理内存就减少一 个字节。

>内核编程时浮点数很难使用

不要在内核中使用浮点数

>容积小而固定的栈

>由于内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发

内核很容易产生竞争条件。和单线程的用户空间程序不同,内核的许多特性都要求能够并 发的访问共享数据,这就要求有同步机制保证不出现竞争条件,特别是:

* Linux是抢占多任务操作系统。内核的进程调度程序即兴对进程进行调度和重新调度。
内核必须对这些任务同步。
* Linux内核支持多处理器系统。所以,如果没有适当的保护,在两个或两个以上的处理
器上运行的代码很可能会同时访问共享的同一个资源。
* 中断是异步到来的,完全不顾及当前正在执行的代码。也就是说,如果不加以适当的保
护,中断完全有可能在代码访问共享资源的当间到来,这样,中段处理程序就有可能访问
同一资源。
* Linux内核可以抢占。所以,如果不加以适当的保护,内核中一段正在执行代码可能会
被另外一段代码抢占,从而有可能导致几段代码同时访问相同的资源。

常用的解决竞争的办法是自旋锁和信号量

>考虑可移植性的重要性

linux是一个可移植性的操作系统

阅读(550) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~