1. Unix历史:
1969年贝尔实验室设计了一个文件系统原型,最终演化成了unix。
1973年unix被c语言重写。
具有影响力的unix进一步开发组织:加州大学伯克利分校BSD。发展到了今天的Darwin,Droaonfly BSD,FreeBSD,NetBSD和OpenBSD。
2. Linux历史:
1991芬兰大学生linus自己编写一个不成熟但五脏俱全的unix,它克隆了unix,但不是unix,它没有直接应用unix的源代码。
3. 内核组成:
3.1 中断服务程序
响应中断
3.2 进程调度程序
管理多个进程分享处理机
3.3 内存管理
管理进程地址空间
3.4 网络和进程间通信等系统服务
4. 处理器在任何时间点上的活动范围:
运行于内核空间:处于进程上下文,代表某个特定进程的执行。
运行于用户空间:处于中断上下文,与任何进程无关,代表处理特定的中断。
运行于用户空间:执行用户进程。
5. 获取内核:
解压:tar xvjf linux-x.y.z.tar.bz2
或者tar xvzf linux-x.y.z.tar.gz
内核一般都在/usr/src/linux下,但是注意不能以root身份对其进行修改,即使在安装新内核时,/usr/src/linux目录下都应该原封不动。
6. 使用补丁:
Patch -pl < ../patch-x.y.z
7. 内核源码树
8. 编译内核:
Make config
遍历所有配置项,要求用户选择。时间很长。
Make menuconfig
利用基于ncurse的图形界面工具
Make xconfig
基于X11的图形工具
Make gconfig
基于gtk+图形界面
Make defconfig
根据自己的体系结构创建默认的配置,生成在config文件中,而且你可以直接更改它。
Make才是真正执行编译的命令。
9. 衍生多个编译作业
Make -jn
衍生n个作业。改善内核编译时间。
10. 内核安装
Make modules_install
11. 内核开发的特点
没有c库
只能用GUN C
没有内存保护机制
浮点数很难使用
注重可移植性
只有一个很小的定长堆栈
支持异步终端,抢占和SMP,注意同步和并发
11.1 没有libc库
像没有外部库一样,内核代码中没有外部头文件。所以类似printf()函数都不能用。但是有printk()函数可以用,并且他可以通过一个标志设置优先级,来决定在什么地方显示。如:
Printk(KERN_ERR,”this is an error./n”);
11.2 GUN C
允许有内联函数:static inline void play(int ball);
允许内联汇编
存在分支申明:在大多数分支结果都可以确定的时候,可以用如likely()和unlikely()对判断条件进行申明。这样的话可以大大提高性能。
如if(likely(foo))
{}
或者
If(unlikely(foo))
{}
11.3 没有内存保护机制
如果是用户程序进行了非法的内存访问,内核会发送SIGSEGV,并结束进程。但是内核自己出现了,就没有办法了。
11.4 小容量的内核栈
通常x86,32位机栈大小是8K,64位机是16K,而且固定不变。