首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

浅说驱动程序加载过程

不过因为加载到内核的程序通常是用一来操作硬件的,所以驱动程序的名字要更常见些。在以下的叙述中,我将主要使用“驱动程序”这个词。...本文不是对Rootkit细节的描述,但却介绍了通常Rootkit是如何将自己加载到内核的。在本文中,我将循序渐进的展示一个驱动程序的编译,加载,以及执行的过程。...在介绍如何加载驱动程序之前,首先介绍如何编译一个基本的驱动程序。 通常,编写Windows系统的驱动程序必然要用到微软提供的WDK,即Windows Driver Kits。...以上所展示的是一个简单的驱动程序的编译过程,接下来我们编写加载驱动程序到内核的代码。 通常的方案是将驱动程序作为加载程序的一项资源,包括到加载程序中去,在加载程序运行的时候再将驱动程序释放出来。...下面 来看最终的加载步骤,代码就不一一列举了啊! 将驱动程序加载到内核的标准方法是:首先调用OpenSCManager()函数打开所谓的SCM,这是系统的服务管理器。

2.9K90

Linux mkinitrd命令详解:深入探索与实用指南

Linux mkinitrd命令详解:深入探索与实用指南在Linux的世界里,mkinitrd命令扮演着重要的角色,它帮助我们在系统启动时加载必要的驱动程序和文件系统,确保系统的顺畅运行。...在系统启动时,Linux内核会加载这个initrd镜像到内存中,并从中运行必要的程序来挂载根文件系统,加载其他驱动程序,并最终完成系统的启动过程。...这样,在引导过程中,操作系统就可以提前加载必要的驱动程序,确保硬件设备正常工作,避免了因驱动程序缺失导致的系统启动失败问题。...二、mkinitrd的工作原理与主要特点mkinitrd命令的工作原理相对简单:它首先读取系统的硬件配置信息(如IDE、SCSI或RAID设备等),然后自动加载所需的驱动程序和文件系统模块(如ext3和...在系统启动时,Linux内核会加载这个initrd镜像到内存中,并从中运行程序来挂载根文件系统,加载其他驱动程序,并最终完成系统的启动。

16510
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    如何在 Linux 上扫描检测新的 LUN 和 SCSI 磁盘

    Linux 系统连接到 SAN(存储区域网络)后,你需要重新扫描 iSCSI 服务以发现新的 LUN。 要做到这一点,你必须向存储团队提供 Linux 主机的 WWN 号和所需的 LUN 大小。...这篇文章将帮助你查找 Linux 主机的 WWN 号。 当存储团队将 LUN 与给定的 Linux 主机进行了映射,他们将为你提供新的 LUN 详细信息。...)的系统,如 CentOS 和 Oracle Linux。...方法 1:如何使用 /sys 类文件在 Linux 上扫描新的 LUN 和 SCSI 磁盘 sysfs 文件系统是一个伪文件系统,它为内核数据结构提供了一个接口。...# ls /dev/disk/by-id | grep -i "serial-hex of LUN" 方法 2:如何使用 rescan-scsi-bus.sh 脚本在 Linux 上扫描新的 LUN 和

    4.6K10

    Initramfs_正在生成initramfs

    / Automatic kernel loading ; 然后把需要的硬件驱动程序配置模块形式,比如把我的机器上的硬盘控制器的驱动编译成模块,则选择 Device Driver |—->SCSI...目录下安装了4个内核模文件: scsi_mod.ko、sd_mod.ko、ata_piix.ko、libata.ko,它们就是所需的硬盘控制器的驱动程序。.../ Automatic kernel loading ; 然后把需要的硬件驱动程序配置模块形式,比如把我的机器上的硬盘控制器的驱动编译成模块,则选择 Device Driver |—->SCSI...目录下安装了4个内核模文件: scsi_mod.ko、sd_mod.ko、ata_piix.ko、libata.ko,它们就是所需的硬盘控制器的驱动程序。...我们的initramfs就是利用这一机制,加载硬件设备的驱动程序模块。

    3K20

    Linux设备驱动程序(三)——字符驱动

    Linux系统上输入:ls -l /dev 观察输出。...然后内核通过设备文件提供的主设备找到设备驱动程序(操作设备由驱动程序实现)。最后通过主设备号和次设备构成的设备号找到正确的设备。...有了操作的对象(设备)和操作的方法(驱动程序)那就可以完成了我们的要求。 一个驱动程序可以操作多个设备,所以不同的设备可以具有相同的主设备号。...3、主编号的动态分配 尽量使用动态分配的方法,这样就能在加载甚至编译模块的时候设定主设备号,大大优于静态分配。...如果想尝试比较简单的字符驱动实现,可以查看我的另一篇驱动开发之 hello 驱动程序实现的文章: 荔枝派Zero(全志V3S)驱动开发之hello驱动程序

    63941

    Linux系统驱动之Framebuffer驱动程序框架

    资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 Framebuffer驱动程序框架 1....怎么编写字符设备驱动程序 驱动主设备号 构造file_operations结构体,填充open/read/write等成员函数 注册驱动:register_chrdev(major, name, &fops...Framebuffer驱动程序框架 分为上下两层: fbmem.c:承上启下 实现、注册file_operations结构体 把APP的调用向下转发到具体的硬件驱动程序 xxx_fb.c:硬件相关的驱动程序...怎么编写Framebuffer驱动程序 核心: 分配fb_info framebuffer_alloc 设置fb_info var fbops 硬件相关操作 注册fb_info register_framebuffer

    3.3K30

    Linux设备驱动程序(一)——设备驱动简介

    前言 这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。...一、Linux 设备驱动程序的作用 设备驱动程序就像一个个的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些操作完全隐藏了设备的工作细节。...用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。将这些调用映射到作用于实际硬件的设备特有操作上,则是设备驱动程序的任务。...另外,Linux 支持多个文件系统类型,就是说,物理介质上不同的数据组织方式。例如,磁盘可被格式化成标准 Linux 的 ext3 文件系统,普遍使用的 FAT 文件系统,或者其他几个文件系统。...例如,你可以说 USB 模块,串口模块,SCSI 模块,等等。

    1.1K41

    Linux内核(内核模块)的加载过程(超详细)

    在多数 Linux 中,都会把硬件的驱动程序编译为模块, 这些模块保存在 /lib/modules 目录中。...如果 Linux 安装在 IDE 硬盘之上,并且采用的是默认的 ext3/4 文件系统,那么内核启动后加载根分区和模块的加载都没有什么问题,系统会顺利启动。...但是,如果 Linux 安装在 SCSI 硬盘之上,或者采用的是 LVM 文件系统,那么内核(内核载入内存是启动引导程序 GRUB 调用的,并不存在硬盘驱动不识别的问题)在加载根目录之前是需要加载 SCSI...也就是说,通过 initramfs 虚拟文件系统在内存中模拟出一个根目录,然后在这个模拟根目录中加载 SCSI 等硬件的驱动,就可以加载真正的根目录了,之后才能调用 Linux 的第一个进程 /sbin...其实大家只需要知道 initramfs 是为了在内核中建立一个模拟根目录,这个模拟根目录是为了可以调用 USB、SATA、SCSI、LVM、RAID 等硬盘接口或文件系统的驱动模块,加载了驱动模块后才可以加载真正的系统根目录

    52120

    linux的输入输出

    在这个函数里面,我们可以找到设备驱动程序注册的中断处理函数 Handler,然后执行它进行中断处理。 ? 磁盘驱动的实现 在Linux中,设备驱动程序是一组相关函数的集合。...Linux 内核中虽存在许多不同的设备驱动程序但它们具有一些共同的特性: 驱动程序属于内核代码,设备驱动程序是内核的一部分,它象内核中其它代码一样运行在内核模式,驱动程序如果出错将会使操作系统受到严重破坏...为内核提供统一的接口,设备驱动程序必须为 Linux 内核或其它子系统提供一个标准的接口。例如终端驱动程序Linux 内核提供了一个文件 I/O 接口。...动态可加载,多数 Linux 设备驱动程序可以在内核模块发出加载请求时加载,而不再使用时将其卸载。这样内核能有效地利用系统资源。 可配置,Linux 设备驱动程序可以连接到内核中。...当内核被编译时,被连入内核的设备驱动程序是可配置的。 这样linux的输入输出就很明朗了 输入输出设备的设备厂商很多。

    3.7K10

    Linux再次被爆root提权漏洞,已存在15年之久!

    近日,研究人员在Linux内核的iSCSI(小型计算机系统接口)子系统中发现了三个漏洞,这些漏洞可以允许具有基本用户权限的本地攻击者在未打补丁的Linux系统上获得root权限。...根据研究人员的说法,这些漏洞影响了Linux的所有发行版本。但是幸运的是,易受攻击的scsi_transport_iscsi内核模块在默认条件下不会被加载。...但是,当攻击者将某个版本视为目标时,该模块就可以被加载并且被利用来进行root提权。 两种情况下Linux内核模块会进行加载:检测到新硬件或者内核函数检测到某个模块丢失。...更具体地说,一个无权限的用户可以向iSCSI子系统(在drivers/scsi/scsi_transport_iscsi.c中)发送netlink消息,该子系统通过drivers/scsi/libiscsi.c...与第一个漏洞类似,一个无权限的用户可以制作指定缓冲区大小的网链消息,而驱动程序无法验证,导致可控的越界读取。 此外,这三个漏洞还可能导致数据泄露,并可能被利用来触发拒绝服务条件。

    95230

    韦东山:Linux驱动程序基石之mmap

    应用程序和驱动程序之间传递数据时,可以通过read、write函数进行。这涉及在用户态buffer和内核态buffer之间传数据,如下图所示: ?...二级页表地址旺射的最小单位有4K、1K,Linux使用4K。 一级页表项里的内容,决定了它是指向一块物理内存,还是指问二级页表,如下图: ?...是否使用cache、是否使用buffer,就有4种组合(Linux内核文件arch\arm\include\asm\pgtable-2level.h): ?...3.3, 驱动程序要做的事 驱动程序要做的事情有3点: ① 确定物理地址 ② 确定属性:是否使用cache、buffer ③ 建立映射关系 参考Linux源文件,示例代码如下: ?...4,驱动编程 我们在驱动程序中申请一个8K的buffer,让APP通过mmap能直接访问。 ① 使用哪一个函数分配内存?

    7K40

    解决设备ROOTDISPLAY0000加载驱动程序DriverWUDFRd失败的方法

    本文将介绍一种解决方法,通过分析Windows日志系统中的异常信息,定位到设备ROOT\DISPLAY\0000加载驱动程序\Driver\WUDFRd失败的原因,并通过卸载向日葵软件来解决该问题。...根据描述,找到类似于"为设备 ROOT\DISPLAY\0000 加载驱动程序 \Driver\WUDFRd 失败"的错误信息。点击该错误事件,查看详细信息。...在属性窗口的"驱动程序"选项卡中,点击"卸载设备"按钮,确认卸载。重启计算机。步骤4:卸载向日葵软件打开"控制面板",选择"程序"或"程序和功能"。在程序列表中,找到向日葵软件。...步骤5:测试和验证重新启动计算机后,系统会自动重新安装显卡驱动程序。使用计算机一段时间,观察是否还会出现蓝屏问题。如问题已解决,则说明根本原因是向日葵软件与显卡驱动冲突。

    10.8K10

    一文讲透 CentOS 开机流程

    第四步:加载内核 grub把系统控制权移交给内核,内核开始探测可识别到的所有硬件设备及尝试挂载根目录以获取其驱动程序。...此时就需要首先加载磁盘驱动程序以便读取磁盘,而磁盘驱动程序又保存在磁盘内,这样就会导致linux无法启动。此时需要通过伪文件系统来解决这一问题。...,且此模拟在内存当中的文件系统能够提供一支可运行的程序,透过该程序来加载启动过程中所最需要的核心模块,通常这些模块就是 U盘, RAID, LVM, SCSI 等文件系统与磁盘的驱动程序。...第五步:运行/sbin/init程序,设定linux的运行等级 内核加载完毕后,运行用户空间内第一个应用程序就是/sbin/init,然后读取/etc/inttab文件,依据文件配置设定系统运行等级;...Udex和seliux、挂载/etc/fstab文件中定义的所有文件系统、检测根文件系统、设置系统时钟、根据/etc/sysctl.conf文件来设置内核参数、激活LVM及软RAID设备、激活swap设备、加载额外设备的驱动程序

    88910

    Linux设备驱动程序(二)——建立和运行模块

    2、内核的并发 常见引起并发原因: linux 系统中通常正在运行多个并发进程,并且可能有多个进程同时使用我们的驱动程序。...大多数设备能够中断处理器,而中断处理程序异步运行,而且可能在驱动程序正试图处理其他任务时被调用。 linux 可以运行在多处理器上,因此可能同时有多个处理器在使用该进程。...因此,几乎所有模块代码都有下面内容: #include #include moudle.h 包含了大量加载模块需要的函数和符号的定义...一个精心设计的驱动程序仍然可以,如同内核空间驱动,允许对设备的并行存取。 如果你必须编写一个封闭源码的驱动,用户空间的选项使你容易避免不明朗的许可的情况和改变的内核接口带来的问题。...#include module_param(variable, type, perm); 宏定义,创建模块参数,可以被用户在模块加载时调整(或者在启动时间

    78241
    领券