《Linux内核设计与实现》笔记——内核编译过程以及内核编程特点

内核编译的过程

1. 下载内核源代码树 解压至/usr/src
# tar xf linux-3.13.5.tar.xz -C /usr/src
# ln -sv /usr/src/linux-3.13.5 /usr/src/linux
2. 内核配置 配置文件保存在内核源码根目录下.config文件中
make oldconfig 备份当前.config文件为.config.old
make config在命令行下,逐项配置
make menuconfig在图形化界面配置
make defconfig 基于默认的配置为使用的体系结构创建配置
3. 编译内核
make或者make -jN 衍生N个编译任务进行编译
make > /dev/null将输出重定向
4. 安装模块
make modules_install
把已经编译的模块安装到正确的主目录 /lib/modules下
5. 编译安装 make install
/boot/ 目录下会生成vmlinuz-ver,
System.map-ver(符号对照表,将内核符号和地址对应)
/boot/grub/grub.conf 文件中会增加新内核的启动项
6.重启,选择新内核即可

内核编程特点:

无libc或标准头文件。

基本头文件/include
#include,位于 /include/linux/inotify
体系结构相关头文件 /arch//include/asm
#include于/arch/x86/include/asm/ioctl.h

libc中的函数实现大多调用系统调用,应用从用户空间通过系统调用陷入内核空间,如果从内核中调用了libc库中的函数,可能会发生从”内核陷入到内核”,这可能造成系统的不稳定,崩溃等潜在问题。

没有内存保护

内核中内存错误会导致oops,内核内存不分页

不能轻易使用浮点数

执行浮点指令需要捕获陷阱,着手整数到浮点数的转换,操作繁琐
容量小且固定的内核栈

同步和并发

内核容易产生竞争条件,linux是抢占式的多任务系统;支持SMP,两个处理器同时执行代码,使用同一个资源;中断的到达是异步的

可移植性更加重要

1、字长和数据类型
2、数据对齐
3、字节顺序
4、时间、页长度
5、处理器排序、SMP、内核抢占、高端内存等考虑。

使用GNU C

使用了许多GNU C 编译器的特性,内联汇编,内联函数,分支声明等

第18章 调试

1、 打印调试 printk() 18个等级
klogd从记录缓冲区获取内核信息,再通过syslogd保存到系统日志文件中。
2、 OOPS
OOPS是内核告知用户有不幸发生的最常用方式,产生的原因可以是内存访问越界、非法指令等,OOPS能够回溯导致错误发生的函数调用链。
3、探测系统
用UID作为选择条件
if (current->uid != 7777)
{ /* 原先的代码 */ }
else { /* 新的特性 */ }
使用条件变量
设置一些条件变量来控制内核是否执行某段代码.
使用统计量
实现思路就是在内核中的设置一个全局变量, 比如 my_count, 当内核执行到某段代码时, 给 my_count + 1 就行.同时还要将 my_count 打印出来(可以用printk), 便于随时查看它的值.
使用频率限制(限制错误输出数量)

你可能感兴趣的:(操作系统)