第一章 Linux内核简介
一、Unix
Unix是一个强大、健壮和稳定的操作系统。
- 简洁
- 绝大部分东西都被当做文件对待。这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open(),read(),write(),lseek()和close()
- 出色的平台可移植性——内核和相关的系统工具软件用C语言编写而成
- 进程创建迅速
- 进程间通信原语简单稳定
Unix——支持抢占式多任务、多线程。虚拟内存、换页、动态链接和TCP/IP网络。
二、操作系统和内核简介
操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分。
- 内核
- 设备驱动程序
- 启动引导程序
- 命令行shell或者其他种类的用户界面
- 基本的文件管理工具和系统工具
内核独立于普通应用程序,一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。
这种系统态和被保护起来的内存空间,统称为内核空间。
在系统中运行的应用程序通过系统调用来与内核通信。
应用程序完成其工作的基本行为方式是:
应用程序通过系统调用界面陷入内核。
处理器的活动必然其下三者之一:
- 运行于用户空间,执行用户进程
- 运行于内核空间,处于进程上下文,代表某个特定的进程执行
- 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断
三、Linux内核版本
Linux内核有两种,稳定的和处于开发中的。
从版本号如果是偶数,就是稳定版,如果是奇数,就是开发版。
第二章 从内核出发
一、获取内核源码
课本中给出的方式是使用git,git的使用方法在上学期就曾经学习过,所以这里列出代码:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
git pull # 更新分支到Linux的最新分支
安装:
tar xvjf linux-x.y.z.tar.bz2
或者
tar xvzf linux-x.y.z.tar.gz
※ 如果使用git获取就不需要下载压缩文件。
※/usr/src/linux目录应当保证原封不动。
打补丁:
patch -p1 < ../patch-x.y.z
二、内核源码树
这一段与笔记中互为印证。
三、编译内核
1.配置内核
-
字符页面的命令行工具:
make config
-
图形界面工具
make menuconfig
配置项的二选一和三选一:
二选一:yes 或者 no
三选一:yes 或者 no 或者 module(以模块生成)
其他的几种配置:
make defconfig //基于默认配置
make oldconfig //验证和更新配置
2.编译内核
make
减少编译的垃圾信息?对输出进行重定向。
make > .. /detritus # 重定向到这个文件里了
make > /dev/null # 把无用的输出信息重定向到永无返回值的黑洞里。
衍生多个编译作业?
make jn # n是衍生出的作业数,每个处理器可以衍生出1或2个作业,16核时n可取32.
3.安装新内核
make modules_install
System.map这个文件是一份符号对照表
四、内核开发的特点
- 内核开发时既不能访问C库也不能访问标准的C头文件
应对:include/linux文件夹中包含了所需的内核头文件。 - 内核编程时必须使用GNU C
-
内联函数:
函数会在所调用的位置上展开。
定义时,需要使用static作为关键字,用inline限定它。
内联函数必须在使用之前就定义好,一般在头文件中定义。
内核中优先使用内联函数而不是宏。 -
内联汇编:
通常使用asm()指令嵌入汇编代码,用volatile表示不优化 -
分支声明:
unlikely(x) - x很少出现,绝少发生,通常为假
likely(y) - y经常出现,通常为真
-
- 内核编程时缺乏像用户空间那样的内存保护机制
内核中内存不分页。 - 内核编程时难以执行浮点运算
- 内核给每个进程只有一个很小的定长堆栈
- 由于内核支持异步中断、抢占和SMP,必须时刻注意同步和并发
SMP:对称多处理系统。
常用的解决竞争的方法:自旋锁和信号量。 - 要考虑可移植性的重要性
诸如保持字节序,64位对其,不假定字长和页面长度等。
总之
课本上的内容与视频中、老师上课讲述内容有所重复也有所补充,并且配合曾经学习过的知识一同学习,事半功倍。