第一章 Linux内核简介
(一)Unix是一个强大、健壮和稳定的操作系统,特点是:
- Unix很简洁,仅仅提供几个几百个系统调用并且有一个非常明确的设计目的
- 在Unix中,所有的东西都被当作文件对待,通过一套相同的系统调用接口来进行:open(),read(),write(),lseek(),close()
- Unix的内核和相关的系统工具软件是用C语言编写而成
- Unix的进程创建非常迅速
- Unix系统具备清晰的层次化结构
(二)操作系统和内核简介:操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分。
- 内核是管理者或者是操作系统核心
- 在系统中运行的应用程序通过系统调用来与内核通信
- 内核还要负责管理系统的硬件设备
(三)处理器在任何指定时间点上的活动范围可以概括为下列三者之一:
- 运行于用户空间,执行用户进程
- 运行于内核空间,处于进程上下文,代表某个特定的进程执行
- 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断
(四)Linux内核和传统UNIX内核特点的比较(Linux是一个单内核)
- Linux支持动态加载内核模块
- Linux支持对称多处理(SMP)机制
- Linux内核可以抢占
- Linux内核并不区分线程和其他的一般进程
(五)Linux内核版本
版本号是偶数,稳定版;版本号是奇数,开发版
第二章 从内核出发
(一)获取内核源码
1. Git是一种开源的分布式版本控制工具。git可以下载和管理Linux的源代码
获取最新提交到
Linux版本树的一个副本
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
下载代码后,更新到最新分支
$ git pull
2.安装内核源代码
如果压缩形式为bzip2:$ tar xvjf linux-x.y.z.tar.bz2
如果压缩形式为zip:$ tar xvzf linux-x.y.z.tar.gz
3. 使用补丁:$ patch -p1 < ../patch-x,y,z
(二)内核源码结构的根目录及其子目录
目 录 | 描 述 |
---|---|
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.配置内核
基于字符页面的命令行工具 make config
基于图形界面工具 make menuconfig
基于默认配置 make defconfig
验证和更新配置 make oldconfig
-
Makefile:根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码链接到一起,最终形成 Linux 内核二进制文件。
-
config.in:内核配置文件,给用户提供配置选择的功能。
-
.config:用户用来存放内核配置后结果的文件。
-
make:默认的Makefile自动化编译。
2. 减少垃圾信息
$ make > ../detritus #将错误报告和警告信息重定向到文件中
$ make > /dev/null #将无用的输出信息重定向到/dev/null中
-
/dev/null:空设备,输入的信息直接丢弃
3.衍生多个编译作业
make程序能把编译过程拆分成多个并行的作业。其中每个作业独立并发地运行,有助于加快多处理器系统上的编译过程,也有利于改善处理器的利用率。默认情况下,make只衍生一个作业。
$ make -jn #以多个作业编译内核,- j:指定同时执行多任务,- n:要衍生出的作业数
4. 安装新内核
make modules_install #把所有已编译的模块安装到正确的主目录/lib/modules下
System.map文件:编译时在内核代码树的根目录下创建的符号对照表,
用来将内核符号与它们的起始地址对应起来。
(四)Linux内核开发的的特点
(1) Linux内核编成时不能访问C库
(2) Linux内核编程时必须使用GNU C
(3) Linux内核编程时缺乏像用户空间那样的内存保护机制
(4) Linux内核编程时浮点数很难使用
(5) 内核只有一个很小的定长堆栈
(6) 由于内核支持异步中断、抢占式和SMP,因此必须时刻注意同步和并发
(7) 要考虑可移植性的重要性
学习体会
本次学习了LINUX内核的一些基本常识,从何处获取源码,如何编译,如何安装内核。。。。。。。。
参考资料:
(1)《Linux内核设计与实现》课本一二章
(2)http://www.cnblogs.com/hyq20135317/p/5277142.html 博客