linux-kernel相关内容

当我们定义一个宏时, do while(0) 有什么用?

可能的重复: C/C++ 宏中的 Do-While 和 if-else 语句 do { ... } while (0) — 它有什么用? 我正在阅读 linux 内核,发现很多这样的宏: #define INIT_LIST_HEAD(ptr) do { \(ptr)->next = (ptr);(ptr)->prev = (ptr);\} 而 (0) 为什么他们使用它而不是简单地在 ..
发布时间:2021-12-02 08:19:13 其他开发

bool 是原生 C 类型吗?

我注意到Linux内核代码使用bool,但我认为bool是C++类型.bool 是标准 C 扩展(例如 ISO C90)还是 GCC 扩展? 解决方案 bool 在当前的 C - C99 中存在,但在 C89/90 中不存在. 在 C99 中,本机类型实际上称为 _Bool,而 bool 是在 stdbool.h 中定义的标准库宏(它预期解析_Bool)._Bool 类型的对象保存 ..
发布时间:2021-12-02 08:14:28 其他开发

在 Linux 内核模块中读/写文件

我知道所有关于为什么不应该从内核读/写文件,而是如何使用 /proc 或 netlink 来做到这一点的讨论.无论如何我都想读/写.我也读过让我发疯 - 在内核中你永远不应该做的事情. 然而,问题是 2.6.30 不导出 sys_read().相反,它包含在 SYSCALL_DEFINE3 中.所以如果我在我的模块中使用它,我会收到以下警告: 警告:“sys_read"[xxx.ko] 未 ..
发布时间:2021-12-01 23:55:07 其他开发

在 Linux 内核中使用断言

我对 Linux 中的 assert() 有疑问:我可以在内核中使用它吗? 如果不是,例如我不想输入 NULL 指针,您通常使用什么技术? 解决方案 对应的内核宏为 BUG_ON 和 WARN_ON.前者用于当您想让内核崩溃并关闭系统时(即,不可恢复的错误).后者用于当您想将某些内容记录到内核日志时(可通过 dmesg 查看). 正如@Michael 所说,在内核中,您需要验证 ..
发布时间:2021-11-30 11:41:17 服务器开发

如何修改 AOSP 以允许特定应用获得 root 访问权限?

我正在研究 AOSP.我已经成功地添加了我的 apk 来构建.现在我想授予对我的应用程序的 root 访问权限.我不想为其他应用程序提供 root 访问权限,也不想在我的构建中安装超级用户应用程序.我只想添加我的应用程序以获得 root 访问权限.我怎样才能做到这一点? 我浏览了路径 system/extras/su 中的 su.c 文件,但我无法理解整个代码. 当我浏览代码时,我认为 ..
发布时间:2021-11-27 21:34:51 移动开发

Docker 内存限制导致 SLUB 无法分配大页面缓存

给定一个通过 mmap 文件创建大型 linux 内核页面缓存的进程,在具有内存限制的 docker 容器 (cgroup) 中运行会导致内核平板分配错误: Jul 18 21:29:01 ip-10-10-17-135 内核:[186998.252395] SLUB:无法在节点 -1 上分配内存(gfp=0x2080020)7 月 18 日 21:29:01 ip-10-10-17-135 内 ..
发布时间:2021-11-27 09:46:12 Java开发

使用 gcc 编译 64 位 linux 内核

在尝试使用 gcc 编译 64 位 linux 内核时,我看到以下错误: kernel/bounds.c:1: 错误:32 位不支持代码模型“内核"位模式 kernel/bounds.c:1: 抱歉,未实现:64 位模式未编译 这是 gcc -v 报告的内容: 使用内置规范. 目标:i586-redhat-linux 配置为:../configure --prefix=/usr ..
发布时间:2021-11-25 07:18:26 C#

为什么操作系统不能使用整个 64 位进行寻址?为什么只有 48 位?

我正在阅读“了解 Linux 内核". 64 位架构的分页 正如我们在前面看到的部分,通常采用两级分页由 32 位微处理器使用.然而,两级分页不是适用于采用64 位架构.让我们用一个解释原因的思想实验: 首先假设标准页面大小4 KB.因为 1 KB 涵盖了一个范围210 个地址,4 KB 覆盖 212地址,因此 Offset 字段为 12位.这留下了多达 52 位的要分配的线性地 ..
发布时间:2021-11-25 05:28:33 C#

64 位 linux 内核如何从 ELF 启动 32 位进程

通过查看 binfmt_elf.c 中的内核源代码,我无法弄清楚内核(64 位)在生成 32 位进程与 64 位进程时有何不同. 有人可以向我解释我遗漏了什么吗? (这个问题与我的另一个问题有关,即在与 64 位指令相同的过程中使用 32 位指令(链接),但这可以作为一个单独的问题.) 解决方案 如果使用execveat系统调用来启动一个新进程,我们首先进入fs/exec.cs ..
发布时间:2021-11-25 00:02:25 C#

64 位 linux 上 32 位进程的地址空间

在这个回答中,作者指出:使用 64 位 x86_64 内核,32 位进程可以使用整个 4GB 地址空间,除了由内核管理的 4GB 地址空间末尾的几个页面 (8KB). 这个内核管理内存的用途是什么?难道不应该在内核空间,防止用户意外损坏? 解决方案 引用内核源代码:“内核指针具有冗余信息,因此我们可以使用一种方案,其中我们可以返回错误代码或 [...] 具有相同返回值的指针." ..
发布时间:2021-11-24 23:47:45 C#

不能保留 512MB 或更多的 CMA

我正在尝试在具有 64GB 内存的 ARM64 机器上保留 512MB 的 CMA 内存,并且在 linux 启动期间我会收到“cma:无法保留 512MiB"错误消息.保留 384MB 工作正常.如果您需要更多信息,请告诉我.我很感激任何帮助. [ESL_Start_OS]:[644L] 开始跳转Linux内核在物理 CPU 0x10000 上启动 Linux初始化 cgroup subsys ..
发布时间:2021-11-17 22:47:30 其他开发

ARM64 - Linux 内存写保护不会禁用

我正在尝试从 LKM 中禁用 ARM64 系统上的内存写保护.(在Xen hypervisor的DOM0中开始) 我通过使用 Linux 内核函数找到了一个虚拟地址对应的 PTE. pgd_t *pgd;pte_t *ptep, pte;pud_t *pud;pmd_t *pmd;pgd = pgd_offset(init_mm, (addr));如果 (pgd_none(*pgd) || ..
发布时间:2021-11-17 22:46:01 其他开发

尝试在 ubuntu 中编译 android 内核时出错

我正在尝试从源代码编译 Android 内核,并且已经下载了所有正确的软件包来执行此操作,但由于某种原因我收到此错误: arm-linux-androideabi-gcc:错误:无法识别的命令行选项“-mgeneral-regs-only"/home/livlogik/android/kernel/H901BK_L_Kernel/./Kbuild:35:目标'kernel/bounds.s'的配 ..
发布时间:2021-11-17 22:45:52 其他开发

AARCH64 上不存在 MCR 和 MRC?

我正在尝试基于 Board 在 AARCH64 上编译“mrc"和“mcr"指令,但我看到以下错误消息 tmp/ccqOHmrK.s:汇编消息:/tmp/ccqOHmrK.s:43: 错误:未知助记符“mrc"——“mrc p15,0,x0,c14,c3,1"/tmp/ccqOHmrK.s:53: 错误:未知助记符“mrc"——“mrc p15,0,x2,c14,c3,0" 我尝试查看内核源 ..
发布时间:2021-11-17 22:45:44 其他开发

QEMU 托管启用 MTE 的内核不会引发故障

我正在尝试在 QEMU 环境(运行支持 MTE 的内核)上编译和测试 ARMv8.5 MTE 扩展. 我尝试在承载启用 MTE 的内核的 QEMU 上引发错误.我有一个简单的 C 代码,我运行它应该会因为 MTE 而引发错误,但它运行得很好(附加日志和信息).我在 x86 机器上将代码交叉编译为 arm64,并带有相关的 clang MTE 相关标志. 在 5.4.0-1040-gcp ..
发布时间:2021-11-17 22:45:26 其他开发

Arm64 Linux 页表遍历

目前我正在开发一些与研究相关的程序,我需要找到一些特定地址的pte.我的开发环境是 Juno r1 板(CPU 是 A53 和 A57),它运行 arm64 Linux 内核. 我使用了一些典型的页表遍历代码,如下所示: int find_physical_pte(void *addr){pgd_t *pgd;pud_t *pud;pmd_t *pmd;pte_t *ptep;无符号长长地 ..
发布时间:2021-11-17 22:45:06 其他开发

可以将超过七个参数传递给arm linux中的系统调用吗?

在arm linux(EABI)中,系统调用号在r7中传递,参数可以在r0-r6寄存器中传递 下表来自 (syscall(2))显示用于传递系统调用的寄存器参数. arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7 注释─────────────────────────────────────────────────────────────────── ..
发布时间:2021-11-17 22:41:17 其他开发

转换表走行时同步外部中止

有人能解释一下这个中止的原因是什么.我在手册中找不到解释. 基本上我在 IFSC 代码中收到此错误 - 转换表遍历时同步外部中止. IFSC 是 HSR 寄存器中的位,它与使用虚拟化扩展的 ARMv7A 一起使用. 解决方案 IFSC 基本上是 IFSR 的虚拟化版本. IFSC 代码 - 转换表遍历时同步外部中止. 这意味着 CPU 难以访问页表.所以你的代码可能 ..
发布时间:2021-11-17 22:41:11 其他开发