【Step1】Linux Kernel -基础

2023-10-25 17:40
文章标签 基础 linux kernel step1

本文主要是介绍【Step1】Linux Kernel -基础,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Linux内核设计与实现.第3版》1-2章学习笔记

1. 获取内核源码

http://www.kernel.org

2. 内核版本命名规则

内核的版本号主要有四个数字组成。

在这里插入图片描述

从版本号: 偶数表示稳定版(可用于企业级环境),奇数表示开发版;

修订版本号: 包括BUG修正,新的驱动以及新的特性的追加;

稳定版本号: 关键性BUG的修改;

3. 单内核和微内核

原理优势劣势
单内核整个内核都在一个大内核地址空间上运行。简单、高效: 所有内核都在一个大的地址空间上,所以内核各个功能之间的调用和调用函数类似,几乎没有性能开销。一个功能的崩溃会导致整个内核无法使用。
微内核内核按功能被划分成各个独立的过程。每个过程独立的运行在自己的地址空间上。安全: 内核的各种服务独立运行,一种服务挂了不会影响其他服务。内核各个服务之间的调用涉及进程间的通信,比较复杂且效率低。

Linux内核是基于单内核的,但也具备微内核的一些特征:(体现了Linux实用至上的原则)

  1. 支持动态加载内核模块
  2. 支持对称多处理(SMP)
  3. 内核可以抢占(preemptive),允许内核运行的任务有优先执行的能力
  4. 不区分线程和进程

4. 内核源码的结构

目录说明
arch特定体系结构的代码
block块设备I/O层
crypo加密API
Documentation内核源码文档
drivers设备驱动程序
firmware使用某些驱动程序而需要的设备固件
fsVFS和各种文件系统
include内核头文件
init内核引导和初始化
ipc进程间通信代码
kernel像调度程序这样的核心子系统
lib库文件代码
mm内存管理子系统和VM
net网络子系统
samples内核编程案例
scripts配置裁剪内核的工具脚本
security包括不同的Linux安全模型代码
sound音频设备的驱动程序
usr早期用户空间代码(所谓的initramfs)
tools在Linux开发中有用的工具
virt虚拟化基础结构

5. 编译内核的方法

# 1.通过命令图形用户界面化配置,生成.config配置文件
$ sudo make menuconfig
# 2.内核编译
$ sudo make -j4
# 3.安装模块
$ sudo make modules_install
# 4.安装内核
$ sudo make install
# 5.reboot系统,重新选择内核版本,启动后通过以下指令查看内核版本
$ uname -a

修改ubuntu启动时选择内核:

# step1: 修改grub文件
$ sudo vim /etc/default/grub 
GRUB_DEFAULT=0
#GRUB_TIMEOUT_STYLE=hidden    # 1.屏蔽此处
GRUB_TIMEOUT=30               # 2.修改等待时间为30s
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""# step2:更新grub配置
$ sudo update-grub

6. 内核开发的特点

  1. 无标准C库: 为了保证内核的小和高效,内核开发中不能使用C标准库,例如printk替代printf

  2. GNU C 扩展:

    • 内联函数: 内联函数在编译时会在它被调用的地方展开,减少了函数调用的开销,性能较好。

      ​ 但频繁的使用内联函数也会使代码变长,从而在运行时占用更多的内存。

      所以使用内联函数时要求: 函数较小,会被反复调用,对程序的时间要求比较严格。

      /*EG:*/ static inline void sample();
      
    • 内联汇编: 内联汇编用于偏近底层或对执行时间严格要求的地方。

      unsigned int low, high; /* low 和 high 分别包含64位时间戳的低32位和高32位 */
      asm volatile("rdtsc" : "=a" (low), "=d" (high));
      
    • 分支声明: 如果能事先判断一个if语句时经常为真还是经常为假,那么可以用unlikely和likely来优化这段判断的代码

      if (unlikely(error))  /* 如果error在绝大多数情况下为0(假) */
      if (likely(success))  /* 如果success在绝大多数情况下不为0(真) */
      
  3. 没有内存保护: 因为内核是最低层的程序,所以如果内核访问的非法内存,那么整个系统都会挂掉,所以内核开发的风险比用户程序开发的风险要大。

    ​ 而且,内核中的内存是不分页的,每用一个字节的内存,物理内存就少一个字节。所以内核中使用内存一定要谨慎。

  4. 不使用浮点数: 内核不能完美的支持浮点操作,使用浮点数时,需要人工保存和恢复浮点寄存器及其他一些繁琐的操作。

  5. 内核栈容积小且固定: 内核栈的大小有编译内核时决定的,对于不用的体系结构,内核栈的大小虽然不一样,但都是固定的。

    $ ulimit -a | grep "stack size"                # 查看内核栈大小的方法
    stack size              (kbytes, -s) 8192
    
  6. 同步和并发: Linux是多用户的操作系统,所以必须处理好同步和并发操作,防止因竞争而出现死锁。

  7. 可移植性: Linux内核可用于不用的体现结构,支持多种硬件。所以开发时要时刻注意可移植性,尽量使用体系结构无关的代码。


路虽远行则将至、事虽难做则必成
MrWang

这篇关于【Step1】Linux Kernel -基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/284147

相关文章

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主