<<Linux内核设计与实现>>读书笔记(二)-内核开发的准备

来源:互联网 发布:美萍进销存软件客服 编辑:程序博客网 时间:2024/06/16 17:36

在尝试内核开发之前,需要对内核有个整体的了解.

主要内容

  • 获取内核源码
  • 内核源码的结构 
  • 编译内核的方法
  • 内核开发的特点

1.获取内核源码

内核是开源的,所以获取源码特别方便,参照以下的网址,可以通过git或者直接下载压缩好的源码包.

http://www.kernel.org

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 语音子系统 user 早期用户空间代码(所谓的initramfs) tools 在Linux开发中有用的工具 virt 虚拟化基础结构

3.编译内核的方法

还未实际尝试过手动编译内核,只是用yum更新过内核.这部分等以后手动编译过再补上.

安装新的内核后,重启会提示进入哪个内核.当多次安装新的内核后,启动列表会很长(因为有很多版本的内核),显得不是很方便.

下面就介绍3种删除那些不常用的内核的方法:(是如何安装的就选择相应的删除方法)

3.1 rpm删除法

  rpm -qa | grep kernel* (查找所有linux内核版本)
  rpm -e kernel-(想要删除的版本)

3.2 yum删除法

  yum remove kernel-(要删除的版本)

3.3 手动删除
  删除/lib/modules/目录下不需要的内核库文件
  删除/user/src/kernel/目录下不需要的内核源码
  删除/boot/目录下启动的核心档案和内核映像
  更改grub的配置,删除不需要的内核启动列表

4.内核开发的特点

4.1 无标准C库

为了保证内核的小和高效,内核开发中不能使用C标准库,所以连最常用的printf函数也没有,但是还好有个printk函数来代替.

4.2 使用GNU C,推荐使用gcc 4.4或以后的版本来编译内核

因为使用GNU C,所有内核中常使用GNU C中的一些扩展:

4.2.1 内联函数

内联函数在编译时会在它被调用的地方展开,减少了函数调用的开销,性能较好.但是,频繁的使用内联函数也会使代码变长,从而在运行时占用更多的内存.

所以内联函数使用时最好要满足以下几点:函数较小,会被反复调用,对程序的时间要求比较严格.

内联函数示例:static inline void sample();

4.2.2 内联编译

内联编译用于偏底层或对执行时间要求严格的地方,实例如下:

unsigned int low, high;asm volatile("rdtsc" : "=a" (low), "=d" (high));/* low 和 high 分别包含64位时间戳的低32位和高32位 */

4.2.3 分支声明

如何能事先判断一个if语句是经常为真还是经常为假,那么可以用unlikely和likely来优化这段判断的代码.

/* 如果error在绝大多数情况下为0(假) */if (unlikely(error)) {    /* ... */}/* 如果success在绝大多数情况下不为0(真) */if (likely(success)) {    /* ... */}

4.3 没有内存保护

因为内核是最底层的程序,所以如果内核访问的是非法内存,那么整个系统都会挂掉!!所以内核开发的风险比用户程序开发的风险要大.

而且,内核中的内存是不分页的,每用一个字节的内存,物理内存就少一个字节.所以内核中使用内存一定要谨慎.

4.4 不使用浮点数

内核不能完美的支持浮点操作,使用浮点数时,需要人工保存和恢复浮点寄存器及其他一些繁琐的操作.

4.5 内核栈容积小且固定

内核栈的大小是在/编译内核时决定的,对于不同的体系结构,内核栈的大小虽然不同,但都是固定的.

查看内核栈大小的方法:

ulimit -a | grep "stack size"

4.6 同步和并发

Linux是多用户的操作系统,所以必须处理好同步和并发操作,防止因竞争出现死锁.

4.7 可移植性

Linux内核可用于不同的体系结构,支持多种硬件.所以开发时要时刻注意可移植性,尽量使用体系结构无关的代码.

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家里竹子发黄了怎么办 水培莲叶子发黄怎么办 莲花叶子变黑了怎么办 庭院竹子黄叶子怎么办 水培竹子水发臭怎么办 没生根的富贵竹怎么办 床垫气味太重怎么办 艾灸后经期延长怎么办 花叶上长白点怎么办 经期20天不止怎么办 尤加利叶尖干了怎么办 水培竹子根发黄怎么办 水培的竹子发黄怎么办 鱼缸水草长黑毛怎么办 水草上长黑毛怎么办 鱼缸的水草长毛怎么办 鱼缸水草长白毛怎么办 被狐狸咬了怎么办 经常咳嗽有痰怎么办 嗓子痒经常咳嗽怎么办 冬季咳嗽老不好怎么办 孩子得喉炎咳嗽怎么办 夏天嗓子痒咳嗽怎么办 大人咳嗽老不好怎么办 孩子过敏咳嗽怎么办啊 过敏导致的咳嗽怎么办 奶水多营养不足怎么办 水培富贵竹叶尖发黄怎么办 水培富贵竹干尖怎么办 富贵竹叶子变黄了怎么办 富贵竹叶子变黄怎么办 富贵竹的叶子黄了怎么办 土栽富贵竹发黄怎么办 富贵竹的黄叶子怎么办 土培富贵竹发黄怎么办 富贵竹根变黄了怎么办 富贵竹叶子尖发黄怎么办 富贵竹新叶子发黄怎么办 富贵竹杆变黄了怎么办 水培观音竹叶子发黄怎么办 富贵竹叶子根部发黄怎么办