<<Linux内核设计与实现>>读书笔记(二)-内核开发的准备
来源:互联网 发布:美萍进销存软件客服 编辑:程序博客网 时间:2024/06/16 17:36
在尝试内核开发之前,需要对内核有个整体的了解.
主要内容
- 获取内核源码
- 内核源码的结构
- 编译内核的方法
- 内核开发的特点
1.获取内核源码
内核是开源的,所以获取源码特别方便,参照以下的网址,可以通过git或者直接下载压缩好的源码包.
http://www.kernel.org
2.内核源码的结构
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内核可用于不同的体系结构,支持多种硬件.所以开发时要时刻注意可移植性,尽量使用体系结构无关的代码.
- <<Linux内核设计与实现>>读书笔记(二)-内核开发的准备
- 《Linux内核设计与实现》读书笔记(二)- 内核开发的准备
- 《Linux内核设计与实现》读书笔记(二)- 内核开发的准备
- 《Linux内核设计与实现》读书笔记(二)- 内核开发的准备
- 《Linux内核设计与实现》读书笔记(二)- 内核开发的准备
- 《Linux内核设计与实现》读书笔记(二)- 内核开发的准备
- 《Linux内核设计与实现》读书笔记(二)- 内核开发的准备
- Linux内核设计与实现 (二) 内核开发的准备
- Linux内核设计与实现 读书笔记(2)内核开发的准备
- 读书笔记--《LINUX内核设计与实现》(二)
- 《Linux内核的设计与实现》读书笔记(二)---从内核出发
- 《Linux内核设计与实现》读书笔记(二)--进程调度
- 《Linux内核设计与实现》读书笔记(二十)- 补丁, 开发和社区
- 《Linux内核设计与实现》读书笔记(二十)- 补丁, 开发和社区
- 《Linux内核设计与实现》读书笔记(二十)- 补丁, 开发和社区
- linux内核设计与实现的读书笔记
- linux内核设计与实现(第二章)----内核开发准备
- 《Linux内核设计与实现》读书笔记(六)- 内核数据结构
- Qt_log2000_界面框架下的函数指针初探
- J2EE搭建Dynamic web SpringMVC工程404错误分析(一)
- 杭电ACM刷题(1):1002,A + B Problem II
- springboot vue.js axios.js ajax请求纯HTML页面传值
- shell -sed
- <<Linux内核设计与实现>>读书笔记(二)-内核开发的准备
- Hibernate第六篇【多对多映射、一对一映射】
- mac使用vim编写Python
- Boost.Aiso概述 基本原理
- Funny words
- GitHub学习笔记《仓库的创建》
- 第一次用CDDN-Markdown编辑器
- C#语句结构
- 利用LDA分析《天龙八部》中每十回的话题演变情况