浅谈阅读LINUX内核源码 [问题点数:20分]

Bbs1
本版专家分:13
结帖率 71.43%
Bbs7
本版专家分:19334
版主
Blank
红花 2014年3月 Linux/Unix社区大版内专家分月排行榜第一
2014年2月 Linux/Unix社区大版内专家分月排行榜第一
2013年12月 Linux/Unix社区大版内专家分月排行榜第一
2013年10月 Linux/Unix社区大版内专家分月排行榜第一
2013年6月 Linux/Unix社区大版内专家分月排行榜第一
2012年12月 Windows专区大版内专家分月排行榜第一
2009年10月 Windows专区大版内专家分月排行榜第一
2009年7月 Windows专区大版内专家分月排行榜第一
2009年6月 Windows专区大版内专家分月排行榜第一
2009年5月 Windows专区大版内专家分月排行榜第一
2008年11月 Windows专区大版内专家分月排行榜第一
2008年10月 Windows专区大版内专家分月排行榜第一
2007年5月 Windows专区大版内专家分月排行榜第一
Blank
黄花 2014年6月 Linux/Unix社区大版内专家分月排行榜第二
2014年1月 Linux/Unix社区大版内专家分月排行榜第二
2013年11月 Linux/Unix社区大版内专家分月排行榜第二
2010年6月 Windows专区大版内专家分月排行榜第二
2010年4月 Windows专区大版内专家分月排行榜第二
2010年3月 Windows专区大版内专家分月排行榜第二
2009年12月 Windows专区大版内专家分月排行榜第二
2009年11月 Windows专区大版内专家分月排行榜第二
2008年7月 Windows专区大版内专家分月排行榜第二
2008年1月 Windows专区大版内专家分月排行榜第二
2007年12月 Windows专区大版内专家分月排行榜第二
2007年11月 Windows专区大版内专家分月排行榜第二
2007年10月 Windows专区大版内专家分月排行榜第二
2007年6月 Windows专区大版内专家分月排行榜第二
Blank
蓝花 2014年7月 Linux/Unix社区大版内专家分月排行榜第三
2014年4月 Linux/Unix社区大版内专家分月排行榜第三
2013年1月 Linux/Unix社区大版内专家分月排行榜第三
2010年5月 Windows专区大版内专家分月排行榜第三
2009年9月 Windows专区大版内专家分月排行榜第三
2009年8月 Windows专区大版内专家分月排行榜第三
2008年8月 Windows专区大版内专家分月排行榜第三
2008年6月 Windows专区大版内专家分月排行榜第三
2007年9月 Windows专区大版内专家分月排行榜第三
2007年7月 Windows专区大版内专家分月排行榜第三
2007年4月 Windows专区大版内专家分月排行榜第三
Bbs1
本版专家分:0
Bbs1
本版专家分:13
Bbs5
本版专家分:3461
Bbs2
本版专家分:268
Bbs1
本版专家分:10
Bbs1
本版专家分:20
Bbs7
本版专家分:17695
版主
Blank
红花 2009年12月 Linux/Unix社区大版内专家分月排行榜第一
Bbs5
本版专家分:3276
Blank
红花 2010年10月 C/C++大版内专家分月排行榜第一
Bbs1
本版专家分:40
Bbs1
本版专家分:0
Bbs1
本版专家分:20
Bbs1
本版专家分:15
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:60
Bbs1
本版专家分:0
Bbs1
本版专家分:0
随想录(怎么用source insight阅读kernel代码)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】nn nn    大家都知道,<em>linux</em> kernel代码很多,文件多,行数多。作为学习和开发来说,<em>阅读</em>kernel代码常常又是我们必须要做的工作,那么怎么最大效率地<em>阅读</em>代码呢?我的经验就是用source insight创建kernel工程,接着就将文件减到最少,删除不必要的文件和目录。nn nn...
深入分析Linux内核源码完整版
第一章 走进<em>linux</em> 1.1 GNU与Linux的成长 1.2 Linux的开发模式和运作机制 1.3走进Linux内核 1.3.1 Linux内核的特征 1.3.2 Linux内核版本的变化 1.4 分析Linux内核的意义 1.4.1 开发适合自己的操作系统 1.4.2 开发高水平软件 1.4.3 有助于计算机科学的教学和科研 1.5 Linux内核结构 1.5.1 Linux内核在整个操系统中的位置 1.5.2 Linux内核的作用 1.5.3 Linux内核的抽象结构 1.6 Linux内核源代码 1.6.1 多版本的内核源代码 1.6.2 Linux内核源代码的结构 1.6.3 从何处开始<em>阅读</em>源代码 1.7 Linux内核源代码分析工具 1.7.1 Linux超文本交叉代码检索工具 1.7.2 Windows平台下的源代码<em>阅读</em>工具Source Insight 第二章 Linux运行的硬件基础 2.1 i386的寄存器 2.1.1通用寄存器 2.1.2段寄存器 2.1.3状态和控制寄存器 2.1.4 系统地址寄存器 2.1.5 调试寄存器和测试寄存器 2.2 内存地址 2.3 段机制和描述符 2.3.1 段机制 2.3.2 描述符的概念 2.3.3系统段描述符 2.3.4 描述符表 2.3.5 选择符与描述符表寄存器 2.3.6 描述符投影寄存器 2.3.7 Linux中的段 2.4 分页机制 2.4.1 分页机构 2.4.2页面高速缓存 2.5 Linux中的分页机制 2.5.1 与页相关的数据结构及宏的定义 2.5.2 对页目录及页表的处理 2.6 Linux中的汇编语言 2.6.1 AT&T与Intel汇编语言的比较 2.6.2 AT&T汇编语言的相关知识 2.6.3 Gcc嵌入式汇编 2.6.4 Intel386汇编指令摘要 第三章中断机制 3.1 中断基本知识 3.1.1 中断向量 3.1.2 外设可屏蔽中断 3.1.3异常及非屏蔽中断 3.1.4中断描述符表 3.1.5 相关汇编指令 3.2中断描述符表的初始化 3.2. 1 外部中断向量的设置 3.2.2中断描述符表IDT的预初始化 3.2.3 中断向量表的最终初始化 3.3异常处理 3.3.1 在内核栈中保存寄存器的值 3.3.2 中断请求队列的初始化 3.3.3中断请求队列的数据结构 3.4 中断处理 3.4.1中断和异常处理的硬件处理 3.4.2 Linux对异常和中断的处理 3.4.3 与堆栈有关的常量、数据结构及宏 3.4.4 中断处理程序的执行 3.4.5 从中断返回 3.5中断的后半部分处理机制 3.5.1 为什么把中断分为两部分来处理 3.5.2 实现机制 3.5.3数据结构的定义 3.5.4 软中断、bh及tasklet的初始化 3.5.5后半部分的执行 3.5.6 把bh移植到tasklet 第四章 进程描述 4.1 进程和程序(Process and Program) 4.2 Linux中的进程概述 4.3 task_struct结构描述 4.4 task_struct结构在内存中的存放 4.4.1 进程内核栈 4.4.2 当前进程(current宏) 4.5 进程组织的方式 4.5.1哈希表 4.5.2双向循环链表 4.5.3 运行队列 4.5.4 等待队列 4.6 内核线程 4.7 进程的权能 4.8 内核同步 4.8.1信号量 4.8.2原子操作 4.8.3 自旋锁、读写自旋锁和大读者自旋锁 4.9 本章小节 第五章进程调度 5.1 Linux时间系统 5.1.1 时钟硬件 5.1.2 时钟运作机制 5.1.3 Linux时间基准 5.1.4 Linux的时间系统 5.2 时钟中断 5.2.1 时钟中断的产生 5.2.2.Linux实现时钟中断的全过程 5.3 Linux的调度程序-Schedule( ) 5.3.1 基本原理 5.3.2 Linux进程调度时机 5.3.3 进程调度的依据 5.3.4 进程可运行程度的衡量 5.3.5 进程调度的实现 5.4 进程切换 5.4.1 硬件支持 5.4.2 进程切换 第六章 Linux内存管理 6.1 Linux的内存管理概述 6.1.1 Linux虚拟内存的实现结构 6.1.2 内核空间和用户空间 6.1.3 虚拟内存实现机制间的关系 6.2 Linux内存管理的初始化 6.2.1 启用分页机制 6.2.2 物理内存的探测 6.2.3 物理内存的描述 6.2.4 页面管理机制的初步建立 6.2.5页表的建立 6.2.6内存管理区 6.3 内存的分配和回收 6.3.1 伙伴算法 6.3.2 物理页面的分配和释放 6.3.3 Slab分配机制 6.4 地址映射机制 6.4.1 描述虚拟空间的数据结构 6.4.2 进程的虚拟空间 6.4.3 内存映射 6.5 请页机制 6.5.1 页故障的产生 6.5.2 页错误的定位 6.5.3 进程地址空间中的缺页异常处理 6.5.4 请求调页 6.5.5 写时复制 6.6 交换机制 6.6.1 交换的基本原理 6.6.2 页面交换守护进程kswapd 6.6.3 交换空间的数据结构 6.6.4 交换空间的应用 6.7 缓存和刷新机制 6.7.1 Linux使用的缓存 6.7.2 缓冲区高速缓存 6.7.3 翻译后援存储器(TLB) 6.7.4 刷新机制 6.8 进程的创建和执行 6.8.1 进程的创建 6.8.2 程序执行 6.8.3 执行函数 第七章 进程间通信 7.1 管道 7.1.1 Linux管道的实现机制 7.1.2 管道的应用 7.1.3 命名管道(FIFO) 7.2 信号(signal) 7.2.1 信号种类 7.2.2 信号掩码 7.2.3 系统调用 7.2.4 典型系统调用的实现 7.2.5 进程与信号的关系 7.2.6 信号举例 7.3 System V 的IPC机制 7.3.1 信号量 7.3.2 消息队列 7.3.3 共享内存 第八章 虚拟文件系统 8.1 概述 8.2 VFS中的数据结构 8.2.1 超级块 8.2.2 VFS的索引节点 8.2.3 目录项对象 8.2.4 与进程相关的文件结构 8.2.5 主要数据结构间的关系 8.2.6 有关操作的数据结构 8.3 高速缓存 8.3.1 块高速缓存 8.3.2 索引节点高速缓存 8.3.3 目录高速缓存 8.4 文件系统的注册、安装与拆卸 8.4.1 文件系统的注册 8.4.2 文件系统的安装 8.4.3 文件系统的卸载 8.5 限额机制 8.6 具体文件系统举例 8.6.1 管道文件系统pipefs 8.6.2 磁盘文件系统BFS 8.7 文件系统的系统调用 8.7.1 open 系统调用 8.7.2 read 系统调用 8.7.3 fcntl 系统调用 8 .8 Linux2.4文件系统的移植问题 第九章 Ext2文件系统 9.1 基本概念 9.2 Ext2的磁盘布局和数据结构 9.2.1 Ext2的磁盘布局 9.2.2 Ext2的超级块 9.2.3 Ext2的索引节点 9.2.4 组描述符 9.2.5 位图 9.2.6 索引节点表及实例分析 9.2.7 Ext2的目录项及文件的定位 9.3 文件的访问权限和安全 9.4 链接文件 9.5 分配策略 9.5.1 数据块寻址 9.5.2 文件的洞 9.5.3 分配一个数据块 第十章 模块机制 10.1 概述 10.1.1 什么是模块 10.1.2 为什么要使用模块? 10.2 实现机制 10.2.1 数据结构 10.2.2 实现机制的分析 10.3 模块的装入和卸载 10.3.1 实现机制 10.3.2 如何插入和卸载模块 10.4 内核版本 10.4.1 内核版本与模块版本的兼容性 10.4.2 从版本2.0到2.2内核API的变化 10.4.3 把内核2.2移植到内核2.4 10.5 编写内核模块 10.5.1 简单内核模块的编写 10.5.2 内核模块的Makefiles文件 10.5.3 内核模块的多个文件 第十一章 设备驱动程序 11.1 概述 11.1.1 I/O软件 11.1.2 设备驱动程序 11.2 设备驱动基础 11.2.1 I/O端口 11.2.2 I/O接口及设备控制器 11.2.3 设备文件 11.2.4 VFS对设备文件的处理 11.2.5 中断处理 11.2.6 驱动DMA工作 11.2.7 I/O 空间的映射 11.2.8 设备驱动程序框架 11.3 块设备驱动程序 11.3.1 块设备驱动程序的注册 11.3.2 块设备基于缓冲区的数据交换 11.3.3 块设备驱动程序的几个函数 11.3.4 RAM 盘驱动程序的实现 11.3.5 硬盘驱动程序的实现 11.4 字符设备驱动程序 11.4.1 简单字符设备驱动程序 11.4.2 字符设备驱动程序的注册 11.4.3 一个字符设备驱动程序的实例 11.4.4 驱动程序的编译与装载 第十二章 网络 12.1 概述 12.2 网络协议 12.2.1 网络参考模型 12.2.2 TCP/IP 协议工作原理及数据流 12.2.3 Internet 协议 12.2.4 TCP协议 12.3 套接字(socket) 12.3.1 套接字在网络中的地位和作用 12.3.2 套接字接口的种类 12.3.3 套接字的工作原理 12.3.4 socket 的通信过程 12.3.5 socket为用户提供的系统调用 12.4 套接字缓冲区(sk_buff) 12.4.1 套接字缓冲区的特点 12.4.2 套接字缓冲区操作基本原理 12.4.3 sk_buff数据结构的核心内容 12.4.4 套接字缓冲区提供的函数 12.4.5 套接字缓冲区的上层支持例程 12.5 网络设备接口 12.5.1 基本结构 12.5.2 命名规则 12.5.3 设备注册 12.5.4 网络设备数据结构 12.5.5 支持函数 第十三章 启动系统 13.1 初始化流程 13.1.1 系统加电或复位 13.1.2 BIOS启动 13.1.3 Boot Loader 13.1.4 操作系统的初始化 13.2 初始化的任务 13.2.1 处理器对初始化的影响 13.2.2 其他硬件设备对处理器的影响 13.3 Linux 的Boot Loarder 13.3.1 软盘的结构 13.3.2 硬盘的结构 13.3.3 Boot Loader 13.3.4 LILO 13.3.5 LILO的运行分析 13.4 进入操作系统 13.4.1 Setup.S 13.4.2 Head.S 13.5 main.c中的初始化 13.6 建立init进程 13.6.1 init进程的建立 13.6.2 启动所需的Shell脚本文件 附录: 1 Linux 2.4内核API 2.1 驱动程序的基本函数 2.2 双向循环链表的操作 2.3 基本C库函数 2.4 Linux内存管理中Slab缓冲区 2.5 Linux中的VFS 2.6 Linux的连网 2.7 网络设备支持 2.8 模块支持 2.9 硬件接口 2.10 块设备 2.11 USB 设备 2 参考文献
linux内核编程--0内核源码目录(3.0.1版本)
一、  官网下载的3.0.1<em>内核源码</em>解压说明:之所有选择3.0.1内核版本源码,是因为其相对于2.6.24及后续2.6版本比较新,而相对于最新的内核版本源码(4.16)也不算太古老。Linux内核以稳定闻名,因而选择中间3.0第一个版本进行分析,后续内核代码更新也与此版本差异不大,读者可以基于此目录分析自行查阅。二、  Linux<em>内核源码</em>目录普通文件.gitignoregit的版本管理文件。我们都...
linux 源码阅读网站
https://elixir.bootlin.com/
SourceInsight查看Linux内核源码
1.下载源码rnhttps://www.kernel.org/pub/<em>linux</em>/kernel/rn下载后解压即可rnrnrn2.打开SourceInsight,创建工程rn点击顶部Project菜单rnrnrn3.将源码文件导入工程rnrnrnrn4.查看源码
Vim浏览linux kernel代码的环境搭建
Vim浏览<em>linux</em> kernel代码的环境搭建n实现功能:目录树、当前文件符号列表、全局符号索引、自动补全、文件索引、自动缩进、历史文件列表、代码编译
linux内核源码阅读顺序
内存管理,文件系统,块设备,字符设备这些部分,那些在实际开发中用的比较多(嵌入式中哦),那个更重要些,应该侧重哪一部分,现在在看<em>linux</em>内核完全剖析,讲得是0.11的,2.60的已经改了很多了,不知道看这还有什么意义了,进程调度基本都变了,文件系统也不同了,内存管理早都改了,不知道该不该继续下去了,大家给个建议吧,谢谢了rn还有就是嵌入式系统在工业控制中都有那些应用,要怎么学习,是不是要有自动化,电子,机械方面的知识哦
阅读linux内核源码的疑惑
<em>linux</em><em>内核源码</em>中为何在不同的目录下有很多重名的头文件和c文件
在线阅读Linux的内核源码
网站: https://code.woboq.org/<em>linux</em>/<em>linux</em>/
用Source Insight打开linux内核源代码
用Source Insight打开<em>linux</em>内核源代码.
使用Source Insight查看内核源码
一、打开Source Insight软件nn二、新建工程添加工程目录nn在上方菜单栏中选择Project-》new Project的选项,填写工程名称,和存储位置,如下图所示。nnnn比如我要看<em>linux</em>-3.10的内核,我就命名为Linux-3.10,同时将存储地址直接设置为我源码所在的目录下。nn下图直接点确定即可nnnn三、添加内容nn上图中确认之后,出现下图所示的内容,左边方框为想要查看的...
Linux 内核源码
Linux<em>内核源码</em>Linux<em>内核源码</em>Linux<em>内核源码</em> Linux<em>内核源码</em>
深入分析Linux内核源码
深入分析Linux<em>内核源码</em>深入分析Linux<em>内核源码</em>深入分析Linux<em>内核源码</em>深入分析Linux<em>内核源码</em>深入分析Linux<em>内核源码</em>
Linux环境搭建 | 代码阅读神器——Sourceinsight
Sourceinsight(以下简称SI)是良许使用过的最好用,最顺手,最强大的编辑器,没有之一!它几乎支持所有的语言,包括:C,C++,ASM,HTML等等,能够自动创建并维护它自己高性能的符号数据库,包括函数、method、全局变量、结构、类和工程源文件里定义的其它类型的符号,对于大工程的源码<em>阅读</em>非常方便。nn但是,作为Linux程序员,我们的代码一般放在Linux电脑里。Linux里也有一些...
使用 Eclipse 搭建 Linux 内核开发环境
正文nn  时光流逝,记得十年前还是个游手好闲的少年,无聊时觉得应该分析一下Linux<em>内核源码</em>,没有别的动机,只觉得这样很酷。 n  没有任何项目经验的话,突然眼前出现一个浩大的工程,除了惊叹之余,再无其他可言。Linux内核的学习曲线可能陡峭了一点,如果没有点定力的话,是不会有什么进步的。 n  当把几十MB的tar包下载到本地后,打开方式便成了困扰我的一个问题,前前后后使用过好多工具,但都有一...
Linux内核源码阅读之系统调用sys_write()
本篇文章仅做sys_write()源码<em>阅读</em>后的记录,从自己的思路叙述,比较随意,仅做本人<em>阅读</em>存档。sys_write()是<em>linux</em>文件系统中核心函数之一,它完成的操作是将用户缓冲区的文件内容写入到文件在磁盘中的对应位置。1.文件页面缓存要想理解Linux文件读写过程,首先需要明白<em>linux</em>对文件读写的设计,具体就是文件数据在内存中的组织方式。我们先看一张图(摘自<em>linux</em>内核情景分析)我们可以先...
Linux内核源代码情景分析笔记
Linux内核源代码情景分析笔记好吧,首先我承认我要是读者的话,这篇文章我看着也头疼,因为写的太长太泛(其主要部分集中在内存管理,进程管理,文件系统)!原本是想按自己理解的精简精简的,按照操作系统中两个核心的抽象概念“进程”和“文件”开始介绍的,可以说操作系统引入这两个概念是系统的核心,其中进程的管理可以说是对内存和cpu的抽象管理,当然基础内存管理是必须的。而文件可以说是对设备的一层抽象(不仅仅是
linux内核源码解压
以<em>linux</em> 4.18.9为例n到https://www.kernel.org/下载<em>内核源码</em>压缩包<em>linux</em>-4.18.9.tar.xzn不要在windows环境下解压,windows环境下不区分大小写,因为同名(大小写)会丢失一些coden可以使用winscp工具将<em>linux</em>源码压缩包传到<em>linux</em>环境下nnxz -d <em>linux</em>-4.18.9.tar.xz 解压为<em>linux</em>-4.18.9.t...
[Linux内核源码].linux-2.6.16.18.tar.bz2.part1.rar
[Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part1.rar [Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part1.rar [Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part1.rar [Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part1.rar
linux2.6内核源码下载地址
在此网站下载所有<em>linux</em>版本的源码,当然也可以通过git的方式去github上直接 拉取,但是不知道怎样拉取2.6版本的-_-rnrnhttps://git.kernel.org/rnrnrn2.6版本的地址是:rnrnhttps://git.kernel.org/pub/scm/<em>linux</em>/kernel/git/stable/<em>linux</em>-stable.git/refs/?h=<em>linux</em>-2.6
[Linux内核源码].linux-2.6.16.18.tar.bz2.part2.rar
[Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part2.rar [Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part2.rar [Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part2.rar [Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part2.rar
[Linux内核源码].linux-2.6.16.18.tar.bz2.part3.rar
[Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part3.rar [Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part3.rar [Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part3.rar [Linux<em>内核源码</em>].<em>linux</em>-2.6.16.18.tar.bz2.part3.rar
linux 1.15.7 内核源码
<em>linux</em> 1.15.7 <em>内核源码</em><em>linux</em> 1.15.7 <em>内核源码</em><em>linux</em> 1.15.7 <em>内核源码</em><em>linux</em> 1.15.7 <em>内核源码</em>
linux-2.6.20.part02.rar
<em>linux</em> 2.6.20<em>内核源码</em> <em>linux</em> 2.6.20<em>内核源码</em> <em>linux</em> 2.6.20<em>内核源码</em>
linux0.01版源码和中文教材
本书是为那些想了解Linux 内核工作原理的Linux 狂热爱好者而写它并非一本内部 手册主要描叙了Linux设计的原理与机制以及Linux内核怎样工作及其原因 Linux还在不断改进本书基于目前比较流行且性能稳定的2.0.33 核心
linux内核 0.11版本源码 带中文注释
目录树 下面再给个样例 ├─Makefile │ ├─boot │ bootsect.s │ head.s │ setup.s │ ├─fs │ bitmap.c │ block_dev.c │ buffer.c │ char_dev.c │ exec.c │ fcntl.c │ file_dev.c │ file_table.c │ inode.c │ ioctl.c │ Makefile │ namei.c │ open.c │ pipe.c │ read_write.c │ stat.c │ super.c │ truncate.c │ ├─include │ │ a.out.h │ │ const.h │ │ ctype.h │ │ errno.h │ │ fcntl.h │ │ signal.h │ │ stdarg.h │ │ stddef.h │ │ string.h │ │ termios.h │ │ time.h │ │ unistd.h │ │ utime.h │ │ │ ├─asm │ │ io.h │ │ memory.h │ │ segment.h │ │ system.h │ │ │ ├─<em>linux</em> │ │ config.h │ │ fs.h │ │ hdreg.h │ │ head.h │ │ kernel.h │ │ mm.h │ │ sched.h │ │ sys.h │ │ tty.h │ │ │ └─sys │ stat.h │ times.h │ types.h │ utsname.h │ wait.h │ ├─init │ main.c │ ├─kernel │ │ asm.s │ │ exit.c │ │ fork.c │ │ mktime.c │ │ panic.c │ │ printk.c │ │ sched.c │ │ signal.c │ │ sys.c │ │ system_call.s │ │ vsprintf.c │ │ │ ├─blk_drv │ │ blk.h │ │ floppy.c │ │ hd.c │ │ ll_rw_blk.c │ │ Makefile │ │ ramdisk.c │ │ │ ├─chr_drv │ │ console.c │ │ keyboard.S │ │ Makefile │ │ rs_io.s │ │ serial.c │ │ tty_io.c │ │ tty_ioctl.c │ │ │ └─math │ Makefile │ math_emulate. │ ├─lib │ close.c │ ctype.c │ dup.c │ errno.c │ execve.c │ Makefile │ malloc.c │ open.c │ setsid.c │ string.c │ wait.c │ write.c │ _exit.c │ ├─mm │ Makefile │ memory.c │ page.s │ └─tools build.c 样例 main。c 用sourceinsight软件<em>阅读</em> 很方便 /* * <em>linux</em>/init/main.c * * (C) 1991 Linus Torvalds */ #define __LIBRARY__ // 定义该变量是为了包括定义在unistd.h 中的内嵌汇编代码等信息。 #include // *.h 头文件所在的默认目录是include/,则在代码中就不用明确指明位置。 // 如果不是UNIX 的标准头文件,则需要指明所在的目录,并用双引号括住。 // 标准符号常数与类型文件。定义了各种符号常数和类型,并申明了各种函数。 // 如果定义了__LIBRARY__,则还包括系统调用号和内嵌汇编代码_syscall0()等。 #include // 时间类型头文件。其中最主要定义了tm 结构和一些有关时间的函数原形。 /* * we need this inline - forking from kernel space will result * in NO COPY ON WRITE (!!!), until an execve is executed. This * is no problem, but for the stack. This is handled by not letting * main() use the stack at all after fork(). Thus, no function * calls - which means inline code for fork too, as otherwise we * would use the stack upon exit from 'fork()'. * * Actually only pause and fork are needed inline, so that there * won't be any messing with the stack from main(), but we define * some others too. */ /* * 我们需要下面这些内嵌语句 - 从内核空间创建进程(forking)将导致没有写时复制(COPY ON WRITE)!!! * 直到一个执行execve 调用。这对堆栈可能带来问题。处理的方法是在fork()调用之后不让main()使用 * 任何堆栈。因此就不能有函数调用 - 这意味着fork 也要使用内嵌的代码,否则我们在从fork()退出 * 时就要使用堆栈了。 * 实际上只有pause 和fork 需要使用内嵌方式,以保证从main()中不会弄乱堆栈,但是我们同时还 * 定义了其它一些函数。 */ static inline _syscall0 (int, fork) // 是unistd.h 中的内嵌宏代码。以嵌入汇编的形式调用 // Linux 的系统调用中断0x80。该中断是所有系统调用的 // 入口。该条语句实际上是int fork()创建进程系统调用。 // syscall0 名称中最后的0 表示无参数,1 表示1 个参数。 static inline _syscall0 (int, pause) // int pause()系统调用:暂停进程的执行,直到 // 收到一个信号。 static inline _syscall1 (int, setup, void *, BIOS) // int setup(void * BIOS)系统调用,仅用于 // <em>linux</em> 初始化(仅在这个程序中被调用)。 static inline _syscall0 (int, sync) // int sync()系统调用:更新文件系统。 #include // tty 头文件,定义了有关tty_io,串行通信方面的参数、常数。 #include // 调度程序头文件,定义了任务结构task_struct、第1 个初始任务 // 的数据。还有一些以宏的形式定义的有关描述符参数设置和获取的 // 嵌入式汇编函数程序。 #include // head 头文件,定义了段描述符的简单结构,和几个选择符常量。 #include // 系统头文件。以宏的形式定义了许多有关设置或修改 // 描述符/中断门等的嵌入式汇编子程序。 #include // io 头文件。以宏的嵌入汇编程序形式定义对io 端口操作的函数。 #include // 标准定义头文件。定义了NULL, offsetof(TYPE, MEMBER)。 #include // 标准参数头文件。以宏的形式定义变量参数列表。主要说明了-个 // 类型(va_list)和三个宏(va_start, va_arg 和va_end),vsprintf、 // vprintf、vfprintf。 #include #include // 文件控制头文件。用于文件及其描述符的操作控制常数符号的定义。 #include // 类型头文件。定义了基本的系统数据类型。 #include // 文件系统头文件。定义文件表结构(file,buffer_head,m_inode 等)。 static char printbuf[1024]; // 静态字符串数组。 extern int vsprintf (); // 送格式化输出到一字符串中(在kernel/vsprintf.c,92 行)。 extern void init (void); // 函数原形,初始化(在168 行)。 extern void blk_dev_init (void); // 块设备初始化子程序(kernel/blk_drv/ll_rw_blk.c,157 行) extern void chr_dev_init (void); // 字符设备初始化(kernel/chr_drv/tty_io.c, 347 行) extern void hd_init (void); // 硬盘初始化程序(kernel/blk_drv/hd.c, 343 行) extern void floppy_init (void); // 软驱初始化程序(kernel/blk_drv/floppy.c, 457 行) extern void mem_init (long start, long end); // 内存管理初始化(mm/memory.c, 399 行) extern long rd_init (long mem_start, int length); //虚拟盘初始化(kernel/blk_drv/ramdisk.c,52) extern long kernel_mktime (struct tm *tm); // 建立内核时间(秒)。 extern long startup_time; // 内核启动时间(开机时间)(秒)。 /* * This is set up by the setup-routine at boot-time */ /* * 以下这些数据是由setup.s 程序在引导时间设置的(参见第2 章2.3.1 节中的表2.1)。 */ #define EXT_MEM_K (*(unsigned short *)0x90002) // 1M 以后的扩展内存大小(KB)。 #define DRIVE_INFO (*(struct drive_info *)0x90080) // 硬盘参数表基址。 #define ORIG_ROOT_DEV (*(unsigned short *)0x901FC) // 根文件系统所在设备号。 /* * Yeah, yeah, it's ugly, but I cannot find how to do this correctly * and this seems to work. I anybody has more info on the real-time * clock I'd be interested. Most of this was trial and error, and some * bios-listing reading. Urghh. */ /* * 是啊,是啊,下面这段程序很差劲,但我不知道如何正确地实现,而且好象它还能运行。如果有 * 关于实时时钟更多的资料,那我很感兴趣。这些都是试探出来的,以及看了一些bios 程序,呵! */ #define CMOS_READ(addr) ({ \ // 这段宏读取CMOS 实时时钟信息。 outb_p (0x80 | addr, 0x70); \ // 0x70 是写端口号,0x80|addr 是要读取的CMOS 内存地址。 inb_p (0x71); \ // 0x71 是读端口号。 } ) #define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10) // 将BCD 码转换成数字。 static void time_init (void) // 该子程序取CMOS 时钟,并设置开机时间??startup_time(秒)。 { struct tm time; do { time.tm_sec = CMOS_READ (0); // 参见后面CMOS 内存列表。 time.tm_min = CMOS_READ (2); time.tm_hour = CMOS_READ (4); time.tm_mday = CMOS_READ (7); time.tm_mon = CMOS_READ (8); time.tm_year = CMOS_READ (9); } while (time.tm_sec != CMOS_READ (0)); BCD_TO_BIN (time.tm_sec); BCD_TO_BIN (time.tm_min); BCD_TO_BIN (time.tm_hour); BCD_TO_BIN (time.tm_mday); BCD_TO_BIN (time.tm_mon); BCD_TO_BIN (time.tm_year); time.tm_mon--; startup_time = kernel_mktime (&time); } static long memory_end = 0; // 机器具有的内存(字节数)。 static long buffer_memory_end = 0; // 高速缓冲区末端地址。 static long main_memory_start = 0; // 主内存(将用于分页)开始的位置。 struct drive_info { char dummy[32]; } drive_info; // 用于存放硬盘参数表信息。 void main (void) /* This really IS void, no error here. */ { /* The startup routine assumes (well, ...) this */ /* 这里确实是void,并没错。在startup 程序(head.s)中就是这样假设的。 */ // 参见head.s 程序第136 行开始的几行代码。 /* * Interrupts are still disabled. Do necessary setups, then * enable them */ /* * 此时中断仍被禁止着,做完必要的设置后就将其开启。 */ // 下面这段代码用于保存: // 根设备号 ??ROOT_DEV; 高速缓存末端地址??buffer_memory_end; // 机器内存数??memory_end;主内存开始地址 ??main_memory_start; ROOT_DEV = ORIG_ROOT_DEV; drive_info = DRIVE_INFO; memory_end = (1 << 20) + (EXT_MEM_K << 10); // 内存大小=1Mb 字节+扩展内存(k)*1024 字节。 memory_end &= 0xfffff000; // 忽略不到4Kb(1 页)的内存数。 if (memory_end > 16 * 1024 * 1024) // 如果内存超过16Mb,则按16Mb 计。 memory_end = 16 * 1024 * 1024; if (memory_end > 12 * 1024 * 1024) // 如果内存>12Mb,则设置缓冲区末端=4Mb buffer_memory_end = 4 * 1024 * 1024; else if (memory_end > 6 * 1024 * 1024) // 否则如果内存>6Mb,则设置缓冲区末端=2Mb buffer_memory_end = 2 * 1024 * 1024; else buffer_memory_end = 1 * 1024 * 1024; // 否则则设置缓冲区末端=1Mb main_memory_start = buffer_memory_end; // 主内存起始位置=缓冲区末端; #ifdef RAMDISK // 如果定义了虚拟盘,则主内存将减少。 main_memory_start += rd_init (main_memory_start, RAMDISK * 1024); #endif // 以下是内核进行所有方面的初始化工作。<em>阅读</em>时最好跟着调用的程序深入进去看,实在看 // 不下去了,就先放一放,看下一个初始化调用 -- 这是经验之谈?。 mem_init (main_memory_start, memory_end); trap_init (); // 陷阱门(硬件中断向量)初始化。(kernel/traps.c,181 行) blk_dev_init (); // 块设备初始化。 (kernel/blk_dev/ll_rw_blk.c,157 行) chr_dev_init (); // 字符设备初始化。 (kernel/chr_dev/tty_io.c,347 行) tty_init (); // tty 初始化。 (kernel/chr_dev/tty_io.c,105 行) time_init (); // 设置开机启动时间??startup_time(见76 行)。 sched_init (); // 调度程序初始化(加载了任务0 的tr, ldtr) (kernel/sched.c,385) buffer_init (buffer_memory_end); // 缓冲管理初始化,建内存链表等。(fs/buffer.c,348) hd_init (); // 硬盘初始化。 (kernel/blk_dev/hd.c,343 行) floppy_init (); // 软驱初始化。 (kernel/blk_dev/floppy.c,457 行) sti (); // 所有初始化工作都做完了,开启中断。 // 下面过程通过在堆栈中设置的参数,利用中断返回指令切换到任务0。 move_to_user_mode (); // 移到用户模式。 (include/asm/system.h,第1 行) if (!fork ()) { /* we count on this going ok */ init (); } /* * NOTE!! For any other task 'pause()' would mean we have to get a * signal to awaken, but task0 is the sole exception (see 'schedule()') * as task 0 gets activated at every idle moment (when no other tasks * can run). For task0 'pause()' just means we go check if some other * task can run, and if not we return here. */ /* 注意!! 对于任何其它的任务,'pause()'将意味着我们必须等待收到一个信号才会返 * 回就绪运行态,但任务0(task0)是唯一的意外情况(参见'schedule()'),因为任务0 在 * 任何空闲时间里都会被激活(当没有其它任务在运行时),因此对于任务0'pause()'仅意味着 * 我们返回来查看是否有其它任务可以运行,如果没有的话我们就回到这里,一直循环执行'pause()'。 */ for (;;) pause (); } static int printf (const char *fmt, ...) // 产生格式化信息并输出到标准输出设备stdout(1),这里是指屏幕上显示。参数'*fmt'指定输出将 // 采用的格式,参见各种标准C 语言书籍。该子程序正好是vsprintf 如何使用的一个例子。 // 该程序使用vsprintf()将格式化的字符串放入printbuf 缓冲区,然后用write()将缓冲区的内容 // 输出到标准设备(1--stdout)。 { va_list args; int i; va_start (args, fmt); write (1, printbuf, i = vsprintf (printbuf, fmt, args)); va_end (args); return i; } static char *argv_rc[] = { "/bin/sh", NULL}; // 调用执行程序时参数的字符串数组。 static char *envp_rc[] = { "HOME=/", NULL}; // 调用执行程序时的环境字符串数组。 static char *argv[] = { "-/bin/sh", NULL}; // 同上。 static char *envp[] = { "HOME=/usr/root", NULL}; void init (void) { int pid, i; // 读取硬盘参数包括分区表信息并建立虚拟盘和安装根文件系统设备。 // 该函数是在25 行上的宏定义的,对应函数是sys_setup(),在kernel/blk_drv/hd.c,71 行。 setup ((void *) &drive_info); (void) open ("/dev/tty0", O_RDWR, 0); // 用读写访问方式打开设备“/dev/tty0”, // 这里对应终端控制台。 // 返回的句柄号0 -- stdin 标准输入设备。 (void) dup (0); // 复制句柄,产生句柄1 号 -- stdout 标准输出设备。 (void) dup (0); // 复制句柄,产生句柄2 号 -- stderr 标准出错输出设备。 printf ("%d buffers = %d bytes buffer space\n\r", NR_BUFFERS, NR_BUFFERS * BLOCK_SIZE); // 打印缓冲区块数和总字节数,每块1024 字节。 printf ("Free mem: %d bytes\n\r", memory_end - main_memory_start); //空闲内存字节数。 // 下面fork()用于创建一个子进程(子任务)。对于被创建的子进程,fork()将返回0 值, // 对于原(父进程)将返回子进程的进程号。所以180-184 句是子进程执行的内容。该子进程 // 关闭了句柄0(stdin),以只读方式打开/etc/rc 文件,并执行/bin/sh 程序,所带参数和 // 环境变量分别由argv_rc 和envp_rc 数组给出。参见后面的描述。 if (!(pid = fork ())) { close (0); if (open ("/etc/rc", O_RDONLY, 0)) _exit (1); // 如果打开文件失败,则退出(/lib/_exit.c,10)。 execve ("/bin/sh", argv_rc, envp_rc); // 装入/bin/sh 程序并执行。 _exit (2); // 若execve()执行失败则退出(出错码2,“文件或目录不存在”)。 } // 下面是父进程执行的语句。wait()是等待子进程停止或终止,其返回值应是子进程的进程号(pid)。 // 这三句的作用是父进程等待子进程的结束。&i 是存放返回状态信息的位置。如果wait()返回值不 // 等于子进程号,则继续等待。 if (pid > 0) while (pid != wait (&i)) /* nothing */ ; // 如果执行到这里,说明刚创建的子进程的执行已停止或终止了。下面循环中首先再创建一个子进程, // 如果出错,则显示“初始化程序创建子进程失败”的信息并继续执行。对于所创建的子进程关闭所有 // 以前还遗留的句柄(stdin, stdout, stderr),新创建一个会话并设置进程组号,然后重新打开 // /dev/tty0 作为stdin,并复制成stdout 和stderr。再次执行系统解释程序/bin/sh。但这次执行所 // 选用的参数和环境数组另选了一套(见上面165-167 行)。然后父进程再次运行wait()等待。如果 // 子进程又停止了执行,则在标准输出上显示出错信息“子进程pid 停止了运行,返回码是i”,然后 // 继续重试下去…,形成“大”死循环。 while (1) { if ((pid = fork ()) < 0) { printf ("Fork failed in init\r\n"); continue; } if (!pid) { close (0); close (1); close (2); setsid (); (void) open ("/dev/tty0", O_RDWR, 0); (void) dup (0); (void) dup (0); _exit (execve ("/bin/sh", argv, envp)); } while (1) if (pid == wait (&i)) break; printf ("\n\rchild %d died with code %04x\n\r", pid, i); sync (); } _exit (0); /* NOTE! _exit, not exit() */ }
你为什么看不懂Linux内核驱动源码?
学习嵌入式Linux驱动开发,最核心的技能就是能够编写Linux内核驱动、深入理解Linux内核。而做到这一步的基础,就是你要看得懂Linux<em>内核源码</em>,了解其基本的框架和具体实现,了解其内核API的使用方法,然后才能根据自己的需求写出高质量的内核驱动程序。nn说易行难,很多新人、甚至工作1-2年的开发者刚接触Linux内核时,别说写了,看内核代码可能都是一脸懵逼:明明是C语言,但是就是看不懂是什么...
Mac上强大的源码阅读工具--Understand
就一句话:堪比SourceInsight,甚至更强大。 n  官网:https://scitools.com/ n  下载地址:http://pan.baidu.com/s/1o6imTqa n  (把整个文件夹拖进“应用程序”,从文件夹的bin/macosx里面找到“Understand”图标启动程序。) n  破解办法:去下载一个windows版本的注册机,算出注册码即可 。 n  中文指南:h
[Linux内核源码][1].linux-2.6.11.12.tar.bz2
[Linux<em>内核源码</em>][1].<em>linux</em>-2.6.11.12.tar.bz2 [Linux<em>内核源码</em>][1].<em>linux</em>-2.6.11.12.tar.bz2 [Linux<em>内核源码</em>][1].<em>linux</em>-2.6.11.12.tar.bz2
linux 内核源码的分析与讲解
<em>linux</em> <em>内核源码</em>的分析与讲解 <em>linux</em> <em>内核源码</em>的分析与讲解 <em>linux</em> <em>内核源码</em>的分析与讲解
Android Kernel 源码在线阅读与下载
为了学习Binder Driver的运行原理,必须分析其源码,这才发现下载的Android5.1 AOSP源码中居然没有kernel这个文件夹。那我们到哪儿去找Kernel源码呢?
linux在线源码阅读推荐网址
http://lxr.<em>linux</em>.no/ nhttp://fxr.watson.org/
centos 7.1 获取内核源码
centos 7.1 中默认的<em>内核源码</em>路径为 /usr/src/uname -r,但是它不包含源码,只包含了Kconfig 和 Makefile查看系统内核版本uname -r //查看系统内核ncat /etc/redhat-release //操作系统版本输出结果 n内核版本:3.10.0-229.el7.x86_64 n操作系统版本:CentOS Linux release 7.1.15
Centos获取内核源码
一、获取Centos版本以下二种方法适用于RedHat,CentOS# cat /etc/redhat-releasenCentOS release 5.4 (Final)n登录到<em>linux</em>执行rpm -q redhat-release #rpm -q redhat-releasen或CentOS# rpm -q centos-releasencentos-release-7-0.1406.el7.
下载centos内核源代码
刚开始写驱动时遇到的问题
Linux内核源代码情景分析(全册高清带书签)
经典书籍-LINUX内核源代码情景分析,全面深入地剖析了Linux较新版本核心源代码,并对Linux核心的独特优点和需要进一步改进的问题作了精辟的评述。
read代码阅读一(linux3.10.14)
本文对read涉及的各个模块做个简单描述,具体的细节在后面文章中描述。
Linux内核源码阅读之系统调用mmap()
mmap()nn将一个已经打开的文件的内容映射的它的用户空间。nn1.解释nn“文件的内容映射的它的用户空间”是什么意思?nn我们知道<em>linux</em>内核中,物理内存在内存中以页面大小为单位进行维护,而页式内存管理简单的说是给定一个虚拟地址0xA,经过页式映射,能够找到物理内存所对应的页面地址,数据真正存放的位置。nnLinux内存管理以页面为单位,对用户空间的管理当然也是以页面为单位,而每个虚存地址都...
推荐一款比较好用的Linux内核代码编辑器
    博主之前用soureinsight+samba形式来开发驱动,不过由于soureinsight在samba网络协议下同步代码太慢了,而且soureinsight用的是破解版。n    所以,为了提高效率在网络上搜了很多文章,大部分都推荐字符界面操作的编辑器。。不过直到我看到了vs code它支持window、Linux64位环境。对于部分Linux开发者以虚拟机+samba环境来说vs c...
kernel 源码浏览网站
http://code.woboq.org/<em>linux</em>/<em>linux</em>/  在线浏览kernel 源码。强烈推荐.nnhttp://lxr.free-electrons.com/nnhttps://www.kernel.org/doc/html/latest/ 内核文档nnhttp://www.brendangregg.com/ 系统调优nngit clone --depth 1 https://gi...
Linux内核源码情景分析.rar
Linux<em>内核源码</em>情景分析.rar Linux<em>内核源码</em>情景分析.rar
编译AOSP方便阅读源码
背景: n 下载完成AOSP<em>阅读</em>源码的过程中,由于代码量打,如果使用日志的方式来判断业务流程怎么走会提升效率,因此怎样才能正确的使用log日志有助于快速<em>阅读</em>是这部分文档的目的。分析: n1.下载AOSP。 n1.1AOSP在国内可以使用TUNA的镜像,具体的方法如下面的链接: nhttps://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ n1.2下载完成
Linux 下源代码阅读工具 —— vim + TagList + CTags
为什么不采用 Windows 下较为著名的源代码<em>阅读</em>软件 SourceInsight,n其一,其在 Linux 下的安装较为繁琐;n其二,切换代码时背景色的变化会为人的眼部产生极为不舒服的感觉;n其三,Linux 下自有自己的一套实用工具:vim,TagList,Ctagsn其四,很多 Linux 的软件开发实际在不使用 X Window 的情况下进行的,这时不可能启动基于 X Window 的图形
ubuntu 下如何下载linux内核源码
1.首先看一下自己的内核版本,如果不想下载和自己正在使用的内核匹配的版本,可以忽略这一步。nnnn2.下载内核代码,98M,速度比较快,nnnn3.完成后,到/usr/src中查看你已经下载好的源码nnnn4.现在可以进行解压了,nn解压之前先复习一下tar命令把nn nn-c: 建立压缩档案nn-x:解压nn-t:查看内容nn-r:向压缩归档文件末尾追加文件nn-u:更新原压缩包中的文件nn-z...
Debian8安装内核源码
下载<em>内核源码</em>nn安装生成源码时需要的开发工具套件,以及用来解压源码包并自动打补丁的工具dpkg-sourcennsudo apt-get install dpkg-devnn下载完整的<em>内核源码</em>nnnnsudo apt-get source <em>linux</em>-image-$(uname -r)nn生成的文件:nnnn<em>linux</em>-4.8.11 dpkg-source将下载的<em>内核源码</em>自动解压到当前目录nli
Linux内核源码学习(1)
一,内核简介
精确制导 --- 把linux内核源码中需要的代码导入Source Insight
本文是受到这篇文章的启发:http://www.cnblogs.com/mouou/p/4599148.html n该作者使用shell编程,运行起来会比较耗时,所以这里使用C++按照作者思路重新编写一遍,提高效率,也算是练一下手。nn一 问题由来nn<em>linux</em><em>内核源码</em>比较庞大,在导入到source insight时会非常耗时,而且导入后查看代码时也会遇到诸多问题,如函数的重复定义,软件崩溃等。而...
学习linux-0.11内核——搭建环境(编译、调试bootsec)
编译内核nn获取内核代码nnnngit clone https://github.com/jmhIcoding/<em>linux</em>_kernel12.gitngit checkout checknn其中 <em>linux</em>_kernel12的目录结构为:nnnn·n|n|————source_code 原始<em>linux</em>-0.11代码,里面有vs2015的工程文件,可以方便的看代码n|n|----source_co...
Linux 0.12内核源码
Linux 0.12<em>内核源码</em>,适合Linux入门学习。比高版本的<em>内核源码</em>更适合了解Linux框架
2、ubuntu下如何获取内核源码
我的是ubuntu16.04 , <em>内核源码</em>目录位于 /usr/src 目录下, 没有下载<em>内核源码</em>时,只有两个文件夹  <em>linux</em>-header-4.10.0-28 和 <em>linux</em>-headers-4.10.0-28-generic ;使用 sudo apt install <em>linux</em>-source 会后下载<em>内核源码</em>到这个目录下载完成将压缩包文件解压即可。...
Ubuntu搭建OpenGrok环境阅读Linux内核源代码
CSDNn GitHub Ubuntu搭建OpenGrok环境<em>阅读</em>Linux内核源代码n AderXCoding/system/tools/opengrok n本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处 n1 OpenGrok介绍OpenGrok 是一个快速, 便于使用的源码搜索引擎与对照引擎, 它能够帮助我们快速的搜索、定位、对照代码
linux内核源代码 0.00版本 最适合把玩操作系统的同学
<em>linux</em>内核源代码 0.00版本 最适合把玩操作系统的同学 <em>linux</em>最老的源码,只是实现在两个进程间切换。
Linux0.0.1 源代码 代中文注释
Linux0.0.1的源代码,带中文的注释,是研究操作系统的不错选择。资源已经非常难得了。
linux内核源码
<em>linux</em><em>内核源码</em>
Linux内核源码0.11版本
完整的<em>内核源码</em>可以供个人学习Linux内核作为必不可少的资料使用
linux内核源码的个人理解
@<em>linux</em><em>内核源码</em>的个人理解nSET_USER_NICEn首先,我简单的介绍一下SET_USER_NICE源码的大致功能:n就简单地从字面意思上看,SET:设置、USER:用户、NICE:优先级的值。所以SET_USER_NICE连起来就是设置用户的优先级,也就是设置进程的优先级。nNICE是反应进程优先级的一个值,范围是[-19,+20],一共有40个值,值越小,代表的优先级更高;反之,值越大...
下载Linux内核源码
浏览器登陆Linux的内核网址https://mirrors.edge.kernel.org/pub/<em>linux</em>/kernel/选中自己的需要的版本下载解压后就OK了。n
Linux-2.6 所有版本内核源码下载
在这里分享给大家一个链接,链接里面有Linux-2.6所有版本的下载链接,可以复制到迅雷上面一件下载,2.6版本还是比较适合用来剖析的,往上就有点难了。 n  n下载地址:https://www.kernel.org/pub/<em>linux</em>/kernel/v2.6/ n  n拿走 :)
linux0.11内核源码
这个是0.11版Linux<em>内核源码</em>,其中每一行都含有中文注释,能够帮且初学者快速入门Linux内核
Linux各版本内核源码下载地址
ftp://ftp.kernel.org/pub/<em>linux</em>/kernel
Linux内核完全注释(内核版本0.11)及源码
Linux内核完全注释(内核版本0.11)及源码
centos的linux内核源码下载方法
在刚开始学<em>linux</em>驱动时遇到的问题
读《linux0.11 内核完全解析》的一点感受
为了看懂《Linux内核完全剖析》决定动手写一个操作系统。从7月开始写,到今天才完成了从启动代码到main函数,以及中断处理。已经enable了时钟中断了键盘中断,可以在屏幕上打字母。接下里还要写文件系统,内存管理和进程管理。直到写出一个shell程序。这期间参考了《x86汇编-从实模式到保护模式》和《自己动手写操作系统》的代码,有些直接拿来抄了,在此对李忠等及于渊几位作者表示感谢。nn今天想跟记...
Linux_内核完全注释_V11.pdf
Linux<em>内核源码</em>学习书籍,讲解详细 Linux<em>内核源码</em>学习书籍,讲解详细
linux-4.15.tar.xz linux内核源码
如标题描述,很清楚了,是当前最新版本的 <em>linux</em> <em>内核源码</em>,方便编译移植到不同平台,官网下载可能太慢了。
linux-2.6.27.14.tar.bz2
<em>linux</em><em>内核源码</em><em>linux</em>-2.6.27.14.tar.bz2
linux-4.18.6
<em>linux</em> <em>内核源码</em>  <em>linux</em>-4.18.6
linux2.6.1内核源码注释
包含LINUX内核同步、信号、内存、调度、文件系统、网络系统、时钟等部分的源码注释。前后历时三年,算是干货。
linux 内核源码情景分析
<em>linux</em> <em>内核源码</em>情景分析
[mini2440]内核源码驱动阅读
mini2440所有驱动都有共同的地方(<em>linux</em>-2.6.32.2\arch\arm\mach-s3c2440\mach-mini2440.c)。nn1.网卡驱动.nna.使用 dm9000.nn代码路径:nn<em>linux</em>-2.6.32.2\drivers\net\dm9000.c 网卡的全部操作硬件的驱动。nn<em>linux</em>-2.6.32.2\arch\arm\mach-s3c2440\mach-m...
红黑树原理浅谈(附Linux内核源码注释)
rn引言:红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由鲁道夫·贝尔发明的,他称之为&amp;quot;对称二叉B树&amp;quot;,它现代的名字是在Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的:它可以在 O(l...
linux4.4内核源码
<em>linux</em>-4.4的<em>内核源码</em>! 配置内核配置内核的方法很多,主要有如下几种:1.      #make menuconfig  //基于ncurse库编制的图形工具界面2.      #make config  //基于文本命令行工具,不推荐使用3.      #make xconfig  //基于X11图形工具界面4.      #make gconfig  //基于gtk+的图形工具界面由于对Linux还处在初学阶段,所以选择了简单的配置内核方法,即make menuconfig。在终端输入make menuconfig,等待几秒后,终端变成图形化的内核配置界面。进行配置时,大部分选项使用其缺省值,只有一小部分需要根据不同的需要选择。对每一个配置选项,用户有三种选择,它们分别代表的含义如下:或[*]——将该功能编译进内核[]——不将该功能编译进内核[M]——将该功能编译成可以在需要时动态插入到内核中的代码说明:笔者输入make menuconfig  后并没有配置其他内核编译配置(因为还不是特别懂),只是试了下此流程,是可用的。4)    编译内核这步是时间最长的一个步骤,一般在2个小时左右。编译内核只需在终端(目录:/usr/src/<em>linux</em>-4.14) 输入:make
《深入分析Linux内核源码》[陈莉君老师著].rar
第一章 走进<em>linux</em> 1.1 GNU与Linux的成长 1.2 Linux的开发模式和运作机制 1.3走进Linux内核 1.3.1 Linux内核的特征 1.3.2 Linux内核版本的变化 1.4 分析Linux内核的意义 1.4.1 开发适合自己的操作系统 1.4.2 开发高水平软件 1.4.3 有助于计算机科学的教学和科研 1.5 Linux内核结构 1.5.1 Linux内核在整个操系统中的位置 1.5.2 Linux内核的作用 1.5.3 Linux内核的抽象结构 1.6 Linux内核源代码 1.6.1 多版本的内核源代码 1.6.2 Linux内核源代码的结构 1.6.3 从何处开始<em>阅读</em>源代码 1.7 Linux内核源代码分析工具 1.7.1 Linux超文本交叉代码检索工具 1.7.2 Windows平台下的源代码<em>阅读</em>工具Source Insight 第二章 Linux运行的硬件基础 2.1 i386的寄存器 2.1.1通用寄存器 2.1.2段寄存器 2.1.3状态和控制寄存器 2.1.4 系统地址寄存器 2.1.5 调试寄存器和测试寄存器 2.2 内存地址 2.3 段机制和描述符 2.3.1 段机制 2.3.2 描述符的概念 2.3.3系统段描述符 2.3.4 描述符表 2.3.5 选择符与描述符表寄存器 2.3.6 描述符投影寄存器 2.3.7 Linux中的段 2.4 分页机制 2.4.1 分页机构 2.4.2页面高速缓存 2.5 Linux中的分页机制 2.5.1 与页相关的数据结构及宏的定义 2.5.2 对页目录及页表的处理 2.6 Linux中的汇编语言 2.6.1 AT&T与Intel汇编语言的比较 2.6.2 AT&T汇编语言的相关知识 2.6.3 Gcc嵌入式汇编 2.6.4 Intel386汇编指令摘要 第三章中断机制 3.1 中断基本知识 3.1.1 中断向量 3.1.2 外设可屏蔽中断 3.1.3异常及非屏蔽中断 3.1.4中断描述符表 3.1.5 相关汇编指令 3.2中断描述符表的初始化 3.2. 1 外部中断向量的设置 3.2.2中断描述符表IDT的预初始化 3.2.3 中断向量表的最终初始化 3.3异常处理 3.3.1 在内核栈中保存寄存器的值 3.3.2 中断请求队列的初始化 3.3.3中断请求队列的数据结构 3.4 中断处理 3.4.1中断和异常处理的硬件处理 3.4.2 Linux对异常和中断的处理 3.4.3 与堆栈有关的常量、数据结构及宏 3.4.4 中断处理程序的执行 3.4.5 从中断返回 3.5中断的后半部分处理机制 3.5.1 为什么把中断分为两部分来处理 3.5.2 实现机制 3.5.3数据结构的定义 3.5.4 软中断、bh及tasklet的初始化 3.5.5后半部分的执行 3.5.6 把bh移植到tasklet 第四章 进程描述 4.1 进程和程序(Process and Program) 4.2 Linux中的进程概述 4.3 task_struct结构描述 4.4 task_struct结构在内存中的存放 4.4.1 进程内核栈 4.4.2 当前进程(current宏) 4.5 进程组织的方式 4.5.1哈希表 4.5.2双向循环链表 4.5.3 运行队列 4.5.4 等待队列 4.6 内核线程 4.7 进程的权能 4.8 内核同步 4.8.1信号量 4.8.2原子操作 4.8.3 自旋锁、读写自旋锁和大读者自旋锁 4.9 本章小节 第五章进程调度 5.1 Linux时间系统 5.1.1 时钟硬件 5.1.2 时钟运作机制 5.1.3 Linux时间基准 5.1.4 Linux的时间系统 5.2 时钟中断 5.2.1 时钟中断的产生 5.2.2.Linux实现时钟中断的全过程 5.3 Linux的调度程序-Schedule( ) 5.3.1 基本原理 5.3.2 Linux进程调度时机 5.3.3 进程调度的依据 5.3.4 进程可运行程度的衡量 5.3.5 进程调度的实现 5.4 进程切换 5.4.1 硬件支持 5.4.2 进程切换 第六章 Linux内存管理 6.1 Linux的内存管理概述 6.1.1 Linux虚拟内存的实现结构 6.1.2 内核空间和用户空间 6.1.3 虚拟内存实现机制间的关系 6.2 Linux内存管理的初始化 6.2.1 启用分页机制 6.2.2 物理内存的探测 6.2.3 物理内存的描述 6.2.4 页面管理机制的初步建立 6.2.5页表的建立 6.2.6内存管理区 6.3 内存的分配和回收 6.3.1 伙伴算法 6.3.2 物理页面的分配和释放 6.3.3 Slab分配机制 6.4 地址映射机制 6.4.1 描述虚拟空间的数据结构 6.4.2 进程的虚拟空间 6.4.3 内存映射 6.5 请页机制 6.5.1 页故障的产生 6.5.2 页错误的定位 6.5.3 进程地址空间中的缺页异常处理 6.5.4 请求调页 6.5.5 写时复制 6.6 交换机制 6.6.1 交换的基本原理 6.6.2 页面交换守护进程kswapd 6.6.3 交换空间的数据结构 6.6.4 交换空间的应用 6.7 缓存和刷新机制 6.7.1 Linux使用的缓存 6.7.2 缓冲区高速缓存 6.7.3 翻译后援存储器(TLB) 6.7.4 刷新机制 6.8 进程的创建和执行 6.8.1 进程的创建 6.8.2 程序执行 6.8.3 执行函数 第七章 进程间通信 7.1 管道 7.1.1 Linux管道的实现机制 7.1.2 管道的应用 7.1.3 命名管道(FIFO) 7.2 信号(signal) 7.2.1 信号种类 7.2.2 信号掩码 7.2.3 系统调用 7.2.4 典型系统调用的实现 7.2.5 进程与信号的关系 7.2.6 信号举例 7.3 System V 的IPC机制 7.3.1 信号量 7.3.2 消息队列 7.3.3 共享内存 第八章 虚拟文件系统 8.1 概述 8.2 VFS中的数据结构 8.2.1 超级块 8.2.2 VFS的索引节点 8.2.3 目录项对象 8.2.4 与进程相关的文件结构 8.2.5 主要数据结构间的关系 8.2.6 有关操作的数据结构 8.3 高速缓存 8.3.1 块高速缓存 8.3.2 索引节点高速缓存 8.3.3 目录高速缓存 8.4 文件系统的注册、安装与拆卸 8.4.1 文件系统的注册 8.4.2 文件系统的安装 8.4.3 文件系统的卸载 8.5 限额机制 8.6 具体文件系统举例 8.6.1 管道文件系统pipefs 8.6.2 磁盘文件系统BFS 8.7 文件系统的系统调用 8.7.1 open 系统调用 8.7.2 read 系统调用 8.7.3 fcntl 系统调用 8 .8 Linux2.4文件系统的移植问题 第九章 Ext2文件系统 9.1 基本概念 9.2 Ext2的磁盘布局和数据结构 9.2.1 Ext2的磁盘布局 9.2.2 Ext2的超级块 9.2.3 Ext2的索引节点 9.2.4 组描述符 9.2.5 位图 9.2.6 索引节点表及实例分析 9.2.7 Ext2的目录项及文件的定位 9.3 文件的访问权限和安全 9.4 链接文件 9.5 分配策略 9.5.1 数据块寻址 9.5.2 文件的洞 9.5.3 分配一个数据块 第十章 模块机制 10.1 概述 10.1.1 什么是模块 10.1.2 为什么要使用模块? 10.2 实现机制 10.2.1 数据结构 10.2.2 实现机制的分析 10.3 模块的装入和卸载 10.3.1 实现机制 10.3.2 如何插入和卸载模块 10.4 内核版本 10.4.1 内核版本与模块版本的兼容性 10.4.2 从版本2.0到2.2内核API的变化 10.4.3 把内核2.2移植到内核2.4 10.5 编写内核模块 10.5.1 简单内核模块的编写 10.5.2 内核模块的Makefiles文件 10.5.3 内核模块的多个文件 第十一章 设备驱动程序 11.1 概述 11.1.1 I/O软件 11.1.2 设备驱动程序 11.2 设备驱动基础 11.2.1 I/O端口 11.2.2 I/O接口及设备控制器 11.2.3 设备文件 11.2.4 VFS对设备文件的处理 11.2.5 中断处理 11.2.6 驱动DMA工作 11.2.7 I/O 空间的映射 11.2.8 设备驱动程序框架 11.3 块设备驱动程序 11.3.1 块设备驱动程序的注册 11.3.2 块设备基于缓冲区的数据交换 11.3.3 块设备驱动程序的几个函数 11.3.4 RAM 盘驱动程序的实现 11.3.5 硬盘驱动程序的实现 11.4 字符设备驱动程序 11.4.1 简单字符设备驱动程序 11.4.2 字符设备驱动程序的注册 11.4.3 一个字符设备驱动程序的实例 11.4.4 驱动程序的编译与装载 第十二章 网络 12.1 概述 12.2 网络协议 12.2.1 网络参考模型 12.2.2 TCP/IP 协议工作原理及数据流 12.2.3 Internet 协议 12.2.4 TCP协议 12.3 套接字(socket) 12.3.1 套接字在网络中的地位和作用 12.3.2 套接字接口的种类 12.3.3 套接字的工作原理 12.3.4 socket 的通信过程 12.3.5 socket为用户提供的系统调用 12.4 套接字缓冲区(sk_buff) 12.4.1 套接字缓冲区的特点 12.4.2 套接字缓冲区操作基本原理 12.4.3 sk_buff数据结构的核心内容 12.4.4 套接字缓冲区提供的函数 12.4.5 套接字缓冲区的上层支持例程 12.5 网络设备接口 12.5.1 基本结构 12.5.2 命名规则 12.5.3 设备注册 12.5.4 网络设备数据结构 12.5.5 支持函数 第十三章 启动系统 13.1 初始化流程 13.1.1 系统加电或复位 13.1.2 BIOS启动 13.1.3 Boot Loader 13.1.4 操作系统的初始化 13.2 初始化的任务 13.2.1 处理器对初始化的影响 13.2.2 其他硬件设备对处理器的影响 13.3 Linux 的Boot Loarder 13.3.1 软盘的结构 13.3.2 硬盘的结构 13.3.3 Boot Loader 13.3.4 LILO 13.3.5 LILO的运行分析 13.4 进入操作系统 13.4.1 Setup.S 13.4.2 Head.S 13.5 main.c中的初始化 13.6 建立init进程 13.6.1 init进程的建立 13.6.2 启动所需的Shell脚本文件 附录: 1 Linux 2.4内核API 2.1 驱动程序的基本函数 2.2 双向循环链表的操作 2.3 基本C库函数 2.4 Linux内存管理中Slab缓冲区 2.5 Linux中的VFS 2.6 Linux的连网 2.7 网络设备支持 2.8 模块支持 2.9 硬件接口 2.10 块设备 2.11 USB 设备
安装Linux内核源代码【转】
1. 首先要查看内核版本号:rn【root@localhost ~】# uname -r // 查看内核版本号或者uname –arn如果是RHEL5的话内核应该是 2.6.18-8.el5xenrn2. 已经知道自己的内核是“2.6.18-8.el5xen”,可以去此网站rnhttp://www.kernel.org/pub/<em>linux</em>/kernel/v2.6/<em>linux</em>-2.6.16.8.ta...
linux 内核源码
<em>linux</em> <em>内核源码</em> 不错哦
AES代码 可以用的下载
mport java.security.*; import javax.crypto.*; import javax.crypto.spec.*; import java.io.*; /** * This program generates a AES key, retrieves its raw bytes, and * then reinstantiates a AES key from the key bytes. * The reinstantiated key is used to initialize a AES cipher for 相关下载链接:[url=//download.csdn.net/download/wukun1999/2234654?utm_source=bbsseo]//download.csdn.net/download/wukun1999/2234654?utm_source=bbsseo[/url]
firefox beta4 中文版下载
firefox 浏览器 最新beta1 firefox 浏览器 最新beta1 相关下载链接:[url=//download.csdn.net/download/lianghl16849/2530742?utm_source=bbsseo]//download.csdn.net/download/lianghl16849/2530742?utm_source=bbsseo[/url]
linux下tomcat+JDK标准版安装配置说明书下载
本文说明了如何在CentOS 企业版V5.3操作系统上安装配置tomcat以及jdk的安装配置步骤。 相关下载链接:[url=//download.csdn.net/download/babaozhou0/2657663?utm_source=bbsseo]//download.csdn.net/download/babaozhou0/2657663?utm_source=bbsseo[/url]
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 浅谈机器学习基础 浅谈机器学习基础下
我们是很有底线的