我正在学习linux内核的内部结构,在阅读"理解Linux内核"时,有很多与内存相关的问题让我感到震惊.其中之一是,如果我的系统上安装了仅512 MB的物理内存,Linux内核如何处理内存映射.
正如我所读到的,内核将0(或16)MB-896MB物理RAM 映射到0xC0000000线性地址并可直接对其进行寻址.所以,在上面描述的情况下,我只有512 MB:
内核如何从512 MB映射896 MB?在所描述的方案中,内核进行设置,以便每个进程的页表将虚拟地址从0xC0000000映射到0xFFFFFFFF(1GB),直接映射到0x00000000到0x3FFFFFFF(1GB)的物理地址.但是当我只有512 MB物理RAM时,如何将虚拟地址从0xC0000000-0xFFFFFFFF映射到物理0x00000000-0x3FFFFFFF?点是我的物理范围只有0x00000000-0x20000000.
在这种情况下用户模式进程怎么样?
每篇文章都只解释了这种情况,当你安装了4 GB内存并且内核将1 GB映射到内核空间时,用户进程使用剩余的RAM量.
我很感激任何帮助,以提高我的理解.
谢谢..!
与Linux内核有关,"内核"页面是否会被换出?此外,用户空间页面是否会驻留在ZONE_NORMAL中?
linux arm memory-management linux-device-driver linux-kernel
我在网上搜索过,但没有找到关于“request_threaded_irq”功能的几个相关问题的令人信服的答案。
问题 1: 首先,我正在阅读这篇关于线程 IRQ 的文章:
http://lwn.net/Articles/302043/
我不清楚这一行:
“只有当处理程序代码通过集成 tasklet/softirq 功能并简化锁定来利用它时,将中断转换为线程才有意义。”
我知道如果我们继续采用“传统”的上半部/下半部方法,我们将需要自旋锁或禁用本地 IRQ 来干预共享数据。但是,我不明白的是,线程中断如何通过集成 tasklet/softirq 功能来简化锁定需求。
问题 2: 其次,request_threaded_handler 方法比基于 work_queue 的下半部分方法有什么优势(如果有)?在这两种情况下,似乎“工作”都被推迟到了一个专用线程。那么区别是什么呢 ?
问题3: 最后,在以下原型中:
int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long irqflags, const char *devname, void *dev_id)
Run Code Online (Sandbox Code Playgroud)
IRQ 的“处理程序”部分是否可能由相关的 IRQ(例如 UART 以高速率接收字符)持续触发,即使“thread_fn”(将 rx'd 字节写入循环缓冲区)部分中断处理程序正忙于处理先前唤醒的 IRQ ?那么,处理程序不会试图“唤醒”已经运行的“thread_fn”吗?在这种情况下,正在运行的 irq thread_fn 会如何表现?
如果有人能帮助我理解这一点,我将不胜感激。
谢谢,vj
我热衷于关注官方Linux内核邮件列表(https://lkml.org/)上的活动.浏览网站,关注任何感兴趣的主题或主题似乎是一项相当繁琐的工作.
或者,我想知道是否可以通过RSS关注它?我欢迎有关如何与邮件列表保持同步的最佳方式的其他建议?
谢谢,vj
当我构建Linux内核时,会生成两个映像vmlinux和vmlinux.o.它们的大小似乎也各不相同(分别为113KB和198KB).有人可以提供有关差异的见解吗?
谢谢,
VJ
我正在阅读以下关于Linux内核中存在的新时钟框架的文章.
http://lwn.net/Articles/489668/
谢谢,
〜VJ
我有以下 C 代码片段,在 Clang 中启用了 -Wconversion:
uint8_t num_ch = get_num_channels();
uint64_t test_mask = 1 << num_ch;
Run Code Online (Sandbox Code Playgroud)
我希望这会发出某种警告,因为 1 是一个隐式的“signed int”,然后被分配给 uint64_t,但编译器没有抱怨:(
我错过了什么?
从我的课程讲师,他反复强调并要求我们不要使用"内联"关键字来实现功能.他说它不是编译器的"可移植"而不是"标准".考虑到这一点,是否存在允许"内联扩展"的"标准"替代方案?
c compiler-construction inline inline-code compiler-optimization
是否有基于内核检测的方法来测量内核在启动期间转移到用户空间的时间?我可以使用printk的定时信息,但我只是不确定,放置此printk的确切位置,以便观察内核何时转移到Userspace.
我想了解,什么类型的头文件放在内核的基目录中的"/ includes /"下.这些文件在某种意义上是"公共"标题/ API吗?因此,忘记了架构,已启用/禁用的配置开关等?
简而言之,如果我想在我的驱动程序中使用一些核心内核功能,我可以安全地假设我正在寻找的功能,将包含在"/ includes"下的一个相关头文件中,而不是其他地方吗?
期待一些评论.
谢谢..!