第一次动手构建 Linux 内核

2023-11-12

背景

这两天读过《UNIX传奇:历史与回忆》,我深藏已久的 Linux 内核开发的理想又被一把点燃。

事不迟疑,赶紧动手干点什么。万一这次真坚持下去了呢?

不知为什么,“构建并替换内核”这件事在曾经的我眼中好似“活人换心脏”,吓得我打了退堂鼓;但如今看来不过是执行一连串命令而已,应该毫无难度。

机器参数

我手上是一台 2011 年左右家里人买的宏碁(Acer)笔记本,淘汰之后被我几番折腾,最后装了 Ubuntu 和 CentOS 双系统(参见:安装 Ubuntu 和 CentOS 双系统),但装完没两天也再没用过。

大致看一下 CPU 和 内存:

~/Downloads$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               42
Model name:          Intel(R) Core(TM) i3-2348M CPU @ 2.30GHz
Stepping:            7

~/Downloads$ free -m # 单位 MB
              total        used        free      shared  buff/cache   available
Mem:           3773        1602         529         187        1640        1715
Swap:             0           0           0

参考链接

以下步骤参考这篇文章:How to Build Linux Kernel From Scratch {Step-By-Step Guide}

操作流程

开始之前,首先查看一下当前的内核版本:

~/Downloads$ uname -mrs
Linux 5.3.0-46-generic x86_64

看来用的是 5.3.0-46

步骤1:下载 Linux 内核源码

截至写稿时,Linux 内核官网 上的最新版本是 5.13.1,比参考文章上的又高了几个小版本。
在这里插入图片描述
使用 wget 下载源码:

~/Downloads$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.13.1.tar.xz
--2021-07-14 21:30:10--  https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.13.1.tar.xz
Resolving cdn.kernel.org (cdn.kernel.org)... 2a04:4e42:1a::432, 151.101.229.176
Connecting to cdn.kernel.org (cdn.kernel.org)|2a04:4e42:1a::432|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 119286316 (114M) [application/x-xz]
Saving to: ‘linux-5.13.1.tar.xz’

linux-5.13.1.tar.xz 100%[===================>] 113.76M  90.4KB/s    in 18m 11s 

2021-07-14 21:48:22 (107 KB/s) - ‘linux-5.13.1.tar.xz’ saved [119286316/119286316]

步骤 2:解压源码

这一步也没啥说的。

~/Downloads$ tar xvf linux-5.13.1.tar.xz
# ...
# 中间太长,略
# ...
linux-5.13.1/virt/kvm/eventfd.c
linux-5.13.1/virt/kvm/irqchip.c
linux-5.13.1/virt/kvm/kvm_main.c
linux-5.13.1/virt/kvm/mmu_lock.h
linux-5.13.1/virt/kvm/vfio.c
linux-5.13.1/virt/kvm/vfio.h
linux-5.13.1/virt/lib/
linux-5.13.1/virt/lib/Kconfig
linux-5.13.1/virt/lib/Makefile
linux-5.13.1/virt/lib/irqbypass.c

步骤 3:下载所需软件包

回头再研究这些软件包,先按参考文章来吧:

~/Downloads$ sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
[sudo] password for doudou: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
# 中间太长,略
3 upgraded, 8 newly installed, 0 to remove and 518 not upgraded.
Need to get 8,035 kB of archives.
After this operation, 4,734 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://mirrors.aliyun.com/ubuntu bionic/main amd64 flex amd64 2.6.4-6 [316 kB]
Get:2 http://mirrors.aliyun.com/ubuntu bionic-security/main amd64 libssl-dev amd64 1.1.1-1ubuntu2.1~18.04.9 [1,566 kB]
Get:3 http://mirrors.aliyun.com/ubuntu bionic-security/main amd64 libssl1.1 amd64 1.1.1-1ubuntu2.1~18.04.9 [1,301 kB]
# 中间太长,略
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for install-info (6.5.0.dfsg.1-2) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...

参考文章中简单描述了一下这些软件包:链接

步骤 4:内核配置

这一步也没啥好说的,把系统当前版本内核的配置文件,拿过来直接用。

-v 是 verbose 的意思,把复制了什么、复制到哪儿都打印出来:

~/Downloads$ cd linux-5.13.1/ # 进入刚解压的目录
~/Downloads/linux-5.13.1$ cp -v /boot/config-$(uname -r) .config # 复制配置文件
'/boot/config-5.3.0-46-generic' -> '.config'

步骤 5:开始构建!

这一步就很有意思了:

步骤 5.1:make

输入 make 之后弹出来一堆选项,很多都标着 (NEW) 字样,估计是之前版本内核配置里没有的新参数吧。

一开始我还想看看这些配置都是啥意思,选一选,后来发现要选的参数实在太多了,怎么也得有几千个吧,就一路按回车了,按了也有好久!

最后终于停止向我问问题,开始编译了。

截至头天晚上要睡觉时 make 还在跑,估计要跑一晚上了。

~/Downloads/linux-5.13.1$ make
Makefile:656: include/config/auto.conf: No such file or directory
Makefile:701: include/config/auto.conf.cmd: No such file or directory
  SYNC    include/config/auto.conf.cmd
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
# 中间太长,略
.config:10171:warning: symbol value '1' invalid for KASAN_STACK
*
* Restart config...
*
*
* General setup
*
Compile also drivers which will not load (COMPILE_TEST) [N/y/?] n
Local version - append to kernel release (LOCALVERSION) [] 
Automatically append version information to the version string (LOCALVERSION_AUTO) [N/y/?] n
Build ID Salt (BUILD_SALT) [] 
Kernel compression mode
> 1. Gzip (KERNEL_GZIP)
  2. Bzip2 (KERNEL_BZIP2)
  3. LZMA (KERNEL_LZMA)
  4. XZ (KERNEL_XZ)
  5. LZO (KERNEL_LZO)
  6. LZ4 (KERNEL_LZ4)
  7. ZSTD (KERNEL_ZSTD) (NEW)
choice[1-7?]:  # 这是第一个需要我回答的问题

# 中间巨长无比,略

# 从这里开始,终于开始编译了:

  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_32.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_64.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_x32.h
  SYSTBL  arch/x86/include/generated/asm/syscalls_32.h
  SYSHDR  arch/x86/include/generated/asm/unistd_32_ia32.h
  SYSHDR  arch/x86/include/generated/asm/unistd_64_x32.h

第二天早上发现,终于跑完啦:

  CC [M]  sound/usb/snd-usbmidi-lib.mod.o
  LD [M]  sound/usb/snd-usbmidi-lib.ko
  CC [M]  sound/usb/usx2y/snd-usb-us122l.mod.o
  LD [M]  sound/usb/usx2y/snd-usb-us122l.ko
  CC [M]  sound/usb/usx2y/snd-usb-usx2y.mod.o
  LD [M]  sound/usb/usx2y/snd-usb-usx2y.ko
  CC [M]  sound/x86/snd-hdmi-lpe-audio.mod.o
  LD [M]  sound/x86/snd-hdmi-lpe-audio.ko
  CC [M]  sound/xen/snd_xen_front.mod.o
  LD [M]  sound/xen/snd_xen_front.ko
  CC [M]  virt/lib/irqbypass.mod.o
  LD [M]  virt/lib/irqbypass.ko
  GEN     scripts/gdb/linux/constants.py

剩下的两个步骤就比较快了:

步骤 5.2:make INSTALL_MOD_STRIP=1 modules_install

注意!我第一次没加INSTALL_MOD_STRIP=1 这个参数(参考文章里没提),结果重启之后提示 couldn't find suitable memory target,因为 initrd 太大了。网上搜了下解决方法,重新加上这个参数再编译就好了。

具体请参考:Ubuntu 换内核后报错:couldn’t find suitable memory target

可以看到,该命令把各个模块安装到了 /lib/moduls/5.13.1/kernel/ 下,无需手动指定路径。真是太方便了!

~/Downloads/linux-5.13.1$ sudo make INSTALL_MOD_STRIP=1 modules_install
[sudo] password for doudou: 
arch/x86/Makefile:148: CONFIG_X86_X32 enabled but no binutils support
  INSTALL /lib/modules/5.13.1/kernel/arch/x86/crypto/aegis128-aesni.ko
  SIGN    /lib/modules/5.13.1/kernel/arch/x86/crypto/aegis128-aesni.ko
  INSTALL /lib/modules/5.13.1/kernel/arch/x86/crypto/aesni-intel.ko
  SIGN    /lib/modules/5.13.1/kernel/arch/x86/crypto/aesni-intel.ko
  INSTALL /lib/modules/5.13.1/kernel/arch/x86/crypto/blowfish-x86_64.ko
  SIGN    /lib/modules/5.13.1/kernel/arch/x86/crypto/blowfish-x86_64.ko
  INSTALL /lib/modules/5.13.1/kernel/arch/x86/crypto/camellia-aesni-avx-x86_64.ko
  SIGN    /lib/modules/5.13.1/kernel/arch/x86/crypto/camellia-aesni-avx-x86_64.ko

# 中间太长

  SIGN    /lib/modules/5.13.1/kernel/sound/usb/usx2y/snd-usb-usx2y.ko
  INSTALL /lib/modules/5.13.1/kernel/sound/x86/snd-hdmi-lpe-audio.ko
  SIGN    /lib/modules/5.13.1/kernel/sound/x86/snd-hdmi-lpe-audio.ko
  INSTALL /lib/modules/5.13.1/kernel/sound/xen/snd_xen_front.ko
  SIGN    /lib/modules/5.13.1/kernel/sound/xen/snd_xen_front.ko
  INSTALL /lib/modules/5.13.1/kernel/virt/lib/irqbypass.ko
  SIGN    /lib/modules/5.13.1/kernel/virt/lib/irqbypass.ko
  DEPMOD  /lib/modules/5.13.1
~/Downloads/linux-5.13.1$ 

步骤 5.3:make install

最后一步是这 3 个 make 命令中最快的:

~/Downloads/linux-5.13.1$ sudo make install 
arch/x86/Makefile:148: CONFIG_X86_X32 enabled but no binutils support
sh ./arch/x86/boot/install.sh 5.13.1 arch/x86/boot/bzImage \
	System.map "/boot"
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 5.13.1 /boot/vmlinuz-5.13.1
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 5.13.1 /boot/vmlinuz-5.13.1
update-initramfs: Generating /boot/initrd.img-5.13.1
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8125b-2.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8125a-3.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168fp-3.fw for module r8169
run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 5.13.1 /boot/vmlinuz-5.13.1
run-parts: executing /etc/kernel/postinst.d/update-notifier 5.13.1 /boot/vmlinuz-5.13.1
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 5.13.1 /boot/vmlinuz-5.13.1
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.13.1
Found initrd image: /boot/initrd.img-5.13.1
Found linux image: /boot/vmlinuz-5.3.0-46-generic
Found initrd image: /boot/initrd.img-5.3.0-46-generic
Found linux image: /boot/vmlinuz-5.3.0-42-generic
Found initrd image: /boot/initrd.img-5.3.0-42-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
device-mapper: remove ioctl on osprober-linux-centos--vg-root  failed: Device or resource busy
Command failed
/usr/sbin/grub-probe: error: unknown filesystem.
Found CentOS Linux 8 (Core) on /dev/mapper/centos--vg-root
done

倒数第二行 Found CentOS Linux 8 (Core) on /dev/mapper/centos--vg-root 是因为我在这个机器上还装着 CentOS,哈哈。

步骤 6:更新 Bootloader(可跳过)

执行完这个步骤之后我才注意到,参考文章里说这一步完全可以略过。

步骤 6.1:update-initramfs

~/Downloads/linux-5.13.1$ sudo update-initramfs -c -k 5.13.1
update-initramfs: Generating /boot/initrd.img-5.13.1
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8125b-2.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8125a-3.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168fp-3.fw for module r8169

步骤 6.2:update-grub

~/Downloads/linux-5.13.1$ sudo update-grub
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.13.1
Found initrd image: /boot/initrd.img-5.13.1
Found linux image: /boot/vmlinuz-5.3.0-46-generic
Found initrd image: /boot/initrd.img-5.3.0-46-generic
Found linux image: /boot/vmlinuz-5.3.0-42-generic
Found initrd image: /boot/initrd.img-5.3.0-42-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done

步骤 7:重启并验证内核版本

大功告成!

启动菜单中选择 Advanced options for Ubuntu
在这里插入图片描述
然后选择新装的内核:
在这里插入图片描述
在这里插入图片描述
成功启动系统了!

老实说,看到界面那一刻还真有点激动,毕竟是解决了一个问题(参见步骤 5.2),不是一帆风顺到这儿的:
在这里插入图片描述
验证一下内核版本:

~$ uname -mrs
Linux 5.13.1 x86_64

小结

因为白天工作的关系,从第一天傍晚装到第三天上午才装好,但总体来说还算挺顺利。

《UNIX传奇:历史与回忆》给我热血沸腾的感觉还在,有时间该研究一下内核的源码了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第一次动手构建 Linux 内核 的相关文章

  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • pageoffice 骑缝章_PageOffice 页面中打开office编辑文档

    pom xml com zhuozhengsoft pageoffice 4 5 0 6 web xml poserver com zhuozhengsoft pageoffice poserver Server poserver pose
  • FDFS_Ubuntu部署fdfs测试上传文件不成功

    开启服务 sudo service fdfs trackerd start sudo service fdfs storaged start 查看服务是否开启 ps aux grep fdfs 执行完上述的操作之后 在ps 命令中完美显示开
  • 字符串相关,可变长字符串,异常

    字符串相关 String 字符串常量 本质char String str1 abc String str2 abc System out prrintln str1 str2 同时也会带来这样的问题 String a a a a b ab
  • Vue axios的使用

  • cmake知识点总结

    CMake的所有的语句都写在一个叫 CMakeLists txt 的文件中 当 CMakeLists txt 文件确定后 可以用 ccmake 命令对相关的变量值进行配置 这个命令必须指向 CMakeLists txt 所在的目录 配置完成
  • 操作系统_第四章_存储管理之 页式存储管理

    思考一个问题 是否有可能把相对地址连续的作业信息分散存放到几个不连续的主存区域中 且仍然能保证作业正确执行 若可行的话 既可充分利用主存空间又可减少移动所花费的开销 页式存储管理就是这样的管理方式 一 页式存储管理的基本原理 定义 页式存储
  • Vue3打包后无法运行

    描述 使用Vue3打包项目后 使用Live Server打开无法运行 放到服务器上也是一样 如图所示错误 分析 错误提示为js文件未找到 所以可能是路径的问题 关于Vue公共基础路径问题 https cn vitejs dev guide
  • android开发笔记(1-5)(易错点以及技术难点攻克)

    1 scrollview中嵌套有listview或者gridview 从其他页面返回到这个页面 焦点总是跑到listview或者gridview上 解决办法 重写scrollview的下边方法 Override protected int
  • 使用cloudflare搭建个人博客网站实践

    使用cloudflare搭建个人博客网站 首先配置好基本的环境 建议使用LNMP工具建立基本的环境 按照上面的教程可以基本完成采用http网站的初步建立 但是对于https的支持上面说的并不好 因此需要进一步的改进 要自己配置https其实
  • MySQL进阶 -- 视图

    MySQL进阶 视图 一 介绍 二 语法 三 检查选项 CASCADED 级联 LOCAL 本地 四 视图更新 五 视图作用 六 案例 一 介绍 视图 view 是一个虚拟表 非真实存在 其本质是根据SQL语句获取动态的数据集 并为其命名
  • 快速设计元器件原理图库和PCB封装库

    目录 1 立创商城EDA免费库 2 Altium Library Loader 3 贸泽电子ECAD模型 在设计电路的过程中经常会遇到这样的问题 无法快速找到合适的元器件原理图封装和PCB封装 Footprint 通常最基本的做法是百度找找
  • 爬虫学习笔记(十九)—— 滑动验证码

    文章目录 一 概念 二 实现步骤 2 1 获取验证码图片 2 1 1 获取缺口图 2 1 2 获取滑块图 2 1 3 获取完整图 2 1 4 完整代码 2 2 计算缺口位置 2 3 模拟人工移动 2 3 1 直接根据距离移动 2 3 2 牛
  • Linux抓包(wireshark+tcpdump)

    文章目录 一 Wireshark 1 安装wireshark工具 2 打开Wireshark 3 Wireshark基本使用 4 抓包信息 1 抓ping程序包 请求信息 响应信息 ARP协议 2 抓TCP三次握手 四次挥手 三次握手 四次
  • 若依源码解析:代码生成ruoyi-generator

    文章目录 摘要 代码生成器的使用 数据库连接配置 数据库表设计 代码生成器配置 修改mybatis别名配置 增加对com cyl包名的识别 修改mybatis的mapper扫描包路径 代码生成 代码输出 模板配置 代码生成器原理 模板引擎
  • sentinel源码流程图

    最近上海刮台风 在家画了sentinel的源码流程图 如有不对请指出 如需转载请标明出处
  • Java 数据库连接池、线程池和对象池总结

    一 Java数据库连接池总结 数据库连接池的实现及原理 内容摘要 对于一个复杂的数据库应用 频繁的建立 关闭连接 会极大的减低系统的性能 因为对于连接的使用成了系统性能的瓶颈 有一个很著名的设计模式 资源池 该模式正是为了解决资源频繁分配
  • IDEA的下载安装及配置Tomcat

    IDEA的下载安装及配置tomcat 1 首先是下载及安装 IDEA的官方网站提供了两种安装包 一种是旗舰版 既Ultimate版和Community版 如上图 左边是旗舰版的 需要付费 但是可以破解 右边是社区版 是免费的 但是提供的功能
  • Merge sort(归并排序) -- 分治

    基本思路 确定分界点 mid l r 2 递归排序left right 将步骤2中排序好的left right数组进行归并 合二为一 C 代码实现 void merge sort int q int l int r if l gt r re
  • SQL-lab 38~53

    less38 本关卡为堆叠注入 注入语句为 id 1 CREATE DATABASE sq default charset utf8 查询用户名和密码 并创建数据库 数据库创建成功 说明两条语句都执行了 less39 45关 这几关与上一关
  • 第一次动手构建 Linux 内核

    目录 背景 机器参数 参考链接 操作流程 步骤1 下载 Linux 内核源码 步骤 2 解压源码 步骤 3 下载所需软件包 步骤 4 内核配置 步骤 5 开始构建 步骤 5 1 make 步骤 5 2 make INSTALL MOD ST