10. 谁再和我提内核/用户态, 我跟谁…………

本文深入解析了Linux系统中用户态和内核态的概念,阐述了它们之间的区别、为何进行权限划分以及如何在两者间进行切换。通过了解用户态和内核态,读者可以更好地理解操作系统的工作原理。

前言

谁再和我提内核/用户态, 我跟谁……

image

记不清哪天了,

咸鱼刚入职场,

依稀记得某天的下午时光,

公司内的一群大牛, 聚在一起    image

尽讨论一些高大上的技术话题, 或底层原理, 或架构……

时不时传来一些专业术语“用户态”,“内核态”…………

咸鱼在边上默默听着, 也不敢插嘴,   image

只能仰望大佬, 同时暗下决心,  今天一定要把这两个概念搞懂!

那么, 用户态和内核态代表究竟是个啥?

用户态和内核态

简而言之, 内核态和用户态就是linux的权限划分.

  • 内核态(Kernel Mode)
运行操作系统程序, 操作硬件
  • 用户态(User Mode)
运行用户程序

为什么要进行这样的划分呢?

其实本质是为了保证系统不会崩溃!

你总不希望系统跑你的程序时,

因为你的程序有bug, 导致操作系统崩溃吧!

特权级别及指令划分

这两种运行级别有不同的特权, 可以运行不同的指令集

特权级别一般分为四种

  • R0

  • R1

  • R2

  • R3

从R0到R3特权能力依次降低

  • R3相当于用户态
当程序运行在R3级特权上时, 就可以称之为运行在用户态.
  • R0相当于内核态
当程序运行在0级特权级上时,就可以称之为运行在内核态.

不同级别能够运行不同的指令集合

  • 特权指令
只能由操作系统使用、用户程序不能使用的指令.
  • 非特权指令
用户程序可以使用的指令.

状态的切换

用户态和内核态可以互相切换.

运行在用户态下的程序不能直接访问操作系统内核数据结构和程序.

当我们在系统中执行一个程序时, 大部分时间是运行在用户态下的,

在其需要操作系统帮助完成某些它没有权力和能力完成的工作时,

就会切换到内核态.

用户态—>内核态

可以通过三种途径

  • 系统调用(访管指令)(用户进程主动发起)
为了安全, 应用程序无法直接调用硬件的功能,
  • 异常(被动)
  当CPU在执行运行在用户态下的程序时,
  • 外围设备的中断(被动)
  当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,

内核态—>用户态

  • 设置程序状态字PSW

两种状态的区别

这两种状态的主要差别是

  • 处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理机是可被抢占的

  • 处于核心态执行中的进程,则能访问所有的内存空间和对象,且所占有的处理机是不允许被抢占的.

谁再和你提内核/用户态, 请把怼飞他!

image

请关注我的订阅号

订阅号.png

<think>好的,我现在需要解决用户的问题:在Ubuntu 64位x86-64架构下,下载适合用于编译内核的openEuler版本,当前镜像用的是openEuler 22.03 LTS ARM。用户可能是在进行交叉编译,因为主机是x86-64,而目标架构是ARM。 首先,用户之前的问题是关于下载ARM版本的openEuler镜像,现在他们想在x86-64的Ubuntu系统上编译内核,可能需要交叉编译工具链。用户供的引用[1]到在树莓派上进行交叉编译,需要安装依赖包交叉编译工具,比如gcc-aarch64-linux-gnu。这可能意味着用户需要类似的设置来为ARM架构编译内核,即使主机是x86-64。 我需要确认openEuler是否有适用于x86-64主机的工具链或源码,以便在Ubuntu上进行交叉编译。用户可能不需要下载另一个openEuler镜像,而是需要获取内核源码对应的交叉编译工具。openEuler的官方文档可能有相关指导,比如如何设置交叉编译环境。 另外,用户到当前镜像为openEuler 22.03 LTS ARM,所以可能需要保持内核版本一致。因此,应该推荐下载对应版本的源码包,并配置交叉编译工具链。需要检查openEuler的镜像站点是否有供aarch64架构的内核源码包,以及如何获取它们。 可能还需要指导用户安装必要的依赖项,如gcc-aarch64-linux-gnu,类似于引用[1]中的步骤,但需要适配Ubuntu的环境。同时,要确保用户正确配置编译环境,避免架构不兼容的问题。 总结步骤可能包括:1. 获取openEuler 22.03 LTS的内核源码;2. 在Ubuntu上安装交叉编译工具链;3. 配置环境变量编译选项;4. 执行编译。此外,可能需要指导用户验证编译后的内核是否适用于目标ARM设备,比如使用QEMU进行测试或直接部署到设备上。</think>### 面向 x86-64 宿主机的 openEuler ARM 内核交叉编译指南 --- #### 一、版本选择逻辑 1. **内核版本匹配原则** - 需与目标系统保持 **严格版本对应**:宿主机的交叉编译环境必须使用与目标系统 **相同内核版本** - 对应关系公式: $$ \text{宿主机构建环境} \subseteq \text{openEuler 22.03-LTS 源码树} \land \text{目标架构}=aarch64 $$ 2. **源码获取路径** ```bash # 从 openEuler Gitee 仓库获取指定版本内核源码 git clone --branch openEuler-22.03-LTS https://gitee.com/openeuler/kernel.git cd kernel && git checkout 4.19.90-2112.8.0.0133.oe1 ``` --- #### 二、交叉编译环境配置 1. **工具链安装(Ubuntu 适配)** ```bash # 安装 ARM64 交叉编译工具链(适配 Ubuntu 源) sudo apt-get install gcc-11-aarch64-linux-gnu binutils-aarch64-linux-gnu # 验证工具链版本 aarch64-linux-gnu-gcc-11 --version | grep '(aarch64)' ``` 2. **环境变量配置** ```bash # 设置交叉编译参数 export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- export KCONFIG_CONFIG=arch/arm64/configs/openeuler_defconfig ``` --- #### 三、编译流程实施 1. **内核配置调整** ```bash # 应用 openEuler 默认配置 make openeuler_defconfig # 启用模块签名验证(与官方镜像兼容) ./scripts/config --enable CONFIG_MODULE_SIG ``` 2. **并行编译指令** ```bash # 根据 CPU 核心数优化编译速度 make -j$(nproc) Image.gz modules dtbs ``` 3. **产物验证标准** ```bash # 检查生成的内核映像架构 file arch/arm64/boot/Image | grep 'ARM aarch64' # 验证模块文件格式 readelf -h drivers/net/ethernet/realtek/r8169.ko | grep 'Machine:.*AArch64' ``` --- #### 四、部署测试方案 1. **QEMU 模拟验证** ```bash # 下载 ARM64 虚拟化镜像 wget https://mirror.opensuse.org/repositories/openSUSE:/Factory:/ARM:/Contrib:/QEMU/images/openEuler-22.03-LTS.aarch64.qcow2 # 启动虚拟机加载新内核 qemu-system-aarch64 -m 4G -cpu cortex-a57 -M virt \ -kernel arch/arm64/boot/Image \ -drive file=openEuler-22.03-LTS.aarch64.qcow2,format=qcow2 \ -append "root=/dev/vda1 console=ttyAMA0" ``` 2. **物理设备烧录方法** ```bash # 将内核映像打包为 RPM 格式 make rpm-pkg # 通过 scp 传输到目标设备 scp linux-*.rpm root@arm-device:/tmp/ # 在设备端执行安装 ssh root@arm-device "rpm -ivh /tmp/linux-*.rpm --force" ``` --- #### 五、版本兼容对照表 | 组件名称 | 宿主环境要求 | 目标环境约束 | |-------------------|--------------------|---------------------| | 交叉编译器 | gcc >= 9.3.0 | glibc >= 2.28 | | 内核头文件 | linux-headers-5.4+ | 与目标系统完全一致 | | 设备树编译器 | dtc 1.6.0+ | 无特殊要求 | --- ### 相关问题 1. 如何调试交叉编译过程中的链接器错误? 2. 在 x86-64 架构下编译 ARM 内核时如何优化编译速度? 3. openEuler 22.03 LTS 内核源码中如何启用特定硬件驱动模块? [^1]: 交叉编译工具链版本需与目标系统 glibc 版本匹配 [^2]: QEMU 模拟器需启用 KVM 加速模块升测试效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值