ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

驱动——arm-linux应用程序开发

驱动——arm-linux应用程序开发 交叉开发——交叉编译环境准备1.串口工具用于充当开发板终端2.网络用于传输文件挂载 --- 确保开发板能ping通虚拟机ubuntu3.安装nfs并设置nfs服务目录mount -o nolock,nfsvers3 192.168.0.3:/home/linux/nfs /mnt4.在ubuntu的 /home/linux/nfs 中开发并编译程序在开发板的/mnt 目录下运行程序动态库移植1.使用arm-linux-gcc编译生成libtest.so2.编译生成可执行文件动态链接libtest.so3.arm端执行程序拷贝.so文件到开发板的/lib目录下库移植linux内核设备驱动开发boot rom(0地址) -- bootloader -- kernel -- rootfs1.boot rom 根据启动方式选择不同的存储设备启动bootloader2.bootloader 为 kernel 准备运行环境,引导kernel 启动3.kernel 启动到最后阶段,加载根文件系统bootloader:一个裸机程序,为内核启动准备环境,并引导内核启动1.初始化CPU(工作模式)2.初始化异常向量表3.初始化内存4.初始化堆栈5.初始化时钟6.关闭看门狗7.关Cache(数据Cache关闭, 指令Cache可以不关)8.关闭MMU9.初始化相关外设(串口/网口)10.集成相关外设11.搬移内核到内存, 向内核传参(根文件系统类型/位置/控制台)12.启动内核(PC指向内核首地址) --- 从此CPU控制权彻底移交给内核kernel:操作系统核心(一个复杂的软件)文件管理, 内存管理, 进程管理, 网络管理, 设备管理内核启动到最后阶段, 加载(挂载)根文件系统启动init进程 -服务程序 - shell - approotfs: 根文件系统(系统文件的集合)库文件系统程序/命令配置文件普通文件(txt. mp3. jpg)用户程序init进程linux启动SD卡启动系统上电之后, 先执行bootrom中的程序, 检测启动方式后, 将SD卡中的bootloader的前一部分拷贝到片上内存中, bootloader前半部分将内存初始化好, 将自己后半部分拷贝到内存中, bootloader将SD卡中的zlmage拷贝到内存的0x80800000地址处, 并向内核传参, 然后启动内核, 内核启动到最后阶段, 挂载SD卡中的根文件系统。tftp:bootloader通过tftp将ubuntu的tftp服务目录下的zlmage拷贝到内存的0x80800000地址处, 并向内核传参, 然后启动内核, 内核启动到最后阶段, 挂载ubuntu的nfs服务目录中的根文件系统uboot开源的(一个具体的bootloader)uboot命令:? / help 列出所有支持的命令printenv / print 打印环境变量setenv a 10000 设置环境变量saveenv 保存环境变量setenv a 删除环境变量(将环境变量的值设置为空)内核编译Kconfig 定义menuconfig中的配置选项make menuconfig 内核配置(编译选项) --- 配置结果保存在.config.configCONFIG_XXX yCONFIG_XXX1 nMakfile 使用.config中保存的变量obj-$(CONFIG_XXX) xxx.o编译准备设备驱动程序1.字符设备驱动 按字节流顺序访问(绝大多数设备都是字符设备)2.块设备驱动 数据可以随机访问(存储设备)3.网络设备驱动 集成复杂的协议栈(网卡设备) --- 按名字维护1. 执行 ctags -R 生成 tags索引文件 --- 包含当前目录即子目录中所有的符号2. vim打开目标文件 (必须和tags在同级目录下)3. ctrl ] 跟进4. ctrl o 回退 (小写O)5. vim -t demo_init(符号) 以搜索符号的方式打开字符设备驱动模板dev_t dev; struct file_operations fops { open read write release }; struct cdev cdev; demo_init() { //固定设备号 MKDEV(); cdev_init(); cdev_add(); register_chrdev_region(); //自动分配 alloc_chrdev_region(dev,0,1,DEV_NAME); cdev_init(); cdev_add(); class class_create(); device device_create(); } demo_exit() { //device_destroy(); //class_destroy(); unregister_chrdev_region(dev,1); cdev_del(cdev); } module_init(demo_init); module_exit(demo_exit);杂项(混杂)设备驱动: 主设备号为10struct file_operations fops { open read write release }; struct miscdevice misc { .minor name fops }; demo_init() { misc_register(); } demo_exit() { misc_deregister(); } module_init(demo_init); module_exit(demo_exit);ioremap(); 物理地址映射iounmap(); 解除映射copy_from_user(); 用户空间到内核空间的数据拷贝copy_to_user(); 内核空间到用户空间的数据拷贝
返回列表