标签: kernel

我应该什么时候编写Linux内核模块?

有些人出于某种原因希望在Linux中将代码从用户空间移动到内核空间.很多时候,原因似乎是代码应该具有特别高的优先级,或者只是"内核空间更快".

这对我来说很奇怪.我什么时候应该考虑编写内核模块?有一套标准吗?

我如何激励在(我相信)属于那里的用户空间中保存代码?

linux kernel module

31
推荐指数
4
解决办法
7345
查看次数

为什么Linux(x86)的页面大小为4 KB,如何计算?

x86架构上的Linux内核的默认内存页面大小是4 KB,我想知道这是如何计算的,为什么?

linux x86 kernel cpu-architecture

31
推荐指数
4
解决办法
3万
查看次数

什么是内核部分不匹配?

在编译内核模块时,我得到了一个WARNING,其中包含一个添加编译选项CONFIG_DEBUG_SECTION_MISMATCH = y的注释.它给了我更详细的问题信息:

WARNING: \**\*path to module\***(.text+0x8d2): Section mismatch in reference from the function Pch_Spi_Enable_Bios_Wr() to the variable .devinit.data:ich9_pci_tbl.22939
The function Pch_Spi_Enable_Bios_Wr() references
the variable __devinitdata ich9_pci_tbl.22939.
This is often because Pch_Spi_Enable_Bios_Wr lacks a __devinitdata
annotation or the annotation of ich9_pci_tbl.22939 is wrong.
Run Code Online (Sandbox Code Playgroud)

我无法找到究竟核心部分不匹配的内容,更不用说如何修复它了.

linux kernel module linux-kernel

30
推荐指数
1
解决办法
2万
查看次数

内核如何知道虚拟地址空间中的哪些页面对应于换出的物理页面框架?

请考虑以下情况:内核耗尽了物理RAM并需要换出页面.它选择最近最少使用的页面框架,并希望将其内容交换到磁盘并将该框架分配给另一个进程.

困扰我的是,这个页面框架已经映射到一般来说,几个(相同的)几个进程的页面.内核必须以某种方式找到所有这些进程并将页面标记为已换出.它是如何实现的?

谢谢.

编辑:问题的插图:

在交换过程1和2之前有一个共享的Page 1,它位于物理内存帧1中:

在此输入图像描述

现在,系统中的内存耗尽,内核通过从第1帧交换第1页并将其替换为第2页来为进程3分配内存.为了做到这一点,它必须

1)找到所有流程,参考第1页(在我们的案例中为流程1和流程2)

2)修改其页表条目,将"Present"位设置为0并在Swap中设置Page 1位置

在此输入图像描述

所以,我不知道,第1步是如何进行的.内核不能只是迭代地查看每个进程的页表,以便找到指向第1帧的页表条目.应该存在从页框到页表条目的某种反向映射.

答案是:

"页表管理最重要和最重要的变化是引入了反向映射(rmap).将其称为"rmap"是故意的,因为它是"首字母缩略词"的常见用法,不应与-rmap混淆由Rik van Riel开发的树,它对库存VM的更多改动而不仅仅是反向映射.

在一个句子中,rmap授予定位所有PTE的能力,这些PTE仅在给定结构页面的情况下映射特定页面.在2.4中,找到映射共享页面的所有PTE(例如内存映射共享库)的唯一方法是线性搜索属于所有进程的所有页表.这太昂贵了,Linux试图通过使用交换缓存来避免这个问题(参见11.4节).这意味着对于许多共享页面,无论页面使用时间和使用模式如何,Linux都可能必须更换整个进程.2.6而是有一个与每个结构页面相关联的PTE链,可以遍历该页面以从引用它的所有页面表中删除页面.这样,LRU中的页面可以以智能方式交换出来,而无需交换整个过程."

了解Linux内存管理,"Linux2.6中的新功能"

kernel memory-management virtual-memory mmu

30
推荐指数
1
解决办法
6211
查看次数

Docker for Windows如何运行Linux容器?

在旧版本的Docker for Windows中,我记得它明确表示它使用Linux VM作为内核.

但是,自从新的稳定版本(我想在2016年7月发布)以来,它说

Docker for Windows is a native Windows application with a native user interface and auto-update capability, deeply integrated with Windows native virtualization, Hyper-V, networking and file system

如果我理解正确,则指定的基本映像用于用户空间并使用主机的内核.因此,如果我指定我使用ubuntu基本映像来运行echo命令,那么Windows内核如何发挥作用?

还是我完全误解了什么?

windows kernel docker

30
推荐指数
1
解决办法
5908
查看次数

我在哪里可以在线浏览libc的源代码(如doxygen)

有时我想在stdlib中查找函数的实现,我已经下载了源代码,但它非常混乱.

因为许多命中,因为greping并不适合.

有没有人知道具有文档的网页doxygen风格.

Linux内核也是如此.

谢谢

documentation kernel libc

29
推荐指数
3
解决办法
2万
查看次数

"原型内核"在Unix路由表中意味着什么?

我一直在linux-ip.net和整个互联网上搜索这个,但确实没什么."proto kernel"部分在路由表中意味着什么?

举个例子:

[root@tristan]# ip route show table local
local 192.168.99.35 dev eth0 proto kernel scope host src 192.168.99.35
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

ip routing kernel

29
推荐指数
1
解决办法
2万
查看次数

如何清理Linux内核使用的缓存

我想强制Linux内核在缓存开始占用太多内存后为应用程序分配更多内存(可以通过'free'的输出看到).

我跑了

sudo sync; sudo sysctl -w vm.drop_caches=3; free
Run Code Online (Sandbox Code Playgroud)

(为了释放光盘dentry/inode缓存和页面缓存),我发现只有大约一半的已用缓存被释放 - 其余的仍然存在.如何判断占用缓存的其余部分并强制释放?

linux kernel memory-management linux-kernel

28
推荐指数
3
解决办法
4万
查看次数

内存映射IO - 它是如何完成的?

我已经了解了端口映射IO和内存映射IO之间的区别,但我无法弄清楚在现代操作系统(windows或linux)中如何实现内存映射Io

我所知道的是,物理内存的一部分被保留用于与硬件通信,并且有一个MMIO单元参与处理总线通信和其他与内存相关的东西

驱动程序如何与底层硬件通信?驱动程序将使用哪些功能?在使用它们之前,与视频卡通信的地址是固定的还是某种"协议"?

我还是很困惑

operating-system kernel device-driver linux-kernel

28
推荐指数
1
解决办法
2万
查看次数

程序堆栈和堆,它们如何工作?

我知道每个正在运行的进程都在虚拟内存中有与之关联的页面,其中很少会根据需要加载到主内存中.我也知道程序将有一个堆栈,也有一个堆来分配动态内存.这是我的问题.

  1. 堆栈也是主内存中某些页面的一部分吗?
  2. 当程序进入等待状态时会发生什么?堆栈指针,程序计数器和其他信息存储在哪里?
  3. 为什么堆栈增长和堆增长?
  4. L1,L2缓存是否只包含一个连续内存块,或者它可以包含堆栈和堆的某些部分?

你能推荐一本涵盖这些东西的好书吗?

heap stack kernel

27
推荐指数
2
解决办法
2万
查看次数