Kernel Exploring
  • 前言
  • 支持
  • 老司机带你探索内核编译系统
    • 编译出你的第一个内核
    • 内核编译中的小目标
    • 可能是kbuild中最直接的小目标 – help
    • 使用了一个kbuild函数的目标 – cscope
    • 内核中单个.o文件的编译过程
    • 根目录vmlinux的编译过程
    • 启动镜像bzImage的前世今生
    • setup.bin的诞生记
    • 真假vmlinux–由vmlinux.bin揭开的秘密
    • bzImage的全貌
    • kbuild系统浅析
  • 启动时的小秘密
    • INIT_CALLS的秘密
    • 内核参数
  • 内核加载全流程
    • bootloader如何加载bzImage
    • 内核压缩与解压
    • 内核加载的几个阶段
    • 保护模式内核代码赏析
  • 内存管理
    • 内核页表成长记
      • 未解压时的内核页表
      • 内核早期的页表
      • cleanup_highmap之后的页表
      • 映射完整物理地址
      • 启用init_level4_pgt
    • 自底而上话内存
      • e820从硬件获取内存分布
      • 原始内存分配器--memblock
      • 页分配器
        • 寻找页结构体的位置
        • 眼花的页结构体
        • Node-Zone-Page
        • 传说的伙伴系统
        • Compound Page
        • GFP的功效
        • 页分配器的用户们
      • slub分配器
        • slub的理念
        • 图解slub
      • 内存管理的不同粒度
      • 挑战和进化
        • 扩展性的设计和实现
        • 减少竞争 per_cpu_pageset
        • 海量内存
        • 延迟初始化
        • 内存热插拔
        • 连续内存分配器
    • 虚拟内存空间
      • 页表和缺页中断
      • 虚拟地址空间的管家--vma
      • 匿名反向映射的前世今生
      • 图解匿名反向映射
      • THP和mapcount之间的恩恩怨怨
      • 透明大页的玄机
      • NUMA策略
      • numa balance
      • 老版vma
    • 内存的回收再利用
      • 水线
      • Big Picture
      • 手动触发回收
      • Page Fram Reclaim Algorithm
      • swapfile原理使用和演进
    • 内存隔离
      • memcg初始化
      • 限制memcg大小
      • 对memcg记账
    • 通用
      • 常用全局变量
      • 常用转换
    • 测试
      • 功能测试
      • 性能测试
  • 中断和异常
    • 从IDT开始
    • 中断?异常?有什么区别
    • 系统调用的实现
    • 异常向量表的设置
    • 中断向量和中断函数
    • APIC
    • 时钟中断
    • 软中断
    • 中断、软中断、抢占和多处理器
  • 设备模型
    • 总线
    • 驱动
    • 设备
    • 绑定
  • nvdimm初探
    • 使用手册
    • 上帝视角
    • nvdimm_bus
    • nvdimm
    • nd_region
    • nd_namespace_X
    • nd_dax
      • dev_dax
  • KVM
    • 内存虚拟化
      • Qemu内存模型
      • KVM内存管理
  • cgroup
    • 使用cgroup控制进程cpu和内存
    • cgroup文件系统
    • cgroup层次结构
    • cgroup和进程的关联
    • cgroup数据统计
  • 同步机制
    • 内存屏障
    • RCU
  • Trace/Profie/Debug
    • ftrace的使用
    • 探秘ftrace
    • 内核热补丁的黑科技
    • eBPF初探
    • TraceEvent
    • Drgn
  • 内核中的数据结构
    • 双链表
    • 优先级队列
    • 哈希表
    • xarray
    • B树
    • Maple Tree
    • Interval Tree
  • Tools
  • Good To Read
    • 内核自带文档
    • 内存相关
    • 下载社区邮件
Powered by GitBook
On this page
  • 准备环境
  • 获取内核
  • 基本配置
  • 可能会遇到的问题
  • 开始编译
  • 安装内核
  • 启动时显示grub界面
  • 重启机器

Was this helpful?

  1. 老司机带你探索内核编译系统

编译出你的第一个内核

第一次总是让人激动的,但是也常常伴随着恐惧和害怕。我相信有不少小白希 望学习内核,但是常常连第一步都没有开始,就直接栽倒在了出发的地方。

这篇文章献给那些向往成为内核大牛的小白们,由我来帮你们破除进入内核世界的第一道障碍。

准备环境

编译内核之前有一些基本的条件

  • 有一台可以联网的机器(或者虚拟机)

  • 安装了linux系统

  • 怎么着也得会一点基本的命令操作

除此之外对linux系统还要求一些软件包的安装(可能不全,在编译过程中遇到提示可以使用google搜索是缺了哪个包)

  • git 一个软件版本管理工具,我们用它来获得内核源码

  • gcc 编译器

  • make 编译工具

  • libncurse-dev 一个图形库

  • openssl-dev 加密库

嗯,差不多了,开始动手吧。

获取内核

感谢Linus,感谢git,自从有了git,获取内核代码变得异常的方便,而且时刻都可以是最新的。

在终端输入以下命令即可:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

没有安装git软件的请重复上一个步骤

基本配置

和大部分开源软件类似,linux kernel也是要配置之后才能够编译的。配置方法有好几种,我比较偏爱的是 make menuconfig。

cd linux
make menuconfig

执行完,你可以看到如下的配置界面。

知道为啥我喜欢用这个了吧,因为这有个图形界面。虽然有好多看不懂,但是毕竟有些你是能猜出个大概意思的。

这次只是用来编译第一个内核,所以不需要什么配置,直接按右箭头,走到Exit退出保存即可。

可能会遇到的问题

在执行make menuconfig的时候,可能会遇到一些提示说某些包没有安装导致执行失败。大家不要慌,究其原因是因为配置的过程实际上是内核先编译了一个用户态的配置工具,这个过程就需要依赖的软件包有: make, gcc, ld 和图形库libncurse-dev。不用紧张,按照提示,缺什么软件就安装什么软件就好了。

开始编译

配置完了之后就可以编译了。

很简单,运行如下命令

make -j8

如果编译成功,你就会看到目录下有一个文件叫vmlinux。 恭喜~

安装内核

也是so easy

make modules_install
make install

注意: 这两步需要有管理员权限。

另外需要注意的是,安装后有些版本可能要调整引导程序的配置。比如在ubuntu上,配置文件在/etc/default/grub, /boot/grub/grub.cfg。否则有时候下一次重启还是使用旧的内核。

启动时显示grub界面

ubuntu发行版默认grub配置在启动时是不显示grub界面的。虽然在make install后,大概率重启后能进入新编译/安装的内核。但是这么对内核开发人员来说还是不太友好。需要修改/etc/default/grub文件让grub进入的界面在启动时显示出来。

# GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10

需要修改的是上面两条。先把隐藏的方式去掉,再设置一个超时时间。

重启机器

执行如下命令

reboot

好了,等下次机器起来,选择你刚编译安装的内核,那就是一个崭新的世界了。

Previous老司机带你探索内核编译系统Next内核编译中的小目标

Last updated 1 year ago

Was this helpful?

这里写图片描述