嵌入式linux学习记录一
<span style="font-family: 'Microsoft YaHei', sans-serif; font-size: 16px;">
- __init,__exit作用:
- __init:告诉编译器将该函数放入一个特殊的内存区域,在驱动初始化完成后,自动释放该函数占用的内存。
- __exit:如果驱动被直接编译进内核内核(Built-in),由于它永远不可能被卸载,
__exit修饰的函数甚至根本不会被编译进内核映像,从而直接省下了这部分代码的存储空间。如果编译成模块(.ko),则正常保留直到卸载时执行。
- make命令中M参数作用:
-
-C令下达:make进程先跳转到内核源码目录/root/project/linux。 -
读取内核主配置:加载内核的核心编译规则、确定平台架构(如 ARM)、准备好符号表。
-
识别 M 参数:内核 Makefile 检测到命令行里有
M=...。它立刻意识到:“这不是要编译内核自带的驱动,而是要帮别人编译外部独立驱动。” -
控制权转移:内核编译系统带着所有的编译工具链、内核头文件和特权,回过头来进入
M指定的路径(即你的驱动目录)。 -
加工并就地输出:在你的驱动目录下找到
Makefile和hello_drv.c,在原地编译出hello_drv.o,并最终链接生成hello_drv.ko。
-
-
make命令中的modules作用:
modules的作用是指定内核编译系统的“构建目标(Target)”。
因为内核源码支持编译很多种东西,比如:-
编译内核核心镜像(
zImage/vmlinux) -
编译架构相关的文件(
dtbs设备树) -
编译外部驱动模块(
不同的编译目标,内核会引入不同的头文件依赖、宏定义和平台规则。当你加上modules)modules关键字后,内核就会明确知道:“哦,这个用户之前是用modules目标编译的外部驱动。现在我要套用外部驱动模块的上下文环境和清理规则,生成目标。
-
register_chrdev作用:仅仅是在内核里登记了名字和主设备号,它不会自动在/dev/目录下创建文件。向内核注册(登记)一个字符设备,并为它绑定一套操作函数(File Operations)。成功调用register_chrdev,内核会立刻在系统的/proc/devices文件中为你添加一行记录。class_create和device_create的作用:实现设备节点的自动创建。它们让驱动加载后,应用层能自动在/dev/目录下看到对应的设备文件(如/dev/hello),而不需要开发者或用户手动去执行mknod命令。class_create:在/sys/class/下创建分类目录。-
device_create:在分类目录下创建设备子目录,并写入带有主次设备号的dev文件。 -
/dev/xxxx节点:由应用层的mdev/udev监测到/sys的变化后,在/dev/目录下自动生成。
-
函数名称 name 参数的职责 在 Linux 系统中的最终体现路径 谁会去查看/使用它 register_chrdev驱动/设备号的注册标签 /proc/devices系统管理员或开发者。用来查看当前系统有哪些主设备号被占用了。 class_create设备类的分类名称 /sys/class/[此名字]/内核拓扑管理机制。用来在 /sys下建立一个分类文件夹,整合同类设备。device_create设备节点的真实名称 /dev/[此名字]用户空间应用程序。这是你的 C 语言上层程序(或 Shell 命令)真正去 open、read、write的那个文件。 -
/proc和/sys虚拟文件路径区别:
-
/proc偏向“软件与状态”: 负责展示系统当前运行的软件生态(进程、内存消耗、网络连接、内核全局配置)。 -
/sys偏向“硬件与结构”: 负责展示系统当前连接的物理世界(总线、芯片、设备类别、电源管理、拓扑树)。
-
-
/sys/devices 的作用:是 sysfs 中所有设备的全局注册表,内核中每一个被发现和注册的设备都会在这里有一个对应目录,真实、完整地展现出当前系统所有硬件设备的“物理拓扑结构(父子依附关系)”。
/sys/devices是实体,其他目录是软链接,比如,/sys/bus/platform/devices/,/sys/class/gpio/,所有其他路径都指向/sys/devices里的真实目录。驱动调用platform_device_register()注册设备后,内核自动在/sys/devices/platform/下创建对应目录, -
ioremap作用:将物理地址映射到内核虚拟地址,使内核代码能够访问硬件寄存器或设备内存
-
linux中同一个程序,运行2次,每次都驻留内存在后台运行,相同的变量它的虚拟地址相同,是因为链接器在连接时定义好的,所以有相同的虚拟地址。
-
export PATH=$PATH:/home/book/xxxx/ToolChain-6.3.1/,这句话的核心作用是:把一个特定的目录(这里是交叉编译工具链的路径)临时添加到系统的全局搜索路径中,让你可以直接在终端里的任何地方运行该目录下的核心程序。
-
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 -
新的一行:
</span>
更多推荐


所有评论(0)