Fork me on GitHub
linux内核的经典书籍

linux内核的经典书籍

《Linux内核设计与实现》

简称LKD,从入门开始,介绍了诸如进程管理、系统调用、中断和中断处理程序、内核同步、时间管理、内存管理、地址空间、调试技术等方面,内容比较浅显易懂,个人认为是内核新人首先必读的书籍。新人得有此书,足矣!

《深入理解Linux内核》

简称ULK,相比于LKD的内容不够深入、覆盖面不广,ULK要深入全面得多。

前面这两本,一本提纲挈领,一本全面深入。

《Linux设备驱动程序》

简称LDD,驱动开发者都要人手一本了。

《深入理解Linux虚拟内存管理》

简称LVMM,是一本介绍Linux虚拟内存管理机制的书。如果你希望深入的研究Linux的内存管理子系统,仔细的研读这本书无疑是最好的选择。

《深入理解LINUX网络内幕》

一本讲解网络子系统实现的书,通过这本书,我们可以了解到Linux内核是如何实现复杂的网络功能的

 
 

Linux Driver for Embedded

 
摘要: 编译内核出现以下错误: [root@localhost linux-2.6.32.2]# make zImage CHK include/linux/version.hmake[1]: `include/asm-arm/mach-types.h' is up to date. CHK include/linux/utsrelease.h SYMLINK include/asm -> includ...阅读全文
posted @ 2012-07-09 10:43 深海的小鱼儿 阅读(630) | 评论 (0) 编辑

摘要: 一.栈的整体作用 (1)保存现场/上下文 (2)传递参数:汇编代码调用c函数时,需传递参数 (3)保存临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。 二.为什么汇编代码调用c函数需要设置栈 之前看了很多关于uboot的分析,其中就有说要为C语言的运行,准备好栈。而自己在Uboot的start.S汇编代码中,关于系统初始化,也看到有栈指针初始化这个动作。但是,从来只是看到有人说...阅读全文
posted @ 2012-04-28 16:45 深海的小鱼儿 阅读(328) | 评论 (0) 编辑

摘要: VERSION = 2010 PATCHLEVEL = 03 SUBLEVEL = EXTRAVERSION = ifneq "$(SUBLEVEL)" "" U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) else U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL)...阅读全文
posted @ 2012-04-02 13:40 深海的小鱼儿 阅读(207) | 评论 (0) 编辑

摘要: 解压u-boot压缩文件即可得到u-boot源代码。这些源代码可以分为3类: 第1类目录与处理器体系结构或者开发板硬件直接相关; 第2类目录是一些通用的函数或者驱动程序; 第3类目录是u-boot的应用程序、工具或者文档。 u-boot的源码顶层目录说明 目 录 特 性 解 释 说 明 board 平台依赖 存放电路板相关的目录文件, 例如:RPXlite(mpc8xx)、 smdk2410(ar...阅读全文
posted @ 2012-04-02 13:36 深海的小鱼儿 阅读(117) | 评论 (0) 编辑

摘要: 当我们编译U-BOOT的时候,大家键入make smdk2410_config,make 的时候都作了那些动作呢,这里我先大概介绍一下Makefile的内容,然后在大概理解一下命令执行的流程。如果有错的地方,希望大家指正,谢谢。 1.u-boot顶层目录的Makefile分析: HOSTARCH := $(shell uname -m | \ sed -e s/i.86/i386/ \ -e s/...阅读全文
posted @ 2012-04-02 13:34 深海的小鱼儿 阅读(239) | 评论 (0) 编辑

摘要: 1.1 U-Boot工作过程 U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能 Ø 硬件设备初始化 Ø 加载U-Boot第二阶段代码到RAM空间 Ø 设置好栈 Ø 跳转到第二阶段代码入口 (2)第二阶段的功能 Ø 初始化本阶段使用的硬件设备 Ø 检测系统内存映射 Ø 将内核从Flash读取到RAM中 Ø 为内核设置启动参数 Ø 调用内核 1.1.1 U-Boo...阅读全文
posted @ 2012-04-02 12:59 深海的小鱼儿 阅读(73) | 评论 (0) 编辑

摘要: 2.1 U-Boot Makefile分析 2.1.1 U-Boot编译命令 对于mini2440开发板,编译U-Boot需要执行如下的命令: $ make mini2440_config $ make all 使用上面的命令编译U-Boot,编译生成的所有文件都保存在源代码目录中。为了保持源代码目录的干净,可以使用如下命令将编译生成的文件输出到一个外部目录,而不是在源代码目录中,下面的2种方法都...阅读全文
posted @ 2012-04-02 12:57 深海的小鱼儿 阅读(150) | 评论 (0) 编辑

摘要: http://blog.chinaunix.net/space.php?uid=22337711&do=blog&id=1774864 http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94369 花了几天时间才把基于crosstool-ng的arm-linux交叉编译环境建立好,其间过程中一路磕磕碰碰,较为辛苦,最终成功完成,...阅读全文
posted @ 2012-04-01 14:05 深海的小鱼儿 阅读(579) | 评论 (0) 编辑

摘要: Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为《linux_device_driver 3rd Edition》,这是一本很经典的书,无奈Linux的东东还是过于庞大,这本侧重于实战的书籍也只能停留在基本的接口介绍上,更深入的东东只能靠我们自己摸索了。但万事总有一个开头,没有对Linux驱动整体框架的把握是很难做一个优秀的驱动开发者的。除了这本Jonathan Corbet, Gr...阅读全文
posted @ 2012-03-27 19:21 深海的小鱼儿 阅读(2733) | 评论 (1) 编辑

摘要: 在我们的驱动开发中经常用到结构体,下面将结构体的基本用法总结如下: #include<stdio.h>#include<stdlib.h> #define Debug struct student{ int old; int score;}; typedef struct master{ int old; int score;}ma; typedef struct doctor{ int...阅读全文
posted @ 2012-03-19 10:22 深海的小鱼儿 阅读(79) | 评论 (0) 编辑

摘要: Linux内核的同步机制:等待队列 Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过list_head连接的典型双循环链表,如下图所示。 在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待...阅读全文
posted @ 2011-11-20 20:36 深海的小鱼儿 阅读(108) | 评论 (0) 编辑

摘要: 前几天在看驱动的时候碰到了等待队列,上网去搜了一下,再结合代码看了一下,深有体会.在 kernel 里,wait_queue 的应用很广,举凡 device driver,semaphore 等方面都会使用到 wait_queue 来 implement。所以,它算是 kernel 里蛮 基本的一个数据结构。 首先,我们得明白,linux中的所有的进程都由task_struct这个结构管理。在生...阅读全文
posted @ 2011-11-20 20:34 深海的小鱼儿 阅读(948) | 评论 (0) 编辑

摘要: 相信很多写程序的人都写过 socket 的程序。当我们 open 一个 socket 之后,接着去读取这个 socket,如果此时没有任何资料可供读取,那 read 就会 block 住。(这是没有加上 O_NONBLOCK 的情形),直到有资料可读取才会传回来。在 Linux kernel 里有一个数据结构可以帮助我们做到这样的功能。这个数据结构就是这里要跟各位介绍的 wait queue。在 ...阅读全文
posted @ 2011-11-20 20:32 深海的小鱼儿 阅读(114) | 评论 (0) 编辑

摘要: 今天在看流量控制的代码时,特别留意了一下list_head的结构,发现它只有指针域,没有数据域,觉得有点困惑,一般的链表节点都包括两部分:数据域和指针域。linux里为何能这么用呢?股沟一下,原来是这么回事。在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点。 深入分析 Linux 内核链表 本文详细分析了 2.6.x 内核中链表结构的实现,并通过实...阅读全文
posted @ 2011-11-20 20:26 深海的小鱼儿 阅读(106) | 评论 (0) 编辑

摘要: 《Linux内核设计与实现》 简称LKD,从入门开始,介绍了诸如进程管理、系统调用、中断和中断处理程序、内核同步、时间管理、内存管理、地址空间、调试技术等方面,内容比较浅显易懂,个人认为是内核新人首先必读的书籍。新人得有此书,足矣! 《深入理解Linux内核》 简称ULK,相比于LKD的内容不够深入、覆盖面不广,ULK要深入全面得多。 前面这两本,一本提纲挈领,一本全面深入...阅读全文
posted @ 2011-11-20 19:48 深海的小鱼儿 阅读(892) | 评论 (0) 编辑

摘要: Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。 在下文将对进程的 R、S、D、T、Z、X 六种状态做个说明。 PROCESS STATE CODES Here are the different values that the s, stat and state output specifiers (header "S...阅读全文
posted @ 2011-11-09 09:49 深海的小鱼儿 阅读(1477) | 评论 (0) 编辑

摘要: 1、/linux-2.6.30.4/arch/arm/include/asm/ 1.1、<asm/io.h>--->对应__raw__write()和__raw__read()等的使用 1.2、<asm/uaccess.h> ----> /* copy_to_user, copy_from_user */ 1.3、<asm/system.h>:系统头文件,定义了设置或修改描述符/中断门等的嵌...阅读全文
posted @ 2011-11-09 09:34 深海的小鱼儿 阅读(1175) | 评论 (0) 编辑

摘要: 一个进程在其生存期内,可处于一组不同的状态下,称为进程状态,如图5-21所示。进程状态保存在进程任务结构的state字段中。当进程正在等待 系统中的资源而处于等待状态时,则称其处于睡眠等待状态。在Linux系统中,睡眠等待状态分为可中断的和不可中断的等待状态。 (点击查看大图)图5-21 进程状态及转换关系 (1)运行状态(TASK_RUNNING)。当进程正在被CPU执行,或...阅读全文
posted @ 2011-11-09 09:20 深海的小鱼儿 阅读(202) | 评论 (0) 编辑

摘要: 内核地址空间分布 直接映射区:线性空间中从3G开始最大896M的区间,为直接内存映射区,该区域的线性地址和物理地址存在线性转换关系:线性地址=3G+物理地址。 动态内存映射区:该区域由内核函数vmalloc来分配,特点是:线性空间连续,但是对应的物理空间不一定连续。vmalloc分配的线性地址所对应的物理页可能处于低端内存,也可能处于高端内存。 永久内存映射区:该区域可访问高端内存。访...阅读全文
posted @ 2011-11-08 14:08 深海的小鱼儿 阅读(1418) | 评论 (0) 编辑

摘要: 1、实物图 2、CPU接线图 3、实际硬件接图阅读全文
posted @ 2011-11-02 19:59 深海的小鱼儿 阅读(66) | 评论 (0) 编辑

摘要: readb(),readw(),readl()几个函数的区别联系: 功能: 从内存映射的I/O空间读取数据。 1、readb()从I/O读取8位数据(1字节); 2、readw()从I/O读取16位数据(2字节); 3、readl()从 I/O 读取 32 位数据(4字节). 原型: #include <asm/io.h> unsigned char readb (unsigne...阅读全文
posted @ 2011-11-02 19:26 深海的小鱼儿 阅读(57) | 评论 (0) 编辑

摘要: 1、Linux设备驱动分类: 1、字符设备: 字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。 2、块设备: 块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲.但是,字符设备和块设备并没有明显的界限,如对于Flash设备,符合块设备的特点,但是我们仍然...阅读全文
posted @ 2011-11-02 17:43 深海的小鱼儿 阅读(108) | 评论 (0) 编辑

摘要: 在Linux的ARM平台上的驱动设计需要遵循一个基本的模式,也就是说在你的驱动设计里面除了有些是关于你的硬件知识,但是有些东西是设计这个驱动的几个必须的模块: 1、内核驱动的加载函数(必须的) static int _ _init initialization_function(void) { ……………………….. } module_init(initialization_func...阅读全文
posted @ 2011-11-02 16:18 深海的小鱼儿 阅读(169) | 评论 (0) 编辑

摘要: 在上一篇文章里面我们编译了在X86体系的最简单的Linux下的入门驱动Hello,现在我们开始开发在ARM板上的最简单的Hello的驱动: 开发环境:虚拟机上的Linux(Fedora)+ARM(11)+友善之臂的光盘带的linux内核linux-2.6.36 开发步骤: 1.先安装手册重新编译下内核和裁剪下文件系统,具体的就参考手册,上面写的很清楚,但是需要注意的是:在编译内核的时候不要选...阅读全文
posted @ 2011-10-25 17:55 深海的小鱼儿 阅读(166) | 评论 (0) 编辑

摘要: 目标定义是Kbuild Makefile的主要部分,也是核心部分。主要是定义了要编 译的文件,所有的选项,以及到哪些子目录去执行递归操作。 最简单的Kbuild makefile 只包含一行: 例子: obj-y += foo.o 该例子告诉Kbuild在这目录里,有一个名为foo.o的目标文件。foo.o将从foo.c 或foo.S文件编译得到。 如果foo.o...阅读全文
posted @ 2011-10-25 11:09 深海的小鱼儿 阅读(1175) | 评论 (0) 编辑

摘要: 申明:这些文章为原创,要转载的需要取得本人的许可,不然的话会追究相关责任,希望大家理解!(深海的小鱼儿) 开发平台:pc(xp),虚拟机vwmare6.5、Linux操作系统Fedora9 需要知道的知识: 1、printk打印输出的优先级 #define KERN_EMERG "<0>"/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/#define KERN_ALERT "<1>"/*报告...阅读全文
posted @ 2011-10-24 21:44 深海的小鱼儿 阅读(459) | 评论 (2) 编辑

 

posted on 2013-04-28 09:59  HackerVirus  阅读(1841)  评论(0编辑  收藏  举报