Linux内核实现 02_从内核出发
1. 内核源码树
目录 | 描述 |
---|---|
arch | 特定体系结构的源码 |
block | 块设备I/O层 |
crypto | 加密API |
Documentation | 内核源码文档 |
drivers | 设备驱动程序 |
firmware | 使用某些驱动程序而需要的设备固件 |
fs | VFS和各种文件系统 |
include | 内核头文件 |
init | 内核引导和初始化 |
ipc | 进程间通信代码 |
kernel | 像调度程序这样的核心子系统 |
lib | 通用内核函数 |
mm | 内存管理所用的脚本 |
security | linux安全模块 |
sound | yu语音子系统 |
net | 网络子系统 |
samples | 示例,示范代码 |
scripts | 编译内核所使用的脚本 |
usr | 早期用户空间代码(所谓的initamfs) |
tools | 在linux开发中有用的工具 |
virt | 虚拟化基础结构 |
2. 配置内核
$ make config
3. 消除编译信息
$ make > /dev/null
可把无用的输出信息重定向到永无返回值的黑洞/dev/null。
4.利用多核处理器编译
为了可以多个作业编译内核,使用以下命令:
$ make -jn
这里,n是要衍生出来的作业数。在实际中,每个处理器一般衍生出一个或者两个作业。例如:在一个16核处理器上,你可以输入如下命令:
$make -j32 > /dev/null
利用出色的distcc或者ccache工具,也可以动态的改善内核的编译时间。
5.安装内核
$ make module_install
就可以把所有已编译模块安装到正确的目录/lib/modules 下。想利用内核做自己的产品,就需要重新编写内核的makefile,分开用户态和内核态,注意内核态与用户态的通信。
6. 内核开发的特点
最重要的差异包括以下几种:
- 内核编程时既不能访问c库也不能访问标准的c头文件。
- 内核编程时必须使用GUN C。
- 内核编程时缺乏向用户空间那样的内存保护机制。
- 内核编程时难以执行浮点运算。
- 内核给每个进程只有一很小的定长堆栈。
- 由于内核支持异步中断、抢占和smp(对称多处理),因此必须时刻注意同步与并发。
- 要考虑可移植性的重要性。
Linux内核混用了C语言和汇编语言。在偏近体系的底层或对执行时间要求严格的地方,一般使用的是汇编语言。而内核其他的大部分代码是用c语言编写的。
-
分支声明
对于条件选择语句,gcc内建了一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候。编译器可以根据这条指令对条件分支选择进行优化。内核把这条指令封装成了宏,比如likely(),和unlikely()。例如:
if (error) { /*..............*/ }
如果想要把一个分支标记为通常为假的选择:
/* 我们认为error绝大部分时间都会为0...*/ if(unlikely(error)){ /*..........*/ }
相反,如果我们想把一个分支标记为真的选择:
/*我们认为succuss通常不会为0 */ if(likely(success)) { /*.......*/ }
本文来自博客园,作者:{心亘久},转载请注明原文链接:https://www.cnblogs.com/zhaodejin/p/16219289.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix