我对修改内核内部结构、应用补丁、处理设备驱动程序和模块感兴趣,为了我个人的乐趣。
是否有针对内核黑客的综合资源,供有经验的程序员使用?
当我发现 Mac OS X 内核使用750MB的 RAM时,我震惊了这个问题。
我已经使用 Linux 20 年了,我一直“知道”内核 RAM 使用量与 X 相形见绌(这是真的吗?它曾经是真的吗?)。
所以,经过一些谷歌搜索后,我尝试slabtop告诉我:
Active / Total Size (% used) : 68112.73K / 72009.73K (94.6%)
Run Code Online (Sandbox Code Playgroud)
这是否意味着我的内核现在正在使用 ~72MB 的 RAM?
(鉴于top报告Xorg的 RSS 为 17M,内核现在使 X 相形见绌,而不是相反)。
笔记本电脑的“正常”内核 RAM 使用量(范围)是多少?
为什么 MacOS 使用的 RAM 比 Linux 多一个数量级?
附注。这里没有回答最后一个问题,所以请参阅相关问题:
我经常看到“内核环形缓冲区”、“用户级别”、“日志级别”等几个词一起出现。例如
/var/log/dmesg 包含内核环形缓冲区信息。
/var/log/kern.log 只包含任何日志级别的内核消息
/var/log/user.log 包含有关所有用户级别日志的信息
它们都是关于日志的吗?它们之间有何关联和不同?
通过“级别”,我会想象一个多层次的层次结构?
“用户级别”是否与“用户空间”有关?
Linux 使用虚拟内存系统,其中所有地址都是虚拟地址而不是物理地址。这些虚拟地址由处理器转换为物理地址。
为了使这种转换更容易,虚拟和物理内存被划分为页面。这些页面中的每一个都有一个唯一的编号;页框编号。
有些页面大小可以是 2 KB、4 KB 等。但是这个页面大小数字是如何确定的?它是否受架构大小的影响?例如,32 位总线将有 4 GB 地址空间。
uname 真正从哪里获取信息?
我认为这应该是直截了当的。不幸的是,我找不到任何仅包含该信息的标题。
假设有人想将uname/ uname -s from的基本输出更改Linux为其他内容(本质上是重命名内核)。
他/她将如何以正确的方式(即更改源)进行操作?
我已经将我的 HTPC 从内核3.7.10更新到3.10.7,似乎CONFIG_USB_SUSPEND现在从内核选项中消失并包含在 PM 中。
我面临的主要问题是我有一个外置硬盘,当挂起和唤醒 HTPC 时,系统无法使用它。HDD 唤醒(您可以听到它再次旋转),但是当您尝试访问挂载点时,您会收到以下错误:
ZOTAC ~ # ls /media
ls: reading directory /media: Input/output error
Run Code Online (Sandbox Code Playgroud)
在 dmesg 上:
[ 253.278260] EXT4-fs warning (device sdb1): __ext4_read_dirblock:908: error reading directory block (ino 2, block 0)
Run Code Online (Sandbox Code Playgroud)
在以前的内核中,设置 CONFIG_USB_SUSPEND=N 可以解决这个问题,因为 HDD 会自行处理其休眠状态,并且挂载点始终是可访问的。当 HDD 处于睡眠状态并且 HTPC 需要 HDD 安装点的某些内容时,HDD 本身会唤醒并正常运行。
现在我尝试了以下但没有成功:
但是当再次唤醒HTPC时,挂载点再次无法访问。作为解决方法,我可以卸载并重新安装挂载点,它可以再次正常工作,但我确信应该有一种方法可以避免让操作系统处理 USB 自动挂起。
知道如何在内核 3.7.10 或更高版本上禁用 USB 自动挂起吗?
目前我玩得很开心apt-get- 不好的是,这是我自己的错。我已经启用了这些testing包/etc/apt/sources.list来安装某个包。我告诉我的系统做apt-get dist-upgrade。一切正常,但现在我正试图恢复stable更新 - 但我失败了......
尝试执行该操作时apt-get dist-upgrade,我得到以下信息:
The following packages will be REMOVED:
linux-image-3.10-3-amd64
The following NEW packages will be installed:
libcgi-fast-perl libfcgi-perl libyaml-syck-perl
The following packages will be DOWNGRADED:
initramfs-tools libdate-manip-perl munin munin-common
Run Code Online (Sandbox Code Playgroud)
好吧,没关系,但是当我尝试这样做时,我会收到一条粗体友好红色字母的警告:
You are running a kernel (version 3.10-3-amd64) and attempting to remove the same version.
...
It is highly recommended to abort the kernel removal unless you are prepared to fix the system after …Run Code Online (Sandbox Code Playgroud) 我对用于描述 Linux 信号传递的术语感到困惑。大多数文本都会说“信号被传递到进程”或“信号被传递到线程”。
据我了解,当内核调用该处理程序时,信号被“传递”到驻留在进程中的信号处理程序。该进程本身是异步运行的,这个“交付”过程类似于 CPU 调用中断处理程序。中断处理程序(信号处理程序)不是进程线程,也不是该进程下运行的任何线程,对吗?它是由内核启动的一个单独的线程。
因此,信号不会传递给线程或进程,而是传递给驻留在进程中的信号处理程序,并且不一定与任何特定线程关联。如果这不正确,请告诉我,例如,信号处理程序和 pthread 之间的关联,它证明了“信号传递到 pthread”这一术语的合理性。
在故障排除和调整过程中,我经常发现自己在考虑以下 Linux 内核设置:
net.core.netdev_max_backlog
net.ipv4.tcp_max_syn_backlog
net.core.somaxconn
Run Code Online (Sandbox Code Playgroud)
除了fs.file-max, net.ipv4.ip_local_port_range, net.core.rmem_max, net.core.wmem_max, net.ipv4.tcp_rmem, 和 之外net.ipv4.tcp_wmem,当您为高并发性调整一个盒子时,它们似乎是要弄乱的重要旋钮。
我的问题:如何检查每个队列中有多少项目?通常人们只是将它们设置得非常高,但我想记录这些队列大小以帮助预测未来的故障并在问题以用户明显的方式表现出来之前捕获它们。
我只知道这Interrupt是hardware signal assertion处理器引脚造成的。但我想知道 Linux 操作系统如何处理它。
发生中断时发生的所有事情是什么?