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. 内核开发的特点

    最重要的差异包括以下几种:

  1. 内核编程时既不能访问c库也不能访问标准的c头文件。
  2. 内核编程时必须使用GUN C。
  3. 内核编程时缺乏向用户空间那样的内存保护机制。
  4. 内核编程时难以执行浮点运算。
  5. 内核给每个进程只有一很小的定长堆栈。
  6. 由于内核支持异步中断、抢占和smp(对称多处理),因此必须时刻注意同步与并发。
  7. 要考虑可移植性的重要性。

   Linux内核混用了C语言和汇编语言。在偏近体系的底层或对执行时间要求严格的地方,一般使用的是汇编语言。而内核其他的大部分代码是用c语言编写的。

  1. 分支声明

    ​ 对于条件选择语句,gcc内建了一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候。编译器可以根据这条指令对条件分支选择进行优化。内核把这条指令封装成了宏,比如likely(),和unlikely()。例如:

    if (error) {
      /*..............*/
    }
    

    ​ 如果想要把一个分支标记为通常为假的选择:

    /* 我们认为error绝大部分时间都会为0...*/
    if(unlikely(error)){
      /*..........*/
    }
    

    ​ 相反,如果我们想把一个分支标记为真的选择:

    /*我们认为succuss通常不会为0 */
    if(likely(success))
    {
      /*.......*/
    }
    
posted @   心亘久  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示