linux源码学习
文章平均质量分 77
qing_ping
这个作者很懒,什么都没留下…
展开
-
linux 设备模型(一)对象层
linux提供了新的设备模型:总线(bus)、设备(device)、驱动(driver)。其中总线是处理器与设备之间通道,在设备模型中,所有的设备都通过总线相连;设备是对于一个设备的详细信息描述,驱动是设备的相关驱动。其基本关系如下:bus 相当于一个容器,是device 和device_driver 的管理机构,它包含了一个device 集合和一个driver 集合。其中,device集合包含了原创 2013-12-29 00:13:00 · 899 阅读 · 0 评论 -
Linux中断子系统-中断初始化
前面学习了一下linux中断子系统的中断处理过程,看到中断最终由desc->handle_irq(irq, desc)处理。那它是怎么跟我们注册的中断函数相关联的呢?我们应该怎么样去注册和使用中断呢?下面我们就从中断模型注册入手来继续学习linux的中断系统。 首先是linux中断机制的核心数据结构 irq_desc, 它完整地描述了一条中断线 (或称为 “中断通道” )。其中irq原创 2013-12-25 11:36:35 · 2586 阅读 · 0 评论 -
Linux中断子系统-中断处理
中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常)。在实地址模式中,CPU把内存中从0开始的1KB空间作为一个中断向量表。表中的每一项占4个字节。但是在保护模式中,有这4个字节的表原创 2013-12-24 13:42:00 · 1424 阅读 · 0 评论 -
Linux设备模型(四)class
前面看过了设备驱动模型中的bus、device、driver,这三种都是有迹可循的。其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动。但本节要介绍的class,是设备类,完全是抽象出来的概念,没有对应的实体。所谓设备类,是指提供的用户接口相似的一类设备的集合,常见的设备类的有block、tty、input、usb等等。 class对应的代码在d原创 2014-01-03 10:32:27 · 1029 阅读 · 0 评论 -
Linux设备模型(三)platform
platform设备和驱动与linux设备模型密切相关。platform在linux设备模型中,其实就是一种虚拟总线没有对应的硬件结构。它的主要作用就是管理系统的外设资源。linux在引入了platform机制之后,内核假设所有的这些外设都挂载在platform虚拟总线上,以便进行统一管理。1.Platform初始化在系统中platform对应的文件drivers/base/platfor原创 2014-01-02 10:26:37 · 1101 阅读 · 0 评论 -
linux 3.6 启动源码分析(七) do_initcalls
do_initcalls()将按顺序从由__initcall_start开始,到__initcall_end结束的section中以函数指针的形式取出这些编译到内核的驱动模块中初始化函数起始地址,来依次完成相应的初始化。而这些初始化函数由__define_initcall(level,fn)指示编译器在编译的时候,将这些初始化函数的起始地址值按照一定的顺序放在这个section中。由于内核某些原创 2013-12-18 14:16:50 · 4106 阅读 · 0 评论 -
Linux设备模型(二)上层容器
linux提供了新的设备模型:总线(bus)、设备(device)、驱动(driver)。其中总线是处理器与设备之间通道,在设备模型中,所有的设备都通过总线相连;设备是对于一个设备的详细信息描述,驱动是设备的相关驱动。其基本关系如下:bus 相当于一个容器,是device 和device_driver 的管理机构,它包含了一个device 集合和一个driver 集合。其中,device集合包含了原创 2013-12-30 21:28:46 · 751 阅读 · 0 评论 -
linux 3.6 启动源码分析(六) do_basic_setup
在内核init线程中调用了do_basic_setup,这个函数也做了很多内核和驱动的初始化工作/*好了, 设备现在已经初始化完成。 但是还没有一个设备被初始化过, 但是 CPU 的子系统已经启动并运行, 且内存和处理器管理系统已经在工作了。 现在我们终于可以开始做一些实际的工作了.. */static void __init do_basic_setup(void){ cpus原创 2013-12-16 16:20:06 · 2708 阅读 · 0 评论 -
linux 3.6 启动源码分析(三) setup_arch
setup_arch()函数是start_kernel阶段最重要的一个函数,每个体系都有自己的setup_arch()函数,是体系结构相关的,具体编译哪个体系的setup_arch()函数,由顶层Makefile中的ARCH变量决定:它首先通过检测出来的处理器类型进行处理器内核的初始化,然后通过 bootmem_init()函数根据系统定义的 meminfo结构进行内存结构的初始化,最后调原创 2013-12-16 14:05:46 · 3147 阅读 · 0 评论 -
linux 3.6 启动源码分析(五) kernel_init进程
在start_kernel最后的rest_init函数中内核创建了两个内核线程,一个是内核线程的管理者,另一个是内核初始化线程kernel_init.kernel_init它将完成设备驱动程序的初始化,并调用init_post函数启动用户空间的init进程。static int __init kernel_init(void * unused){ /*Wait until kthrea原创 2013-12-16 14:58:49 · 4399 阅读 · 0 评论 -
linux 3.6 启动源码分析(四) rest_init
在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就是创建并启动内核线程init。这个函数虽然意思为剩下的初始化,但是这个“剩下”的可是内容颇多,下面详细分析如下:static noinline void __init_refok rest_init(void){ int pid; rcu_scheduler_starting();//原创 2013-12-16 14:25:13 · 1955 阅读 · 0 评论 -
linux 3.6 启动源码分析(二) start_kernel
在构架相关的汇编代码运行完之后,程序跳入了构架无关的内核C语言代码:init/main.c中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段,进行一系列与内核相关的初始化后,调用第一个用户进程-init 进程并等待用户进程的执行,这样整个 Linux 内核便启动完毕。该函数所做的具体工作有:1) 调用 setup_arch()函数进行与体系结构相关的第一个初原创 2013-12-16 13:38:12 · 4549 阅读 · 0 评论 -
linux 3.6 启动源码分析(一)
作为需要和硬件打交道的工程师来说,比较关注的是驱动和CPU初始化这一块。所以我沿着启动的路线,重点学习一下和硬件相关的代码。就从linux解压的入口说起。学习阶段,基本是参考大神文章http://blog.chinaunix.net/uid/20543672/cid-6411-list-7.html所写。linux自解压完成后就跳转到了解压后的内核(也就是vmlinux的bin版本Imag原创 2013-12-16 13:02:51 · 3508 阅读 · 0 评论 -
Linux中断子系统-中断接口
前面学习了一下中断处理流程和linux对中断的管理所用的数据结构,接下来再学习一下linux对外提供的标准接口,几乎所有的接口都是围绕着irq_desc和irq_chip这两个结构体进行的。 驱动程序员最关心的就是linux提供的接口,我们学会使用这些接口,就可以编写我们的驱动程序。下面就列举和解析linux提供的中断操作接口。在linux中,EXPORT_SYMBOL(fun)宏原创 2013-12-25 22:57:53 · 1460 阅读 · 0 评论