电脑内核怎么关闭

2024-05-14

1. 电脑内核怎么关闭

电脑无法用作应该不是这个问题,建议你启动正常然后安装驱动精灵让它帮助你,更新安装所有的驱动。

电脑内核怎么关闭

2. 内核模式驱动程序框架 1.11 版更新,适用于 Windows 7 (KB2685811)怎么一直安装失败?

原因如下:
1是此补丁已失效。
2是电脑上已装有包含此问题的更新补丁,则只能忽略了。
可以到到微软官网下载更新 ,对应你操作系统是32bit或64bit下载安装,安装完成后重启电脑。重启完成问题解决!



扩展资料:
Windows系统中两种基本驱动程序之一,它的特点是:
1、内核模式驱动程序将在执行其他应用程序代码(包括受保护的子系统代码)的非特权处理器模式中运行。除非用户模式驱动程序调用 Win32 API,否则将无法获取对系统数据的访问权。
2、内核模式驱动程序将作为操作系统的执行部分(即支持一个或多个受保护的子系统的基础操作系统组件)运行。大多数设备驱动程序将在内核模式中运行。
内核模式驱动程序可执行某些受保护的操作,并可访问用户模式驱动程序无法访问的系统结构。但随着访问权的增加,调试难度和系统损害几率也随之增大。
参考资料:百度百科-内核模式驱动

3. linux内核模块如何开始和结束

GRLB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。这时内核终于开始替代 BIOS 接管 Linux 的启动过程了。内核完成再次系统自检之后,开始采用动态的方式加载每个硬件的模块,这个动态模块大家可以想象成硬件的驱动(默认 Linux 硬件的驱动是不需要手工安装的,如果是重要的功能,则会直接编译到内核当中;如果是非重要的功能,比如硬件驱动会编译为模块,则在需要时由内核调用。不过,如果没有被内核硬件,要想驱动,就需要手工安装个硬件的硬块了。具体的安装方法会在后续章节中介绍)。那么,Linux 的内核到底放在了哪里呢?当然是 /boot 的启动目录中了,我们来看看这个目录下的内容吧。
[root@localhost ~]#ls /boot/config-2.6.32-279.el6.i686#内核的配置文件,内核编译时选择的功能与模块efi#可扩展固件接口,为英特尔为全新PC固件的体系结构、接口和服务提出的建议标准grub#启动引导程GTUB的数据目录initramfe-2.6.32-279.el6.i686.img#虚拟文件系统(CentOS 6.x 中用initramfs替代了initrd,但功能是一样的)lost+found故boot分区的备份目录symvers-2_6.32-279.el6.i686.gz#模块符号信息System.map-2.6.32-279.el6.i686#内核功能和内存地址的对应列表vmlinuz-2.6.32-279.el6.i686#用于启动的Linux内核。这个文件是一个压缩的内核镜像
我们已经知道,Linux 会把不重要的功能编译成内核模块,在需要时再调用,从而保证了内核不会过大。在多数 Linux 中,都会把硬件的驱动程序编译为模块, 这些模块保存在 /lib/modules/ 目录中。常见的 USB、SATA 和 SCSI 等硬盘设备的驱动,还有一些特殊的文件系统(如 LVM、RAID 等)的驱动,都是以模块的方式来保存的。如果 Linux 安装在 IDE 硬盘之上,并且采用的是默认的 ext3/4 文件系统,那么内核启动后加载根分区和模块的加载都没有什么问题,系统会顺利启动。但是如果 Linux 安装在 SCSI 硬盘之上,或者采用的是 LVM 文件系统,那么内核(内核加载入内存是启动引导程序 GRUB 调用的,并不存在硬盘驱动不识别的问题)在加载根目录之前是需要加载 SCSI 硬盘或 LVM 文件系统的驱动的。SCSI 硬盘和 LVM 文件系统的驱动都放在硬盘的 /lib/modules/ 目录中,既然内核没有办法识别 SCSI 硬盘或 LVM 文件系统,那怎么可能读取 /lib/modules/ 目录中的驱动呢?Linux 给出的解决办法是使用 initramfs 这个虚拟文件系统来处理这个问题。
initramfe虚拟文件系统
CentOS 6.x 中使用 initramfs 虚拟文件系统取代了 CentOS 5.x 中的 initrd RAM Disk。它们的作用类似,可以通过启动引导程序加载到内存中,然后会解压缩并在内存中仿真成一个根目录,并且这个仿真的文件系统能够提供一个可执行程序,通过该程序来加载启动过程中所需的内核模块,比如 USB、SATA. SCSI 硬盘的驱动和 LVM、RAID 文件系统的驱动。也就是说,通过 initramfs 虚拟文件系统在内存中模拟出一个根目录,然后在这个模拟根目录中加载 SCSI 等硬件的驱动,就可以加载真正的根目录了,之后才能调用 Linux 的第一个进程 /sbin/init。Initramfs 虚拟文件系统主要有以下优点:
initramfs 随着其中数据的増减自动増减容量。
在 initramfs 和页面缓存之间没有重复数据。
initramfs 重复利用了 Linux caching 的代码,因此几乎没有増加内核尺寸,而 caching 的代码已经经过良好测试,所以 initramfs 的代码质量也有保证。
不需要额外的文件系统驱动。
其实大家只需要知道 initramfs 是为了在内核中建立一个模拟根目录,这个模拟根目录是为了可以调用 USB、SATA、SCSI、LVM、RAID 等硬盘接口或文件系统的驱动模块,加载了驱动模块后才可以加载真正的系统根目录。我们可以通过示意图 1 来表示这个过程。
图 1 内核启动流程
那么既然 initramfs 是一个仿真根目录,那么我们是否可以看看这个仿真根目录中到底是什么样子的呢?当然可以,命令如下:
[root@localhost ~]# mkdir /tmp/initramfs#建立测试目录[root@localhost ~]# cp/boot/initramfs-2.6.32-279.el6.i686.img/tmp/initramfs/#复制initramfs文件[root@localhost ~]# cd /tmp/initramfs/[root@localhost initramfs]# fileinitramfs-2.6.32-279.el6.i686.imginitramfe-2.6.32-279.el6.i686.img:gzip compresseddata,from Unix,last modified:Wed Apr 10 21:49:34 2013, max compression#查看文件类型,发现这个文件是一个使用gzip命令打包的压缩包[root@localhost initramfs]# mv initramfs-2.6.32-279.el6.i686.imginitramfs-2.6.32-279.el6.i686.img.gz#修改文件的扩展名为.gz[root@localhost initramfs]# gunzipinitramfs-2.6.32-279.el6.i686.img.gz#解压缩[root@localhost initramfs]# lsinitramfs-2.6.32-279.el6.i686.img[root@localhost initramfs]# fileinitramfs-2.6.32-279.el6.i686.imginitramfe-2.6.32-279.el6.i686.img: ASCII cpio archive (SVR4withnoCRC)#查看文件类型,使用cpio命令的压缩文件[root@localhost initramfs]# cpio -ivcdu <initramfs-2.6.32-279.el6.i686.img#解压缩[root@localhost initramfs]#ll总用量34512drwxr-xr-x. 2 root root 4096 4月 2412:10 bindrwxr-xr-x. 2 root root 4096 4 月 24 12:10 cmdlinedrwxr-xr-x. 3 root root 4096 4月 24 12:10 dev-rw-r--r--. 1 root root 19 4 月 24 12:10 dracut-004-283.el6drwxr-xr-x. 2 root root 4096 4 月 24 12:10 emergencydrwxr-xr-x. 7 root root 4096 4月 24 12:10 etc-rwxr-xr-x. 1 root root 8962 4月 24 12:10 initdrwxr-xr-x. 2 root root 4096 4 月 24 12:10 initqueuedrwxr-xr-x. 2 root root 4096 4 月 24 12:10 initqueue-finisheddrwxr-xr-x. 2 root root 4096 4 月 24 12:10 initqueue-settleddrwxr-xr-x. 2 root root 4096 4 月 24 12:10initqueue-timeout-rw-r--r--. 1 root root 35235328 4 月 24 12:09 initramfs-2.6.32-279.el6.i686.imgdrwxr-xr-x. 9 root root 4096 4月 2412:10 lib…省略部分输出…#这就是initramfs虚拟文件系统中的内容,和根目录是不是很像
关机或者某些进程停止,对应的内核模块就会结束。更多知识请百度《Linux就该这么学》

linux内核模块如何开始和结束

4. 如何从内核模式设备驱动程序中打开文件以及如何读取或写入文件

对象名称来引用文件
内核模式设备驱动程序引用到一个文件及其对象的名称。此名称是与该文件的完整路径一起 /DosDevices。例如对于 C:/Windows/Example.txt 文件的对象名称是 /DosDevices/C:/Windows/Example.txt。然后通过调用 InitializeObjectAttributes 函数的为 OBJECT_ATTRIBUTES 结构封装为对象的名称。
注意如果早期加载的设备驱动程序,不可能还存在 /DosDevices 命名空间。因此,/DosDevices 命名空间是设备驱动程序将无法访问,因为没有驱动器号公开的。仅可保证在文件系统的部分是 /SystemRoot 的命名空间。/SystemRoot 命名空间映射到操作系统安装位置文件夹。例如对于此文件夹可能是 C:/Windows 或 D:/Winnt。
下面的代码示例阐释了如何通过其对象名称来引用到一个文件 
    UNICODE_STRING     uniName;
    OBJECT_ATTRIBUTES  objAttr;
    RtlInitUnicodeString(&uniName, L"//DosDevices//C://WINDOWS//example.txt");  // or L"//SystemRoot//example.txt"
    InitializeObjectAttributes(&objAttr, &uniName,
                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
                               NULL, NULL);
回到顶端
获取文件句柄
若要获取文件句柄,您可以将一个 OBJECT_ATTRIBUTES 结构传递给 ZwCreateFile 函数。可以 GENERIC_READ、 GENERIC_WRITE,或 GENERIC_ALL,设置 DesiredAccess 参数,具体取决于要执行的内容。如果将 CreateOptions 参数设置为 FILE_SYNCHRONOUS_IO_NONALERT 或 FILE_SYNCHRONOUS_IO_ALERT,文件系统跟踪的当前文件位置偏移量。因此,您可以按顺序读取或写入的文件更高版本。此外,您可以访问随机位置上的文件。
下面的代码示例阐释了如何获取文件句柄 
    HANDLE   handle;
    NTSTATUS ntstatus;
    IO_STATUS_BLOCK    ioStatusBlock;
    // Do not try to perform any file operations at higher IRQL levels.
    // Instead, you may use a work item or a system worker thread to perform file operations.
    if(KeGetCurrentIrql() != PASSIVE_LEVEL)
        return STATUS_INVALID_DEVICE_STATE;
    ntstatus = ZwCreateFile(&handle,
                            GENERIC_WRITE,
                            &objAttr, &ioStatusBlock, NULL,
                            FILE_ATTRIBUTE_NORMAL,
                            0,
                            FILE_OVERWRITE_IF, 
                            FILE_SYNCHRONOUS_IO_NONALERT,
                            NULL, 0);
回到顶端
读取或写入到文件
您现在可以调用 ZwReadFile 函数或 ZwWriteFile 函数。完成修改文件后,请使用 ZwClose 函数来关闭该句柄。
下面的代码示例阐释了如何向文件写入 
    #define  BUFFER_SIZE 30
    CHAR     buffer[BUFFER_SIZE];
    size_t  cb;
    if(NT_SUCCESS(ntstatus)) {
        ntstatus = RtlStringCbPrintfA(buffer, sizeof(buffer), "This is %d test/r/n", 0x0);
     if(NT_SUCCESS(ntstatus)) {
           ntstatus = RtlStringCbLengthA(buffer, sizeof(buffer), &cb);
            if(NT_SUCCESS(ntstatus)) {
                ntstatus = ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock,
                    buffer, cb, NULL, NULL);
            }
     }
        ZwClose(handle);
    }
下面的代码示例阐释了如何从文件中读取 
    LARGE_INTEGER      byteOffset;
    ntstatus = ZwCreateFile(&handle,
                            GENERIC_READ,
                            &objAttr, &ioStatusBlock,
                            NULL,
                            FILE_ATTRIBUTE_NORMAL,
                            0,
                            FILE_OPEN, 
                            FILE_SYNCHRONOUS_IO_NONALERT,
                            NULL, 0);
    if(NT_SUCCESS(ntstatus)) {
        byteOffset.LowPart = byteOffset.HighPart = 0;
        ntstatus = ZwReadFile(handle, NULL, NULL, NULL, &ioStatusBlock,
                              buffer, BUFFER_SIZE, &byteOffset, NULL);
        if(NT_SUCCESS(ntstatus)) {
            buffer[BUFFER_SIZE-1] = '/0';
            DbgPrint("%s/n", buffer);
        }
        ZwClose(handle);
    }

5. 如何将linux驱动程序添加到内核中

10 将我们的代码加入到Linux内核中

如何将linux驱动程序添加到内核中

6. 怎样才能关闭电脑的过滤器驱动程序啊?

以下为复制成分 WDM(Windows Driver Mode)是微软公司为Windows的驱动程序设计的一种通用的驱动程序模型。相比以前的KDM和VXD来说,他的性能更高、系统之间移植更加方便。所以,随着系统的升级,WDM已经成为Windows 2000系统下驱动程序开发的主流。作为WDM模型之中一类特殊的驱动程序,过滤器驱动程序(Filter driver)可以在不更改现有驱动程序的情况下,方便地修改、增加现有驱动程序的功能。特别是对于Windows 2000已经提供了通用驱动程序的硬件设备,通过编写过滤器驱动程序,可以以较小的代价扩展硬件现有的功能。因此具有很强的实际应用价值。 1 Windows 2000 I/O请求处理结构如图1所示,Windows 2000是分态的操作系统。用户应用程序运行在用户态,操作系统代码(如系统服务和设备驱动程序)在核心态下运行。用户态程序只能调用Win32子系统提供的API来同设备交互,当请求传递到I/O管理器时,他进行必要的参数匹配和操作安全性检查,然后由这个请求构造出合适的IRP(IO Request Package,I/O请求包),并把此IRP传递到适当的驱动程序去,并给应用程序一个消息,通知这次I/O操作还没完成。驱动程序一般通过硬件抽象层来和硬件交互,从而完成I/O请求工作。驱动程序完成I/O操作后,他将调用一个特殊的内核服务例程来完成IRP。这时,I/O管理器把数据和结果返回给Win32和用户应用程序。2 WDM驱动程序模型体系结构Windows驱动程序模型重新定义驱动程序分层使用了如图2的层次结构。图中左边是一个设备对象堆栈。设备对象是系统为帮助软件管理硬件而创建的数据结构。一个物理硬件可以有多个这样的数据结构。处于堆栈最底层的设备对象称为物理设备对象PDO(Physical Device Object),代表了设备和总线之间的连接。在设备对象堆栈的中间的对象称为功能设备对象FDO(Functional Device Object),代表了设备的功能。在FDO的上面和下面还会有一些过滤器设备对象FIDO(Filter Device Object)。位于FDO上面的过滤器设备对象称为上层过滤器,位于FDO下面(但仍在PDO之上)的过滤器设备对象称为下层过滤器。总线驱动程序负责枚举他的总线,这意味着发现总线上的全部设备和检测设备何时被添加或删除并为每个设备创建一个PDO。功能驱动程序知道如何控制设备的主要功能,他分层在总线驱动程序的上面。功能驱动程序创建一个功能设备对象,放在设备栈中。对总线上的所有设备,总线过滤驱动程序被加在总线驱动程序之上;设备过滤驱动程序仅对特定的设备添加。上层的过滤驱动程序在功能驱动程序之上,而下层过滤驱动程序在功能驱动程序之下。这种层次结构可以使I/O请求过程更加明了。I/O管理器发送的IRP,先被送到设备堆栈的上层过滤器驱动程序(FIDO),他可以根据要求决定IRP的处理方式,是沿着设备栈继续向下传,或者是做一些额外的处理。依次,每一层驱动程序都可以决定如何处理IRP。高层的驱动程序可以把请求划分成更简单的请求并传递给下层驱动程序。中间层次的驱动程序进一步处理请求,将一个IRP中的请求划分为若干个小的请求并传给下层驱动程序。最后,最低层的驱动程序与硬件打交道。因此一些IRP在到达总线程序之前,在设备栈传递过程中可能就被过滤掉了。 3 过滤器驱动程序过滤驱动程序是一种中间驱动程序,他位于其他的驱动程序层次之间。过滤驱动程序可以监视、拦截和修改IRP流,在不影响其他驱动程序的前提下提供一些附加的功能。他的功能可分为:(1)利用过滤器驱动程序修改现有功能驱动程序的行为而不必重新编写功能驱动程序。(2)上层过滤器驱动程序在功能驱动程序之前看到IRP,可以很方便地为用户提供额外的特征。还可以修正功能驱动程序或硬件存在的毛病或缺陷。(3)下层过滤器驱动程序在功能驱动程序要向总线驱动程序发送IRP时看到IRP。可以监视、拦截、修改功能驱动程序要执行的总线操作流,截获数据,进行必要的数据处理,再将处理过的数据传递下去,实现一定的数据处理功能。 (4)下层过滤器驱动程序可以实现驱动程序的总线无关性,使功能驱动程序完全独立于总线结构而不直接与设备对话。针对不同的总线编写不同的下层过滤器,每个下层过滤器对应一个总线类型。当功能驱动程序需要与硬件对话时,他只需向相应的下层过滤器驱动程序发送IRP即可。4 过滤器驱动程序设计过滤器驱动程序设计与功能驱动程序相似。这里限于篇幅主要讨论一下过滤器驱动程序设计中与功能驱动程序相区别的几个关键的技术要点。4.1 DriverEntry例程DriverEntry例程是驱动程序的人口点。当I/O管理器装入驱动程序时,他调用DriverEntry例程用来初始化驱动程序范围的数据结构和资源,包括输出该驱动程序的其他人口点,初始化该驱动程序使用的特定对象,并设置驱动程序系统资源。与功能驱动程序相区别的是:他必须为每种类型的IRP都安装派遣函数,而不仅仅只是其希望处理的IRP。4.2 AddDevice例程AddDevice函数的基本职责是创建一个设备对象并把他连接到以物理设备对象PDO为底的设备堆栈中,并负责设备对象初始化。与功能驱动程序相区别的是:过滤驱动程序创建的设备对象可能是2种,一种是不命名的过滤设备对象,过滤器工作时把这个无名的设备对象连接到以物理设备对象PDO为底的设备堆栈中。一种是为了和用户程序通信而创建的命名的设备对象并不连接到以物理设备对象PDO为底的设备堆栈中。命名可以采用2种方法:第一种方法是采用可显示的"硬编码"符号链接名,用户态程序必须把设备名硬编码到源代码中;另外一种方法是使用设备接口,每个设备接口是由一个全局惟一标志符GUID标志。设备注册为一个特定的设备接口就创建了一个符号链接。相关步骤如下:(1)调用IoCreateDevke创建过滤设备对象,并建立一个私有的设备扩展对象。(2)寄存一个或多个设备接口,以便应用程序能知道设备的存在。另外,还可以给出设备名并创建符号连接。(3)初始化设备扩展和设备对象的F1ag成员。(4)调用IOAttachDevkeToDeviceStack函数把新设备对象放到堆栈上。具体实现程序如下:NTSTATUS AddDevice (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pdo){PDEVICE_OBJECT fido=NULL;//创建没有设备名的过滤设备对象NTSTATUS status=IoCreateDevice (DriverObjeot,sizeof (DEVICE-EXTENSION),NULL,FILE_DEVICE_UNKNOWN,0,FALSE,&fido);if(!NT_SUCCESS(status)) return status;//初始化设备扩展和设备对象的Flag成员PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension;pdx->DeviceObject=fido;pdx->Pdo=pdo;pdx->eDeviceType =FILTER-p.htm" target="_blank" title="FILTER货源和PDF资料">FILTER;//把没有设备名的设备对象放到堆栈上PDEVICE- OBJECT fdo =IoAttachDeviceToDeviceStack (fido,pdo);pdx->TopDevObj=fdo;fido->Flags ︱=pdo->F1ags&(DO_DIRECT-IO ︱DO-BUFFERED-IO ︱ DO_POWER_PAGABLE ︱DO_POWER_INRUSH);………//建立一个命名的设备对象创建符号链接CreateSymbOlicLink (DriverObject,pdo);return STATUS_SUCCESS;}4.3 派遣例程派遣例程处理来自应用程序的打开、关闭、读、写等I/O请求命令。与功能驱动程序的区别是:过滤器驱动程序不能影响其他驱动程序接受IRP。对于未知的IRP或不处理的IRP过滤驱动程序的原则是必须沿设备栈传递下去。因此他必须为每种类型的IRP都安装派遣函数,而不仅仅只是其希望处理的IRP。对于希望处理的IRP必须指定特殊的派遣函数,直接用CompleteIRP来完成接收到的这类IRP,不往下层传送。这里由DispatchDeviceControl处理来自应用程序的所有希望处理的I/O操作命令。通常采用给予所有自定义的I/O请求代码的SWITCH-p.htm" target="_blank" title="SWITCH货源和PDF资料">SWITCH语句,而对于每个命令使用相应的处理函数。下面列出了主要的代码框架:NTSTATUS DispatchDeviceControl (PDEVICE_OBJECT fido,PIRP Irp){NTSTATUS status;PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)fido->DeviceExtension;PlO_STACK_LOCATION IrpStack =IoGetCurrentlrpStackLocation(1rp);//取I/O控制命令代码ULONG IoControlCode = IrpStack >Parameters.DeviceloContr01.IoControlCode;switch(IoControlCode){case IOCTL-XXX:…… //处理I/O控制命令代码case IOCTL-XXX:……default:……break;}//完成接收到的IRPIoCompleteRequest(Irp,IO_NO_INCREMENT);……return status;}对于不需要处理的IRP则交由DispatchAny例程处理,将IRP沿着设备栈直接传递下去:NTSTATUS DispatchAny(PDEVICE_OBJECT fido,PIRP Irp){PDEVICE_ EXTENSION pdx=(PDEVICE-EXTENSION)fido->DeviceExtension//使堆栈指针少前进一步。IoSkipCurrentlrpStackLocation(hp);Status=IoCallDriver(pdx->LowerDeviceObject,Irp);……return status;4.4 Unload例程功能在Unload例程中,驱动程序必须释放所有创建的对象和所有分配给驱动程序的资源。5 结 语笔者就采用在Windows提供的USB声卡驱动程序下方插入自己编写的下层过滤器驱动程序实现了对USB声卡输出的数据流的截获并进行语音信号处理,取得了不错的效果,现已投入实际应用。可见过滤器驱动程序作为一类特殊的驱动程序,它可以以较小的代价实现对驱动数据流的截获,修改、增加现有驱动常需的功能,具有很强的实用性。
类别:驱动 | 添加到搜藏 | 浏览(254) | 评论 (0)   上一篇:VMware虚拟机中如何安装VMWare-T...    下一篇:今天离婚,你得抱我出门   相关文章: �6�1Windows文件系统的过滤器驱动程...             最近读者: 登录后,您就出现在这里。  蝶舞360°jacky85chan  网友评论:

7. 为什么驱动程序一般在内核态工作

驱动的种类很多,有你所说的设备驱动,但是还有一大类内核驱动。
要理解什么是驱动程序就要知道用户程序和内核的关系。 
应用程序都是用户程序,在执行用户程序是CPU处于用户态,有些特权指令无法运行。 
运行操作系统的代码时,CPU处于内核态,是可以执行特权指令的。 
驱动程序就是用户程序想完成个功能,但是必须要在内核态完成,所以就需要一个内核态的助手,这个助手就是驱动程序。驱动程序是加载到内核里的。

为什么驱动程序一般在内核态工作

8. 如何将驱动添加进内核

一、       驱动程序编译进内核的步骤 在 linux 内核中增加程序需要完成以下三项工作: 1. 将编写的源代码复制到 Linux 内核源代码的相应目录; 2. 在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项; 3. 在目录的 Makefile 文件中增加对新源代码的编译条目。   bq27501驱动编译到内核中具体步骤如下: 1.      先将驱动代码bq27501文件夹复制到 ti-davinci/drivers/ 目录下。 确定bq27501驱动模块应在内核源代码树中处于何处。 设备驱动程序存放在内核源码树根目录 drivers/ 的子目录下,在其内部,设备驱动文件进一步按照类别,类型等有序地组织起来。 a. 字符设备存在于 drivers/char/ 目录下 b. 块设备存放在 drivers/block/ 目录下 c. USB 设备则存放在 drivers/usb/ 目录下。 注意: (1) 此处的文件组织规则并非绝对不变,例如: USB 设备也属于字符设备,也可以存放在 drivers/usb/ 目录下。 (2) 在 drivers/char/ 目录下,在该目录下同时存在大量的 C 源代码文件和许多其他目录。所有对于仅仅只有一两个源文件的设备驱动程序,可以直接存放在该目录下,但如果驱动程序包含许多源文件和其他辅助文件,那么可以创建一个新子目录。 (3) bq27501的驱动是属于字符设备驱动类别,虽然驱动相关的文件只有两个,但是为了方面查看,将相关文件放在了bq27501的文件夹中。在drivers/char/目录下增加新的设备过程比较简单,但是在drivers/下直接添加新的设备稍微复杂点。所以下面首先给出在drivers/下添加bq27501驱动的过程,然后再简单说明在drivers/char/目录下添加的过程。   2.      在/bq27501下面新建一个Makefile文件。向里面添加代码: obj-$(CONFIG_BQ27501)+=bq27501.o 此时,构建系统运行就将会进入 bq27501/ 目录下,并且将bq27501.c 编译为 bq27501.o 3.      在/bq27501下面新建Kconfig文件。添加代码: menu "bq27501 driver"   config BQ27501 tristate"BQ27501" default y ---help---   Say 'Y' here, it will be compiled into thekernel; If you choose 'M', it will be compiled into a module named asbq27501.ko. endmenu 注意:help中的文字不能加回车符,否则make menuconfig编译的时候会报错。 4.     修改/drivers目录下的Kconfig文件,在endmenu之前添加一条语句‘source drivers/bq27501/Kconfig’ 对于驱动程序,Kconfig 通常和源代码处于同一目录。 若建立了一个新的目录,而且也希望 Kconfig 文件存在于该目录中的话,那么就必须在一个已存在的 Kconfig 文件中将它引入,需要用上面的语句将其挂接在 drivers 目录中的Kconfig 中。   5.      修改/drivers目下Makefile文件,添加‘obj-$(CONFIG_BQ27501)         +=bq27501/’。这行编译指令告诉模块构建系统在编译模块时需要进入 bq27501/ 子目录中。此时的驱动程序的编译取决于一个特殊配置 CONFIG_BQ27501 配置选项。   6.      修改arch/arm目录下的Kconfig文件,在menu "Device Drivers……endmenu"直接添加语句 source "drivers/bq27501/Kconfig"