<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[qing_ping的专栏]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/qing_ping</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; qing_ping]]></copyright><item><title><![CDATA[内核驱动添加调试宏开关]]></title><link>https://blog.csdn.net/qing_ping/article/details/90549311</link><guid>https://blog.csdn.net/qing_ping/article/details/90549311</guid><author>qing_ping</author><pubDate>Sat, 25 May 2019 17:32:35 +0800</pubDate><description><![CDATA[想要对代码的debug部分做隔离或条件编译可以给EXTRA_CFLAGS增加-D选项。EXTRA_CFLAGS是MAKE命令默认参数。不需要显示添加在编译命令中

ifneq ($(KERNELRELEASE),)
 obj-m := my.o
 my-objs := my.o
 EXTRA_CFLAGS += -I./
 EXTRA_CFLAGS += -DDEBUG_S...]]></description><category></category></item><item><title><![CDATA[收藏网址]]></title><link>https://blog.csdn.net/qing_ping/article/details/88638518</link><guid>https://blog.csdn.net/qing_ping/article/details/88638518</guid><author>qing_ping</author><pubDate>Wed, 27 Mar 2019 19:24:09 +0800</pubDate><description><![CDATA[udev规则以及编写：https://www.cnblogs.com/fah936861121/p/6496608.html

Linux 运维 -- 存储:https://www.cnblogs.com/zk47/p/4736260.html

linux查看设备信息和驱动安装信息https://blog.csdn.net/m1223853767/article/details/796150...]]></description><category></category></item><item><title><![CDATA[Adaptec raid卡命令行管理]]></title><link>https://blog.csdn.net/qing_ping/article/details/88643894</link><guid>https://blog.csdn.net/qing_ping/article/details/88643894</guid><author>qing_ping</author><pubDate>Mon, 18 Mar 2019 17:28:11 +0800</pubDate><description><![CDATA[IBM X3650使用的是Adaptec AAC-RAID集成raid卡，对此raid卡进行管理需要使用arcconf命令进行管理，

此工具默认支持LINUX4,LINUX5系统；



查看RAID卡型号：

[root@linuxbak ~]# lspci |grep -i raid

04:00.0 RAID bus controller: Adaptec AAC-RAID (Rocke...]]></description><category></category></item><item><title><![CDATA[linux raid卡信息查询]]></title><link>https://blog.csdn.net/qing_ping/article/details/88635175</link><guid>https://blog.csdn.net/qing_ping/article/details/88635175</guid><author>qing_ping</author><pubDate>Mon, 18 Mar 2019 11:09:35 +0800</pubDate><description><![CDATA[首先获取scsi设备的信息。


[root@server2 ~]# lsscsi
[2:0:0:0]    disk    VMware,  VMware Virtual S 1.0   /dev/sda
[4:0:0:0]    cd/dvd  NECVMWar VMware SATA CD01 1.00  /dev/sr0

有些操作系统没有lsscsi命令，则可以使用下面的方法获取scsi...]]></description><category></category></item><item><title><![CDATA[加载内核模块-Unknown symbol错误分析]]></title><link>https://blog.csdn.net/qing_ping/article/details/88124591</link><guid>https://blog.csdn.net/qing_ping/article/details/88124591</guid><author>qing_ping</author><pubDate>Mon, 04 Mar 2019 16:54:23 +0800</pubDate><description><![CDATA[在调试过程中，发现一个问题，编译生成一个KO文件，insmod加载后报错：

Unknown symbol var_set_integer (err 0)

Unknown symbol parse_arg_eq (err 0)



问题分析思路：

一、用命令查看内核中是否已有这个内核符号，

例如要查看是否有var_set_integer这个内核符号，输入命令：

#cat  /proc...]]></description><category></category></item><item><title><![CDATA[存在依赖关系的内核模块的编译问题​​​​​​​]]></title><link>https://blog.csdn.net/qing_ping/article/details/88119750</link><guid>https://blog.csdn.net/qing_ping/article/details/88119750</guid><author>qing_ping</author><pubDate>Mon, 04 Mar 2019 15:38:14 +0800</pubDate><description><![CDATA[内核模块如果引用到Linux内核中的符号，这个则不属于模块间的依赖，因为内核导出的符号本身就是供内核模块所使用。本帖要讨论的是在两个独立编译的模块A和B之间，B如果要引用A导出的符号，在Makefile中该如何把这一信息加入的问题。
绝大多数情形下，内核配置时能会启用CONFIG_MODVERSIONS，这意味着无论是内核还是内核模块，在导出符号时都会为该符号生成CRC校验码，这个校验码保存在Mo...]]></description><category></category></item><item><title><![CDATA[Linux设备模型（四）class]]></title><link>https://blog.csdn.net/qing_ping/article/details/17783297</link><guid>https://blog.csdn.net/qing_ping/article/details/17783297</guid><author>qing_ping</author><pubDate>Fri, 03 Jan 2014 10:32:27 +0800</pubDate><description><![CDATA[前面看过了设备驱动模型中的bus、device、driver，这三种都是有迹可循的。其中bus代表实际的总线，device代表实际的设备和接口，而driver则对应存在的驱动。但本节要介绍的class，是设备类，完全是抽象出来的概念，没有对应的实体。所谓设备类，是指提供的用户接口相似的一类设备的集合，常见的设备类的有block、tty、input、usb等等。
     class对应的代码在d]]></description><category></category></item><item><title><![CDATA[Linux设备模型（三）platform]]></title><link>https://blog.csdn.net/qing_ping/article/details/17736789</link><guid>https://blog.csdn.net/qing_ping/article/details/17736789</guid><author>qing_ping</author><pubDate>Thu, 02 Jan 2014 10:26:37 +0800</pubDate><description><![CDATA[platform设备和驱动与linux设备模型密切相关。platform在linux设备模型中，其实就是一种虚拟总线没有对应的硬件结构。它的主要作用就是管理系统的外设资源。linux在引入了platform机制之后，内核假设所有的这些外设都挂载在platform虚拟总线上,以便进行统一管理。
1.Platform初始化
在系统中platform对应的文件drivers/base/platfor]]></description><category></category></item><item><title><![CDATA[Linux设备模型（二）上层容器]]></title><link>https://blog.csdn.net/qing_ping/article/details/17679581</link><guid>https://blog.csdn.net/qing_ping/article/details/17679581</guid><author>qing_ping</author><pubDate>Mon, 30 Dec 2013 21:28:46 +0800</pubDate><description><![CDATA[linux提供了新的设备模型：总线（bus）、设备（device）、驱动（driver）。其中总线是处理器与设备之间通道，在设备模型中，所有的设备都通过总线相连；设备是对于一个设备的详细信息描述，驱动是设备的相关驱动。其基本关系如下：bus 相当于一个容器，是device 和device_driver 的管理机构，它包含了一个device 集合和一个driver 集合。其中，device集合包含了]]></description><category></category></item><item><title><![CDATA[linux 设备模型(一)对象层]]></title><link>https://blog.csdn.net/qing_ping/article/details/17631967</link><guid>https://blog.csdn.net/qing_ping/article/details/17631967</guid><author>qing_ping</author><pubDate>Sun, 29 Dec 2013 00:13:00 +0800</pubDate><description><![CDATA[linux提供了新的设备模型：总线（bus）、设备（device）、驱动（driver）。其中总线是处理器与设备之间通道，在设备模型中，所有的设备都通过总线相连；设备是对于一个设备的详细信息描述，驱动是设备的相关驱动。其基本关系如下：bus 相当于一个容器，是device 和device_driver 的管理机构，它包含了一个device 集合和一个driver 集合。其中，device集合包含了]]></description><category></category></item><item><title><![CDATA[Linux中断子系统-中断接口]]></title><link>https://blog.csdn.net/qing_ping/article/details/17553471</link><guid>https://blog.csdn.net/qing_ping/article/details/17553471</guid><author>qing_ping</author><pubDate>Wed, 25 Dec 2013 22:57:53 +0800</pubDate><description><![CDATA[前面学习了一下中断处理流程和linux对中断的管理所用的数据结构，接下来再学习一下linux对外提供的标准接口，几乎所有的接口都是围绕着irq_desc和irq_chip这两个结构体进行的。
       驱动程序员最关心的就是linux提供的接口，我们学会使用这些接口，就可以编写我们的驱动程序。下面就列举和解析linux提供的中断操作接口。在linux中，EXPORT_SYMBOL(fun)宏]]></description><category></category></item><item><title><![CDATA[Linux中断子系统-中断初始化]]></title><link>https://blog.csdn.net/qing_ping/article/details/17529567</link><guid>https://blog.csdn.net/qing_ping/article/details/17529567</guid><author>qing_ping</author><pubDate>Wed, 25 Dec 2013 11:36:35 +0800</pubDate><description><![CDATA[前面学习了一下linux中断子系统的中断处理过程，看到中断最终由desc->handle_irq(irq, desc)处理。那它是怎么跟我们注册的中断函数相关联的呢？我们应该怎么样去注册和使用中断呢？下面我们就从中断模型注册入手来继续学习linux的中断系统。
      首先是linux中断机制的核心数据结构 irq_desc， 它完整地描述了一条中断线 （或称为 “中断通道” ）。其中irq]]></description><category></category></item><item><title><![CDATA[Linux中断子系统-中断处理]]></title><link>https://blog.csdn.net/qing_ping/article/details/17525845</link><guid>https://blog.csdn.net/qing_ping/article/details/17525845</guid><author>qing_ping</author><pubDate>Tue, 24 Dec 2013 13:42:00 +0800</pubDate><description><![CDATA[中断是指在CPU正常运行期间，由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序，转而为该内部或外部事件或预先安排的事件服务的程序中去，服务完毕后再返回去继续运行被暂时中断的程序。Linux中通常分为外部中断（又叫硬件中断）和内部中断（又叫异常）。
在实地址模式中，CPU把内存中从0开始的1KB空间作为一个中断向量表。表中的每一项占4个字节。但是在保护模式中，有这4个字节的表]]></description><category></category></item><item><title><![CDATA[linux 3.6 启动源码分析(七) do_initcalls]]></title><link>https://blog.csdn.net/qing_ping/article/details/17393503</link><guid>https://blog.csdn.net/qing_ping/article/details/17393503</guid><author>qing_ping</author><pubDate>Wed, 18 Dec 2013 14:16:50 +0800</pubDate><description><![CDATA[do_initcalls()将按顺序从由__initcall_start开始，到__initcall_end结束的section中以函数指针的形式取出这些编译到内核的驱动模块中初始化函数起始地址，来依次完成相应的初始化。而这些初始化函数由__define_initcall(level,fn)指示编译器在编译的时候，将这些初始化函数的起始地址值按照一定的顺序放在这个section中。
由于内核某些]]></description><category></category></item><item><title><![CDATA[linux 3.6 启动源码分析(六) do_basic_setup]]></title><link>https://blog.csdn.net/qing_ping/article/details/17354725</link><guid>https://blog.csdn.net/qing_ping/article/details/17354725</guid><author>qing_ping</author><pubDate>Mon, 16 Dec 2013 16:20:06 +0800</pubDate><description><![CDATA[在内核init线程中调用了do_basic_setup，这个函数也做了很多内核和驱动的初始化工作
/*好了, 设备现在已经初始化完成。 但是还没有一个设备被初始化过，
 但是 CPU 的子系统已经启动并运行，
 且内存和处理器管理系统已经在工作了。
 现在我们终于可以开始做一些实际的工作了..
 */
static void __init do_basic_setup(void)
{
	cpus]]></description><category></category></item><item><title><![CDATA[linux 3.6 启动源码分析(五) kernel_init进程]]></title><link>https://blog.csdn.net/qing_ping/article/details/17352603</link><guid>https://blog.csdn.net/qing_ping/article/details/17352603</guid><author>qing_ping</author><pubDate>Mon, 16 Dec 2013 14:58:49 +0800</pubDate><description><![CDATA[在start_kernel最后的rest_init函数中内核创建了两个内核线程，一个是内核线程的管理者，另一个是内核初始化线程kernel_init.
kernel_init它将完成设备驱动程序的初始化，并调用init_post函数启动用户空间的init进程。
static int __init kernel_init(void * unused)
{
	/*Wait until kthrea]]></description><category></category></item><item><title><![CDATA[linux 3.6 启动源码分析(四) rest_init]]></title><link>https://blog.csdn.net/qing_ping/article/details/17351933</link><guid>https://blog.csdn.net/qing_ping/article/details/17351933</guid><author>qing_ping</author><pubDate>Mon, 16 Dec 2013 14:25:13 +0800</pubDate><description><![CDATA[在内核初始化函数start_kernel执行到最后，就是调用rest_init函数，这个函数的主要使命就是创建并启动内核线程init。这个函数虽然意思为剩下的初始化，但是这个“剩下”的可是内容颇多，下面详细分析如下：
static noinline void __init_refok rest_init(void)
{
	int pid;
	rcu_scheduler_starting();//]]></description><category></category></item><item><title><![CDATA[linux 3.6 启动源码分析(三) setup_arch]]></title><link>https://blog.csdn.net/qing_ping/article/details/17351541</link><guid>https://blog.csdn.net/qing_ping/article/details/17351541</guid><author>qing_ping</author><pubDate>Mon, 16 Dec 2013 14:05:46 +0800</pubDate><description><![CDATA[setup_arch()函数是start_kernel阶段最重要的一个函数，每个体系都有自己的setup_arch()函数，是体系结构相关的，具体编译哪个体系的setup_arch()函数，由顶层Makefile中的ARCH变量决定：
它首先通过检测出来的处理器类型进行处理器内核的初始化，然后通过 bootmem_init()函数根据系统定义的 meminfo
结构进行内存结构的初始化，最后调]]></description><category></category></item><item><title><![CDATA[linux 3.6 启动源码分析(二) start_kernel]]></title><link>https://blog.csdn.net/qing_ping/article/details/17351017</link><guid>https://blog.csdn.net/qing_ping/article/details/17351017</guid><author>qing_ping</author><pubDate>Mon, 16 Dec 2013 13:38:12 +0800</pubDate><description><![CDATA[在构架相关的汇编代码运行完之后，程序跳入了构架无关的内核C语言代码：init/main.c中的start_kernel函数，在这个函数中Linux内核开始真正进入初始化阶段，
进行一系列与内核相关的初始化后，调用第一个用户进程－init 进程并等待用户进程的执行，这样整个 Linux 内核便启动完毕。该函数所做的具体工作有：
1) 调用 setup_arch()函数进行与体系结构相关的第一个初]]></description><category></category></item><item><title><![CDATA[linux 3.6 启动源码分析(一)]]></title><link>https://blog.csdn.net/qing_ping/article/details/17350733</link><guid>https://blog.csdn.net/qing_ping/article/details/17350733</guid><author>qing_ping</author><pubDate>Mon, 16 Dec 2013 13:02:51 +0800</pubDate><description><![CDATA[作为需要和硬件打交道的工程师来说，比较关注的是驱动和CPU初始化这一块。所以我沿着启动的路线，重点学习一下和硬件相关的代码。就从linux解压的入口说起。学习阶段，基本是参考大神文章http://blog.chinaunix.net/uid/20543672/cid-6411-list-7.html所写。

linux自解压完成后就跳转到了解压后的内核（也就是vmlinux的bin版本Imag]]></description><category></category></item></channel></rss>