《奔跑吧 Linux内核》之Linux内核奔跑卷

本书通过20道题目挑战读者对Linux内核的理解,涵盖存储读写、内存管理、进程调度等多个方面,旨在帮助读者检验并加深对Linux内核的认识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux内核奔跑卷


京东购书: item.jd.com/12152745.ht…
试读地址: www.epubit.com.cn/book/detail…

在阅读本书之前,请读者用两小时来完成Linux内核奔跑卷,对Linux内核了解程度做简要的了解。奔跑卷仅仅是Linux内核知识的娱乐游戏节目,希望能给读者带来一丝乐趣,套用国内某个科技圈里知名人士的名言“不服,来跑个分吧!”。


下面一共20道大题目,每道大题目10分,一共200分,读者可以边阅读内核源代码边做题目,请在两小时内完成。如没有特殊说明,本奔跑卷基于Linux 4.0内核和ARM32/ ARM64体系架构。


1.请简述在你所熟悉的处理器中(比如双核Cortex-A9)一条存储读写指令的执行全过程。


2.在一个32KB的4路组相联的cache中,其中cache line为32Byte,请画出这个cache组相联的结构图。


3.内核的一级页表和二级页表存放在什么地方?用户进程的一级页表和二级页表分别存放在什么地方?


4.关于伙伴系统的几个小问题:



  • 系统初始化时,物理内存页面是如何添加到伙伴系统中的?
  • 系统运行时间长了物理内存会出现碎片化,伙伴系统如何避免物理内存的碎片化?

5.关于物理页面内存分配器的几个小问题:



  • 请简述Linux内核在理想情况下页面分配器(page allocator)是如何分配出连续物理页面的?
  • 如何从分配掩码中确定可以从哪些zone中分配内存?
  • 页面分配器是按照什么方向来扫描zone的?

6.关于slab分配器几个小问题:



  • slab分配器是如何分配和释放小内存块的?
  • slab分配器中有一个着色的概念(cache color),着色有什么作用?
  • slab分配器中的slab对象有没有根据per-cpu做一些优化,为什么?

7.用户进程使用malloc()来分配10个page大小的内存,请问内核是否马上分配物理内存?请描述malloc()在内核空间的实现过程。


8.关于struct page数据结构的几个小问题:



  • struct page数据结构中的_count和_mapcount有什么区别?
  • 匿名页面和文件缓冲页面有什么区别?
  • trylock_page()和lock_page()有什么区别?

9.关于页面回收的几个小问题:



  • LRU链表如何知道page的活动频繁程度?
  • kswapd是按照什么方向来扫描zone的?
  • 内核有哪些页面会被kswapd写回到交换分区?
  • 当page加入到lru链表中,被其他线程释放了这个page,那么lru链表如何知道这个page已经被释放了?

10.关于内存管理的几个重要的数据结构的关系,如mm、vma、page、vaddr、paddr:



  • 如何由mm数据结构和虚拟地址vaddr找到对应的VMA?
  • 如何由page和VMA找到虚拟地址vaddr?
  • 如何由page找到所有映射的VMA?
  • 如何由VMA和虚拟地址vaddr,找出相应的page数据结构?

11.关于缺页中断和虚拟内存的几个小问题:



  • 如果用户进程使用只读属性(PROT_READ)来mmap映射一个文件到用户空间,然后使用memcpy来写这段内存空间,会是什么样的情况?
  • 如果多个VMA的虚拟页面同时映射了同一个匿名页面,那么此时page->index应该等于多少?

12.关于进程的几个小问题:



  • 在内核中如何获取当前进程的task_struct数据结构?
  • 下面小代码片段里,最后会打印出什么?

int main(void)
{
int i;
for(i=0; i<2; i++){
fork();
printf("-\n");
}
wait(NULL);
wait(NULL);
return 0;
}复制代码


  • 优先级、nice和权重之间有什么关系?

13.关于CFS调度器的几个小问题:



  • 请简述CFS调度器是如何工作的?
  • vruntime是如何计算的?
  • min_vruntime有什么作用?
  • 对新创建的进程和刚唤醒的进程有何关照?

14.关于SMP负载均衡的几个小问题:



  • 普通进程的平均负载load_avg_contrib是如何计算的?runnable_avg_sum和runnable_avg_period是什么含义?
  • 一个4核处理器里每个物理CPU核有独立L1 cache并且只有一个线程,分成两个簇cluster0和cluster1,每个簇包含两个物理CPU核,簇中的CPU核共享L2 cache。请画出该处理器在Linux内核里调度域和调度组的拓扑关系图。

15.关于spinlock的几个小问题:

为什么spinlock的临界区不能睡眠(不考虑RT-Linux的情况)?
如果在spin_lock()和spin_unlock()的临界区中发生了中断,并且中断处理程序恰巧也修改了该临界资源,那么会发生什么后果?如何避免?
Ticket-based的spinlock机制是如何实现的?有什么优缺点?

16.读写信号量使用的自旋等待机制(optimistic spinning)是如何实现的?


17.关于RCU的几个小问题:



  • 请解释Quiescent State和Grace Period?
  • 在mm/oom_kill.c的select_bad_process()函数中为什么要使用rcu_read_lock()?什么时候注册RCU回调函数呢?

18.关于中断的几个小问题:



  • 硬件中断号和Linux内核的IRQ中断号是如何映射的?
  • 一个硬件中断发生之后,Linux内核是如何响应并处理该中断的?
  • 为什么说中断上下文不能执行睡眠操作?

19.关于软中断的几个小问题:



  • 软中断回调函数的执行过程中是否允许响应本地中断?
  • 同一类型的软中断是否允许多个CPU并行执行?
  • 是否允许同一个Tasklet在多个CPU上并行执行?

20.关于workqueue的几个小问题:



  • workqueue是运行在中断上下文,还是进程上下文?其回调函数允许睡眠吗?
  • 如果有多个work挂入到一个工作线程中执行,当某个work的回调函数执行了阻塞操作,那么剩下的work该怎么办?

答案:


奔跑卷的答案都分布在本书的各个章节。


如果答对了90%以上,那么恭喜您,您是深入了解Linux内核的高手,本书可能不适合您,不过您可以转给身边有需要的小伙伴。


如果答对了30%以上,那么您对Linux内核有一定的了解,当然本书也适合您继续深入了解。


如果答对题目少于30%,那么您还不是十分了解和精通Linux哦。现在就开始阅读本书,与笨叔叔和小企鹅一起快乐奔跑吧!当然您也可以先阅读Robert Love的《Linux内核设计与实现》,或者《Linux设备驱动程序》,然后再阅读本书。

关于《奔跑Linux内核》第二版2的信息,虽然未提供具体在线资源或购买链接的内容作为直接依据,但可以根据已知背景知识以及相关书籍的一般获取途径进行说明。 ### 获取方式概述 #### 在线阅读 对于技术类书籍,《奔跑Linux内核》这类深入探讨Linux内核原理的作品通常可以通过一些合法的技术文档平台找到部分章节预览或者电子书形式的完整内容。例如: - **Google Books** 或 **Amazon Kindle Store** 提供许多技术书籍的部分试读功能[^1]。 - 技术社区网站如 GitHub 上可能有读者整理的学习笔记或非官方翻译版本,但这需要注意版权问题[^2]。 #### 购买渠道 实体书店和主流电商平台上均有可能销售此书的不同版本: - 国内的京东、当当网经常上架中文译本和技术原著。 - 对于国际用户来说,亚马逊 (Amazon) 是一个可靠的选择,支持全球配送并常附带客户评价帮助判断质量。 以下是推荐的一个简单 Python 脚本来自动化搜索这些平台上的商品信息: ```python import requests from bs4 import BeautifulSoup def search_book(title, platform="amazon"): base_url = f"https://www.{platform}.com/s?k={title.replace(' ', '+')}" headers = {'User-Agent': 'Mozilla/5.0'} response = requests.get(base_url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') results = [] items = soup.find_all("div", {"data-component-type": "s-search-result"}) for item in items[:5]: title_elem = item.h2.a if item.h2 and item.h2.a else None price_elem = item.select_one(".a-price-whole") or item.select_one(".a-offscreen") book_info = { "Title": title_elem.text.strip() if title_elem else "", "URL": f'https://www.{platform}.com{title_elem["href"]}' if title_elem else "", "Price": float(price_elem.text.replace('$', '').strip()) if price_elem else None, } results.append(book_info) return results if __name__ == "__main__": books = search_book("The Linux Kernel Book Running Edition 2 Volume 2") for idx, book in enumerate(books): print(f"{idx+1}: {book['Title']} - ${book['Price']}\nLink: {book['URL']}") ``` 上述脚本通过爬取指定电商平台的商品列表页来提取目标书籍的关键数据,并打印前五个匹配项的结果。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值