<span style="font-family: 'Microsoft YaHei', sans-serif; font-size: 16px;">

  1. __init,__exit作用:
    1. __init:告诉编译器将该函数放入一个特殊的内存区域,在驱动初始化完成后,自动释放该函数占用的内存。
    2. __exit:如果驱动被直接编译进内核内核(Built-in),由于它永远不可能被卸载,__exit 修饰的函数甚至根本不会被编译进内核映像,从而直接省下了这部分代码的存储空间。如果编译成模块(.ko),则正常保留直到卸载时执行。
  2. make命令中M参数作用:
    1. -C 令下达:make 进程先跳转到内核源码目录 /root/project/linux。

    2. 读取内核主配置:加载内核的核心编译规则、确定平台架构(如 ARM)、准备好符号表。

    3. 识别 M 参数:内核 Makefile 检测到命令行里有 M=...。它立刻意识到:“这不是要编译内核自带的驱动,而是要帮别人编译外部独立驱动。”

    4. 控制权转移:内核编译系统带着所有的编译工具链、内核头文件和特权,回过头来进入 M 指定的路径(即你的驱动目录)。

    5. 加工并就地输出:在你的驱动目录下找到 Makefile 和 hello_drv.c,在原地编译出 hello_drv.o,并最终链接生成 hello_drv.ko。

  3. make命令中的modules作用:

    modules 的作用是指定内核编译系统的“构建目标(Target)”。
    因为内核源码支持编译很多种东西,比如:

    1. 编译内核核心镜像(zImage / vmlinux)

    2. 编译架构相关的文件(dtbs 设备树)

    3. 编译外部驱动模块(modules)

      不同的编译目标,内核会引入不同的头文件依赖、宏定义和平台规则。当你加上 modules 关键字后,内核就会明确知道:“哦,这个用户之前是用 modules 目标编译的外部驱动。现在我要套用外部驱动模块的上下文环境和清理规则,生成目标。
  4. register_chrdev作用: 仅仅是在内核里登记了名字和主设备号,它不会自动在 /dev/ 目录下创建文件。向内核注册(登记)一个字符设备,并为它绑定一套操作函数(File Operations)。成功调用register_chrdev,内核会立刻在系统的 /proc/devices 文件中为你添加一行记录。
  5. class_create 和 device_create的作用:实现设备节点的自动创建。它们让驱动加载后,应用层能自动在 /dev/ 目录下看到对应的设备文件(如 /dev/hello),而不需要开发者或用户手动去执行 mknod 命令。
    1. class_create:在 /sys/class/ 下创建分类目录。
    2. device_create:在分类目录下创建设备子目录,并写入带有主次设备号的 dev 文件。

    3. /dev/xxxx 节点:由应用层的 mdev/udev 监测到 /sys 的变化后,在 /dev/ 目录下自动生成。

  6. 函数名称name 参数的职责在 Linux 系统中的最终体现路径谁会去查看/使用它
    register_chrdev驱动/设备号的注册标签/proc/devices系统管理员或开发者。用来查看当前系统有哪些主设备号被占用了。
    class_create设备类的分类名称/sys/class/[此名字]/内核拓扑管理机制。用来在 /sys 下建立一个分类文件夹,整合同类设备。
    device_create设备节点的真实名称/dev/[此名字]用户空间应用程序。这是你的 C 语言上层程序(或 Shell 命令)真正去 open、read、write 的那个文件。
  7. /proc和/sys虚拟文件路径区别:

    1. /proc 偏向“软件与状态”: 负责展示系统当前运行的软件生态(进程、内存消耗、网络连接、内核全局配置)。

    2. /sys 偏向“硬件与结构”: 负责展示系统当前连接的物理世界(总线、芯片、设备类别、电源管理、拓扑树)。

  8. /sys/devices 的作用:是 sysfs 中所有设备的全局注册表,内核中每一个被发现和注册的设备都会在这里有一个对应目录,真实、完整地展现出当前系统所有硬件设备的“物理拓扑结构(父子依附关系)”。/sys/devices 是实体,其他目录是软链接,比如,/sys/bus/platform/devices/,/sys/class/gpio/,所有其他路径都指向 /sys/devices 里的真实目录。驱动调用 platform_device_register() 注册设备后,内核自动在 /sys/devices/platform/ 下创建对应目录,

  9. ioremap作用:将物理地址映射到内核虚拟地址,使内核代码能够访问硬件寄存器或设备内存

  10. linux中同一个程序,运行2次,每次都驻留内存在后台运行,相同的变量它的虚拟地址相同,是因为链接器在连接时定义好的,所以有相同的虚拟地址。

  11. export PATH=$PATH:/home/book/xxxx/ToolChain-6.3.1/,这句话的核心作用是:把一个特定的目录(这里是交叉编译工具链的路径)临时添加到系统的全局搜索路径中,让你可以直接在终端里的任何地方运行该目录下的核心程序。

  12. makefile文件中的obj-m 的含义:
    obj-m += led_drv.o

    这是内核构建系统(Kbuild)的约定变量:
    obj-y  →  编译进内核镜像 (vmlinux)
    obj-m  →  编译成独立模块 (.ko 文件)
    obj-n  →  不编译

    完整编译过程
    obj-m += led_drv.o
            ↓
    Kbuild 找到 led_drv.c
            ↓
    编译成 led_drv.o
            ↓
    链接生成 led_drv.ko
  13. 新的一行:

</span>

更多推荐