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

news/2024/7/20 14:47:02 标签: 运维, git, 内存管理

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

主要内容:

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

 

1. 获取内核源码

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

http://www.kernel.org

 

2. 内核源码的结构

 

目录说明
arch特定体系结构的代码
block块设备I/O层
crypo加密API
Documentation内核源码文档
drivers设备驱动程序
firmware使用某些驱动程序而需要的设备固件
fsVFS和各种文件系统
include内核头文件
init内核引导和初始化
ipc进程间通信代码
kernel像调度程序这样的核心子系统
lib同样内核函数
mm内存管理子系统和VM
net网络子系统
samples示例,示范代码
scripts编译内核所用的脚本
securityLinux 安全模块
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内核可用于不用的体现结构,支持多种硬件。所以开发时要时刻注意可移植性,尽量使用体系结构无关的代码。

转载于:https://www.cnblogs.com/GoogleGetZ/p/7424085.html


http://www.niftyadmin.cn/n/1155675.html

相关文章

C++函数重写(override)与函数重载(overload)

C函数重写(override)与函数重载(overload) override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。 重写(覆盖)的规则&#…

从零开始学习Sencha Touch MVC应用之四

现在准备测试! 在基于webkit的浏览器中,打开index.html文件,你将看到信息框的显示。 创建视图: 我们的视图可以用扩展Sencha Touch组件的方式来创建,它们负责数据的渲染和展示,采用这种技术可以使我们的应用…

SpringMVC笔记(六)SpringMVC的转发和重定向

一、转发和重定向一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理如果返回的字符串中带 forward: 或 redirect: 前缀 时,SpringMVC 会对他们进行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 …

记录一次Outlook使用的设置

工作中经常使用到邮件,正文中的模板样式以前没设置过,今天自己搞了一下,很简单,并不像晚上很多人的方法那么复杂。 在签名里面选择需要设置的帐户,即会使用到签名的邮件账号。然后在编辑签名中设置好自己的签名。保存。…

设计模式之模式分类

设计模式之一:模式分类 设计模式分为三大类: 创建型模式(5种), 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式; 结构型模式(7种), 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式…

关于假宽带

文本内容来自,网盒 许铮 (一)基本概念 首先,我国现有三大一级运营商,电信,移动,联通。在这些运营商的背后又有三张大网:固网,宽带和移动。然后运营商一共有两大业务&…

Iptables2

linux下iptables实战2010-01-04 01:34环境:centos5.1http://hi.baidu.com/xiutuo/blog------------------------------------------------------------------------------ 防火墙启动关闭重启 # service iptables stop | start | restart 保存所以规则到/etc/sysconfig/iptable…

C程序的存储空间

C程序的存储空间 C程序经编译链接后形成二进制映像文件,该映像文件由以下几个部分组成: 1.正文段(代码段) 这是由CPU执行的机器指令部分。通常正文段可共享,所以即使是频繁执行的程序(如文本编辑器,C编译器和shell等)在存储器中…