Linux内核编程(The Linux Kernel Primer)书

原创 2012年03月28日 18:47:23

第二章 linux内核探索工具集。内核中常见数据类型(链表,树,查找),汇编示例,内联汇编,内核探索工具(objdump/readelf、hexdump、nm、objcopy、ar)、printk、dmesg、var/log/messages、__init、likely()/unlikely()。

第三章 进程:程序执行的基本模型。讲了程序、进程描述符、进程创建(fork()/vfolk()/clone()/do_fork())、进程终止(sys_exit()/do_exit()/sys_wait4())、调度程序的基本架构、等待队列、中断异常。

第四章 内存管理。讲了页、页面、内存管理区(三个:ZONE_DMA/ZONE_NORMAL/ZONE_HIGHMEM,原因是为了简化与体系结构无关的代码、为了统一而保留、有些总线寻址范围有限等)、slab分配器及其生命周期(解决外部碎片问题,交给伙伴系统分配管理)、linux进程内存结构(进程地址空间被划分为不同的内存区,用于保护,如只读,可执行等,进程地址空间以及与之相关的所有信息都保存在mm_struct描述符中,它出现在task_strcut中,一个内存区由vm_area_struct描述符表示)、进程映像的分布及线性地址空间、页表、缺页。

第五章 I/O。总线/桥/接口、设备(块设备请求队列和IO调度、字符、网络、时钟、终端设备、DMA)

第六章 文件系统。VFS及其相关数据结构(fs_struct结构、files_struct结构)、页缓存(address_space结构、buffer_head结构)、VFS的系统调用和文件系统层。

第七章 进程调度和内核同步。linux调度程序、内核抢占、自旋锁、信号量。

第八章 内核引导。与体系结构相关的内存初始化、原始ram盘、start_kernel()函数分析。



第九章 构建linux内核。讲了编译程序、交叉编译、链接程序、elf二进制目标文件结构(非可执行(多个节、一个节头表)、可执行(多个段、一个程序头表))。


第十章 向内核添加代码。讲了工作队列和tasklet的使用及区别

为了让中断快速运行,分成上半部(中断处理程序,它立即执行,因为它是在所有中断禁止的情况下执行)和下半部(推后处理程序,与中断对应)有三种不同的下半部实现机制:软中断、tasklet、工作队列。

软中断:软中断是在编译期间静态分配的,最多32个,不会抢占另外一个软中断,能并发运行在多个CPU上(所以要可重入,多CPU同时操作使用自旋锁保护),目前只有两子系统直接使用软中断:网络和SCSI,执行时间:从硬件中断代码返回时及其他。

tasklet:由两类软中断实现(HI_SOFTIRQ,TASKLET_SOFTIRQ),动态增减,同一类tasklet不能并发执行,不同类型可并发执行,下半部短小时能节省开销。只在中断上下文中运行。

工作队列:由内核线程执行,即总是在进程上下文执行,可睡眠,阻塞。

由request_irq()注册的上半部中断处理函数只完成最基本的管理工作,余下部分以任务形式插入工作队列,等候处理。

上半部处理:时间敏感、硬件相关、不被其他中断中断,其他的则可放在下半部。

软中断是随着SMP出现的,tasklet基于软中断,弥补了其可重入性编程的麻烦,因此诞生。之前两个运行在中断上下文不能睡眠和阻塞等待,于是诞生了工作队列(2.4中是任务队列),它可延迟执行,能够在不同进程间切换。

构成软中断的核心元素包括:1 软中断状态寄存器(irq_stat) 2 软中断向量表(softirq_vec) 3 软中断守护(daemon)。软中断模拟实际中断处理过程,当某一软中断事件发生后,设置对应中断标记、触发中断事务、唤醒守护线程检测中断状态寄存器,发现后,通过软中断向量表调用软中断服务程序action()。硬件中断的这一过程是硬件自动完成的,这体现了软中断的模拟。可见,软中断的服务程序的执行上下文为软中断daemon。linux中软中断daemon线程函数为do_softirq()。触发软中断事务通过raise_softirq()实现,该函数就是在中断关闭的情况下设置软中断状态位,然后判断如果不在中断上下文就直接唤醒守护daemon。



The Linux Kernel Primer (LINUX内核编程) E文pdf版

  • 2009年09月17日 17:25
  • 4.11MB
  • 下载

读书笔记The Linux Kernel Primer: 2.5.4. const and volatile

These two keywords are the bane of many an emerging programmer. Theconst keyword must not be thought...
  • maimang1001
  • maimang1001
  • 2013年03月14日 22:47
  • 716

linux kernel内核编程基础总结

Linux_kernel编程基础总结 时间:2015/10/9 背景:学习linux内核编程,总结学习中的经验,方便之后查看;            通常我们想弄清楚linux内核是怎么样...
  • zbh19921021
  • zbh19921021
  • 2015年10月10日 10:15
  • 2419

Linux内核探索之路——关于书

在学习Linux内核代码的过程中,定会参考很多书籍以及网路资源,但是并不是所有的书籍和资源都能够帮助你前进,或者说是能够将你引导向正确而高效的道路。   在学习的一些阶段可能会需要不同的书,比如在第一...
  • gx19862005
  • gx19862005
  • 2016年10月18日 23:01
  • 321

linux内核调试指南

大海里的鱼有很多,而我们需要的是鱼钩一只 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱...
  • bob_fly1984
  • bob_fly1984
  • 2016年05月14日 14:45
  • 3358

网上流传的Linux内核开发面试题整理

1)      Linux中主要有哪几种内核锁?     Linux的内核锁主要是自旋锁和信号量。 自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么...
  • zhangjikuan
  • zhangjikuan
  • 2015年10月10日 11:48
  • 3607

Linux kernel 分析之五:内核启动-内核解压缩

这得从vmliux.bin的产生过程说起。 从内核的生成过程来看内核的链接主要有三步: 第一步是把内核的源代码编译成.o文件,然后链接,这一步,链接的是arch/i386/kernel/head.S,...
  • vanquishedzxl
  • vanquishedzxl
  • 2015年07月21日 22:05
  • 1360

Linux内核编码规范

“在函数名中包含函数类型(所谓的匈牙利命名法)是脑子出了问题——编译器知道那些类型而 且能够检查那些类型,这样做只能把程序员弄糊涂了。难怪微软总是制造出有问题的程序。”         Lin...
  • raining_heart
  • raining_heart
  • 2013年02月05日 13:41
  • 2876

Linux内核与驱动面试要点

1. 实际经验:所开发驱动程序或内核模块的来龙去脉(需求、设计思想、实现方法、要点难点,特别是硬件调试过程中所遇到的特殊情况),所修复BUG的现象、调试手段、原因分析和解决方案。 2. 驱动调试...
  • u013265795
  • u013265795
  • 2015年06月13日 15:38
  • 1474

Linux内核编译详解

学习了网上的一些资料,自己试着摸索了一下,整理出此文。 由于在下水平相当有限,不当之处,还望大家批评指正^_^ 重要的参考资料有: http://raspberrypi.stackexc...
  • crazycoder8848
  • crazycoder8848
  • 2015年03月08日 12:43
  • 39528
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux内核编程(The Linux Kernel Primer)书
举报原因:
原因补充:

(最多只允许输入30个字)