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

主要内容:

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

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 语音子系统
usr 早期用户空间代码(所谓的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/目录下不需要的内核库文件
   删除/usr/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内核设计与实现》读书笔记(二)- 内核开发的准备相关推荐

  1. Linux内核设计与实现 读书笔记

    第二章 Linux内核 1 内核开发特点 1)内核编译时不能访问C库: 2)浮点数很难使用: 3)内核只有一个定长堆栈: 4)注意同步和并发. 第三章 进程管理 1 current宏:查找当前运行进程 ...

  2. linux+模块与设备关系,linux内核设计与实现读书笔记——设备和模块

    一.设备类型 1.块设备 blkdev:以块为单位寻址,支持重定位(数据随机访问),通过块设备节点来访问. 2.字符设备cdev:不可寻址,提供数据流访问,通过字符设备节点访问. 3.网络设备:对网络 ...

  3. linux内核设计与实现看不懂,Linux内核设计与实现读书笔记

    Unix强大的根本原因: Unix简洁, 提供几百个系统调用, 设计目的明确 Unix中 所有东西都被当做文件对待 Unix内核和相关系统工具是用C语言开发的, 移植能力强大 Unix进程创建迅速, ...

  4. 进程调度(一)--linux内核设计与实现读书笔记

    进程的调度程序是保证进程能有效工作的一个内核子系统.调度程序负责决定将哪个进程投入运行,何时运行以及运行多少时间.简单的来说,调度程序就是在给一堆就绪的进程分配处理器的时间,调度程序是多任务操作系统的 ...

  5. Linux内核设计与实现读书笔记

    1.进程管理 内核通过task_struct管理进程. 2.进程调度 1.可执行队列runqueue. 2.用户抢占.从中断返回或者系统调用返回的时候发生. 3.系统调用 1.系统调用参数放在寄存器里 ...

  6. 《Linux/Unix设计思想》读书笔记与感想

    英文名:Linux and the Unix Philosophy 作者:Mike Gancarz    翻译:漆渀(ben) NIH - Not Invented Here 准则1:小既是美     ...

  7. Linux内核设计与实现学习笔记目录

    **注:**这是别人的笔记,我只是把目录抄过来 <Linux内核设计与实现学习笔记> 1.<Linux内核设计与实现>读书笔记(一)-内核简介 2.<Linux内核设计与 ...

  8. 3D游戏设计读书笔记二

    3D游戏设计读书笔记二 一.简答题 • 解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系.   GameObjects是一个具体的实例,Assets是包括诸多游戏素材的资 ...

  9. 领域驱动设计DDD之读书笔记

    查看文章   领域驱动设计DDD之读书笔记  转载原地址:http://hi.baidu.com/lijiangzj 2007-08-17 16:53 一.当前Java软件开发中几种认识误区 Hibe ...

  10. 《Introduction To Modern Cryptography》读书笔记二

    <Introduction To Modern Cryptography>读书笔记二 本笔记纯粹个人读书习惯与相应见解,内容归纳完全出于个人需要与个人局限,如有修改意见(比如哪儿应该是值得 ...

最新文章

  1. Harbor镜像仓库部署
  2. 设计模式之_Strategy_04
  3. 栈的C语言案例,堆栈实例代码(C语言)
  4. python语言的数字类型_Python的数字有哪些类型
  5. sql 批量插入数据到Sqlserver中 效率较高的方法
  6. 西南交大计算机辅助制造a卷,计算机辅助制造 西南交大作业.doc
  7. 一加到1亿。C语言_一加官方道歉!这下良心了:老用户欢呼
  8. 2018-08-13 谷歌 protobuf-lite:3.0.1
  9. OpenStack 企业私有云的若干需求(2):自动扩展(Auto-scaling) 支持
  10. Vulnstack红日安全内网域渗透靶场1实战
  11. 汇编语言程序vs. 汇编程序
  12. 如何用金山打字通等软件练习准确地打JAVA语言
  13. 全文搜索功能--solr
  14. 会计核算的基本前提与确认计量的一般原则
  15. 7-13 愿天下有情人都是失散多年的兄妹 (25 分)
  16. 【嵌入式AI】TFLite介绍
  17. IE与非IE浏览器调用PC摄像头拍摄并且上传
  18. 张量学习(1):张量的基本概念
  19. 信号量与生产者消费者问题
  20. 新学期,新气象,新起点,新征程。

热门文章

  1. (002)每日SQL学习:删除名称重复的数据
  2. Python 前端的第三方库
  3. java_io_listFile()的应用和匿名内部类
  4. VS2013安装oepncv2.4.10 以及opencv 3.0.0
  5. Unity手游之路九自动寻路Navmesh之高级主题
  6. 个人阅读 代码大全的阅读与提问
  7. ASP.NET MVC3 Razor视图引擎-基础语法
  8. 分析easyVM 未完成)
  9. xss_url 通关_11-16
  10. Jetson Nano 改成国内源(中科大源)