kernel相关内容

不同进程的相同虚拟地址如何映射到不同的物理地址

我参加了有关操作系统设计和概念的课程,现在我正在尝试彻底研究 Linux 内核.我有一个无法摆脱的问题.在现代操作系统中,每个进程都有自己的虚拟地址空间 (VAS)(例如,32 位系统中的 0 到 2^32-1).这提供了许多优点.但在实施中,我在某些方面感到困惑.我举个例子来解释一下: 假设我们有两个进程 p1、p2;p1 和 p2 有自己的 VAS.一个地址0x023f4a54映射到不同 ..
发布时间:2022-01-04 22:40:47 其他开发

在 linux 内核中添加了新的网络协议

我知道在linux内核中我们可以在传输层添加我们自己的协议,类似于TCP、UDP等 是否有任何钩子可以在网络层注册一个新的协议,类似于IP、ARP,可以将数据包传输到应用程序,以及如何在linux内核中添加该协议? 解决方案 要处理从用户空间到您的协议的通信,请向内核注册您的协议 套接字 API.这允许你从用户空间创建一个普通的套接字. 查看相关代码示例. static co ..
发布时间:2022-01-04 22:38:39 服务器开发

Mac OS X 和 BSD 的关系有多密切?

我读到 Mac OS X 和 bsd 是相关的.他们的关系有多密切.可以在 BSD 上调整和安装 Mac OS X 软件吗? 解决方案 回到 OS X 10.4 的时代,我花了一些时间未能为 OS X 编写 VFS.在那些日子里,内核的主要子系统,只有网络堆栈和 VFS 仍然是真正的 BSD.当时,甚至 VFS 也被部分重写以使其更加模块化(所有 BSD VFS 数据结构都变成了不透明的指 ..
发布时间:2022-01-04 22:37:54 服务器开发

用于 Linux 内核的线程感知 gdb

我正在使用连接到虚拟机串行端口的 gdb 来调试 linux 内核. 我想知道,是否有任何补丁/插件可以让 gdb 理解一些 linux 内核的数据结构并使其“线程感知"? 我的意思是在 gdb 下我可以看到有多少内核线程,它们的状态,以及每个线程的堆栈信息. 解决方案 libvmi https://github.com/libvmi/libvmi 该项目执行“Li ..
发布时间:2022-01-04 22:35:52 其他开发

mmap() 熵的 ASLR 位

我正在研究 x86 系统上 mmap() 的 ASLR 随机化.我在很多地方都读到过用 mmap() 加载的地址有 16 位随机化. 但在我发现的源代码中: static unsigned long mmap_rnd(void)02 {03 unsigned long rnd = 0;0405/*06 * 32 位 mmap 中的 8 位随机性,20 个地址空间位07 * 64 位 mma ..
发布时间:2022-01-04 22:34:35 服务器开发

确定使用障碍物(围栏)的位置

x86 指令 lfence/sfence/mfence 用于在 Linux 内核中实现 rmb()/wmb()/mb() 机制.很容易理解这些用于序列化内存访问.然而,在编写代码时——在遇到运行时行为中的错误之前,确定何时何地使用它们要困难得多. 我很想知道在编写/审查代码时是否有可以检查的已知警告,这可以帮助我们确定必须插入障碍的位置.我知道这太复杂了,但是否有经验法则或清单可以帮助我们确 ..

为什么操作系统需要/维护内核线程?

以下是我遇到的三个线程模型.基于以下 3 种架构,我很新鲜地了解到,除了作为 POSIX.1C 的一部分引入的用户线程之外,还存在称为内核线程的东西 这是 1-1 模型 这是 N-1 模型. 这是混合模型. 我已经解决了许多关于内核线程 SO 的问题.这看起来更相关链接以供澄清. 在进程级别,对于Linux loader(例如)加载的每个用户进程,内核不会分配相应的内 ..
发布时间:2022-01-04 22:33:45 其他开发

Linux:写入分为 512K 块

我有一个生成大 SCSI 写入的用户空间应用程序(详情如下).但是,当我查看到达 SCSI 目标(即由 FC 连接的存储)的 SCSI 命令时,有些东西将这些写入拆分为 512K 块. 该应用程序基本上会直接向设备进行 1M 大小的直接写入: fd = open("/dev/sdab", ..|O_DIRECT);写(FD,...,1024 * 1024); 此代码导致发送两个 SCSI ..
发布时间:2022-01-04 22:33:10 服务器开发

madvise(___, ___, MADV_DONTNEED) 是否指示操作系统懒惰地写入磁盘?

假设我想对一个可能非常大的文件执行顺序写入. 如果我 mmap() 一个巨大的区域并在整个区域上使用 madvise(MADV_SEQUENTIAL),那么我可以以相对有效的方式写入内存.我已经开始工作了. 现在,为了在我编写时释放各种操作系统资源,我偶尔会在已经写入的小块内存上执行 munmap().我担心 munmap() 和 msync() 会阻塞我的线程,等待数据物理提交到磁盘 ..
发布时间:2022-01-04 22:29:25 服务器开发

内核冻结:如何调试它?

我有一个带有数千行内核模块的嵌入式板卡,这些模块在随机时间和复杂用例上冻结.我尝试调试它的解决方案是什么? 我已经尝试了魔法系统请求,但它不起作用.我猜的解释是我在禁用硬件中断的代码中处于循环或死锁中? 谢谢,伊娃. 解决方案 通常,嵌入式开发板有一个 看门狗.您应该启用此计时器并使用 watchdog 用户进程来踢看门狗硬件.在 watchdog 进程上使用 nice 以便更 ..
发布时间:2022-01-04 22:27:50 其他开发

__udivdi3 undefined — 如何找到使用它的代码?

在 32 位 Linux 内核上编译内核模块会导致 "__udivdi3" [mymodule.ko] 未定义!“__umoddi3" [mymodule.ko] 未定义! 在 64 位系统上一切正常.据我所知,这是因为 32 位 Linux 内核不支持 64 位整数除法和取模. 如何找到发出 64 位操作的代码.它们很难手动找到,因为我无法轻松检查“/"是 32 位宽还是 64 位宽. ..
发布时间:2022-01-04 22:27:22 服务器开发

linux/module.h: 没有那个文件或目录

我是初学者,正在尝试一些 Linux 内核编程的基础知识.今天早上我在 VIM 中打开了 module.h 文件,并在没有保存任何更改的情况下关闭了文件.在那之后,我无法编译我的任何代码.我收到以下错误消息 [root@localhost helloworld]# cc helloworld.chelloworld.c:1:25: 错误: linux/module.h: 没有那个文件或目录[ro ..
发布时间:2022-01-04 22:24:17 其他开发

Linux内核 - 通过模块动态添加系统调用

有没有办法动态添加系统调用,比如通过模块?我找到了可以通过更改 sys_call_table[] 数组来使用模块覆盖现有系统调用的地方,以便在安装我的模块时获取我的覆盖函数而不是本机函数,但是你能这样做吗?一个新的系统调用和一个模块? 解决方案 不,sys_call_table 是固定大小的: const sys_call_ptr_t sys_call_table[__NR_syscal ..
发布时间:2022-01-04 22:24:01 服务器开发

如何使用 Linux 工作队列

Linux 工作队列是具有进程上下文的内核级线程.我试图将它用作没有特定进程上下文的 kthread 的替代方案.但是如何将数据传递到工作队列?work_struct 有一个类型为 atomic_long_t 的数据字段.我无法传递指向该字段的指针.我该怎么做? 我也找不到工作队列的一个具体例子.你能推荐一个吗? 解决方案 如果你想将数据传递给你的工作队列函数,只需将 work_st ..
发布时间:2022-01-04 22:23:22 其他开发

了解文件操作的 loff_t *offp

我正在设计一个简单的读取和写入字符缓冲区的设备驱动程序.然而,我的问题是关于file_operations 结构read 和write 中的两个函数.我真的不明白 loff_t *offp 到底是什么.我知道对于读取和写入操作, *offp 是文件偏移量,表示文件的当前读取/写入位置,但是我什至不确定写入或读取意味着什么/来自设备文件. 从我收集到的,这就是我从我的设备写入和读取的方式,我创 ..
发布时间:2022-01-04 22:22:09 服务器开发

在 Linux 中遍历进程的页表

我正在尝试为 linux 中的进程导航页表.在内核模块中,我实现了以下功能: static struct page *walk_page_table(unsigned long addr){pgd_t *pgd;pte_t *ptep, pte;pud_t *pud;pmd_t *pmd;结构页*页= NULL;struct mm_struct *mm = current->mm;pgd = p ..
发布时间:2022-01-04 22:21:10 服务器开发