第二章 从内核出发
主要内容:
Linux内核基本知识
- 获取源码
- 编译源码
- 安装新内核
- Linux内核程序开发特点
- 用户空间程序的区别
2.1 获取内核源码
2.1.1 使用git
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
git pull
2.1.2 安装内核源码
内核发布:
- GUN zip:tar xvzf linux-x.y.z.tar.gz
- bzip2:tar xvjf linux-x.y.z.tar.bz2
2.1.3 使用补丁
patch -p1 < ../patch-
x.y.z
2.2
内核源码树
目录 | 说明 |
arch | 特定体系结构的代码 |
block | 块设备I/O层 |
crypo | 加密API |
Documentation | 内核源码文档 |
drivers | 设备驱动程序 |
firmware | 使用某些驱动程序而需要的设备固件 |
fs | VFS和各种文件系统 |
include | 内核头文件 |
init | 内核引导和初始化 |
ipc | 进程间通信代码 |
kernel | 像调度程序这样的核心子系统 |
lib | 同样内核函数 |
mm | 内存管理子系统和VM |
net | 网络子系统 |
samples | 示例,示范代码 |
scripts | 编译内核所用的脚本 |
security | Linux 安全模块 |
sound | 语音子系统 |
usr | 早期用户空间代码(所谓的initramfs) |
tools | 在Linux开发中有用的工具 |
virt | 虚拟化基础结构 |
1 | 1 |
COPYING:内核许可证
CREDITS:内核开发者列表
MAINTAINERS:维护者列表
Makefile:内核Makefile
2.3编译内核
2.3.1 配置内核
(1)配置项:
- 2选一:YES NO
- 3选一:YES NO MODULE
(2)配置
make menuconfig
(3)编译
make
2.3.2 减少编译垃圾
make > ../detritus
make > /dev/null
2.3.3 衍生多个编译作业
make -jn
2.3.4 安装新内核
image
System.map
2.4 内核开发的特点
2.4.1 无
libc库抑或无标准头文件
(1)对于内核来说,哪怕是一个C库的子集都太大太低效。
(2)
大部分常用的C库函数在内核中都实现了,如操作字符串的函数组位于lib/string.c文件中。只要包含<linux/string.h>即可。
(3)
头文件
基本头文件在内核目录下的include中,<linux/inotify.h> –》 include/linux/inotify.h
体系结构相关的头文件在arch/arm/include/asm中,内核通过asm引用。
(4)printk()函数
把格式化好的字符串拷贝到内核日志缓冲区上。
syslog程序就可以通过读取该缓冲区来获取内核信息。
printk(KERN_ERR "THIS IS A ERROR \n");
2.4.2
GUN C
(1)Linux内核是用C语言写的。内核不完全符合ANSI C标准。
(2)内联函数:
函数会在调用的地方展开,消除函数调用和返回所带来的开销。
C99和GUN C都支持内联函数
什么时候用:对时间要求高,本身长度又比较短的函数定义为内联函数。
定义形式:static inline void wolf(),必须在使用前定义(一般在头文件中定义)。
(3)内联汇编
内核使用汇编+c实现,偏向体系结构底层或者时间要求高的用汇编实现。
(4)分支声明
likely() 、unlikely()
2.4.3 没有内存保护机制
(1)用户程序非法内存访问,内核会发现错误,发送SIGSEGV信号,并结束整个进程。
(2)内核错误会导致oops
2.4.4 不要在内核中使用浮点数
2.4.5 容积小而固定的栈
2.4.6 同步和并发
内核需要特性都要求能够并发的访问共享数据。要求存在同步机制不出现竞争条件:
2.4.7 可移植性的重要性
大部分C代码应该与体系结构无关
2.5 总结
内核拥有系统最高的管理权
补充学习:
(1)libc库
libc是S
tantard C Library的简称,它是符合ANSI C标准的
一个标准函数库
。libc库提供C语言中所使用的宏,类型的定义,字符串操作符,数学计算函数以及输入输出函数等。正如ANSI C是C语言的标准一样,libc只是一个函数库标准,每个操作系统都会按照该标准对标准库进行具体实现。通常我们所说的libc是特指某个操作系统的标准库,比如:
在Linux操作系统下所说的libc即glibc。glibc是类Unix操作系统中使用最广泛的libc库,它的全称是GNU C Library.
(2)syslog程序
syslog是Linux系统默认的日志守护进程
。默认的主配置文件和辅助配置文件分别是/etc/syslog.conf和/etc/sysconfig/syslog文件。通常,syslog 接受来自系统的各种功能的信息,每个信息都包括重要级。/etc/syslog.conf 文件通知 syslogd 如何根据设备和信息重要级别来报告信息。
(3)GUN C
GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。它在编写linux的时候自己制作了一个标准成为 GNU C标准。ANSI 美国国家标准协会,它对C做的标准ANSI C标准后来被国际标准协会接收成为 标准C 所以 ANSI C 和标准C是一个概念。
glibc和libc都是Linux下的C函数库,
libc是Linux下的ANSI C的函数库;
glibc是Linux下的GUN C的函数库;
ANSI C和GNU C有什么区别呢?
ANSI
C是基本的C语言函数库,包含了C语言最基本的库函数。
而GNU
C函数库是一种类似于第三方插件的东西,由于Linux是用C语言写的,所以Linux的一些操作是用C语言实现的,所以GUN组织开发了一个C语言的库.