Linux内核和驱动程序开发

电脑杂谈  发布时间:2020-07-27 15:01:51  来源:网络整理

linux usb 驱动程序开发_linux 开发驱动_linux开发培训

在Linux系统的使用和开发中linux 开发驱动,内核和驱动程序是更重要的部分. 驱动程序的开发与系统编程相似,并且使用了内核功能. 驱动程序开发的困难在于对诸如协议总线(处理诸如Makefile之类的文件)之类的概念的理解,并且通常遵循设备驱动程序模型(例程).

①内核的主要功能: 进程管理和通信(创建进程,fifo,管道,共享内存...),内存管理,文件系统(ext2 / 3/4,fat,yaffs),网络通信(IPv4) ,IPv6)linux 开发驱动,GPRS ...)等.

②驱动程序是一个模块,可以静态(动态)编译到内核中[添加和删除内核功能],由对象代码组成的硬件操作接口

参考书: “深度实践嵌入式Linux系统迁移”查看源代码-如果您不理解,请阅读“ Linux Kernel Quest”“ Linux驱动程序开发简介和实战”(第二版)-USB驱动程序

“深入分析Linux内核和设备驱动程序”

我了解迁移步骤: 工具链设置(环境变量配置),驱动程序迁移,makefile和其他文件修改,编译,内核配置选项

源代码分析贯穿于整个过程,多线程设计/并发控制,互斥与同步

0. 了解(内核启动过程的u-boot移植和编译);

熟练(内核修改,移植驱动程序);精通(uboot设备驱动程序相关的总线设备中断,积累和深入->全面的新重要功能,快速掌握要点->内核黑客)

1. 了解内核设计的原理和目标

2. 了解数据结构和算法

3. 学习方法: 代码(过程)笔记->复习材料,实验问题->解决方案,总结复习

4. 编写驱动程序的注意事项

5. 移植规则摘要

6. 面试要求: 字符设备注册功能中断

0. 什么是好的操作系统(深度学习,自主学习)

OS: 多任务处理(中断+计时器),软件和硬件分离,出色的用户体验,快速存储(碎片管理算法)

设备管理驱动程序

linux开发培训_linux 开发驱动_linux usb 驱动程序开发

1. 内核分为基础层(工作队列tasklet信号自旋锁)[突出显示内核API概念]和应用程序层(文件系统设备驱动程序网络)[突出显示关键体系结构和加深理解的典型示例]

2. 内核体系结构(块/字符设备总线文件系统VFS层)

内核实现()

学习的主要内容: 文件系统的概念和操作程序->将特定的设备连接到总线,然后再连接到驱动器->文件系统读写内核通用块层,并结合一些小程序的实际实现(内核块设备系统的/ O路径仿真)

[文件系统的VFS体系结构]

驱动程序设计要求(区分逻辑的重要性,多用途判断): 稳定,高效和可靠[Linux源代码和硬件知识理解],要移植的复杂驱动程序: USB(由制造商提供)Nand LCD;

基本要求: ①GNUC结构直接分配(不同于ANSI C,不能使用C库,没有浮点数(缺少用户级存储器保护))②硬件基础(熟悉的芯片手动接口常用设备SRAM Flash UART) IIC USB等;最好能够设计电路)③精通内核源代码(数据结构和算法)④多任务程序设计自旋锁,互斥锁和信号灯等.

驱动程序模板: 1.头文件init退出作者信息(__init修改后的初始化函数仅执行一次,初始化后释放,并且修改后的代码存储在.init.text中)

2.Makefile: 请参阅linux-2.6.35.7-gec-v3.0-gt110 \ Documentation \ kbuild \ modules.c中第50-100行的描述

1. (驱动程序)使用寄存器如何检测设备的链接状态如何在文件系统中使用屏障I / O同步和异步I / O之间的区别

2. (内核)zImage已导出以共享,无法看到

3. 升级新驱动程序的注意事项: 优化内存IO性能,这可能会导致问题: 不稳定

6.18内核编程模块小白(微信)的详细说明

1. 输出内核版本和CPU版本,重新初始化系统时钟

2. 使用S3C2410 / S3C2440(ARM9 2004)串口初始化代码初始化串口,您可以知道软件和硬件也可以迭代更新

3. 找到了u-boot传递给内核的命令行参数

4. 初始化内存系统(虚拟地址),(网络),实时时钟,LCD和其他驱动程序,Nand和SPI,其他设备驱动程序(其中许多与USB设备相关)

5. 挂载根文件系统并进入shell命令环境

linux usb 驱动程序开发_linux开发培训_linux 开发驱动

1. 交叉编译Makefile修改,检查是否存在“ .config”文件(使用make menuconfig命令配置和裁剪内核,将生成退出)make -j 4 //四线程编译->成功标志: zImage准备就绪(拱/ arm / boot / down)

2. 下载并启动内核tftp 0x30008000 zImage; bootm 0x30008000(打印内核zImage-uImage)

内核Turing系列sylixOS操作系统(J 15)-vxworks

Linux必须在支持MMU的情况下运行(与ucos的纯物理地址不同),MPU才能运行(全部具有MMU,而没有单芯片计算机)

某些高端STM32可以运行(m7 m4高端)内存保护单元(也可以使用mclinux)

MMU地址翻译机构

已编译程序的入口地址相同(虚拟地址),不会被覆盖-> MMU查找未使用的物理内存

使用内核模块的优势: 紧凑而灵活,无需重新编程Scope,并且静态链接等同于目标代码

缺点: 缺乏性能和内存利用率(符号表维护,模块间依赖项维护)-如果使用不当会崩溃

[第一点是在源树中有相应的头文件和函数实现. 没有源代码树,您将在哪里称呼它? (在PC上进行编译时,内核具有导出符号,并且系统中存在头文件,因此您可以引用内核提供的接口,但是只能编译内核可以加载的模块您的PC版本). 其次,内核模块将记录版本号. 需要记录版本号的原因是,在不同的内核版本之间,这些接口和调用可能完全不同,因此必须确保您的代码与特定的内核相对应,以便编译的模块可以(且仅)请将其加载到运行此内核版本的Linux系统中,否则非常简单的异常将导致内核崩溃,或者根本无法编译您的代码(接口名称已更改). 我上面说的是编译模块的情况. 当然,如果将模块直接编译到内核中,那么不用说了. 没有内核源代码,就无法编译内核. ]

1. 修改源代码led_drv.c和makefile

2. 输入驱动程序目录并进行创建(前提: 内核已成功编译)

3. 将生成的.ko复制到开发板上,并加载insmod(lsmod以查看当前模块)[remmod卸载原始rmmod led_drv]

4. 设备文件创建

手动: mknod / dev / led_drv c 238 0

自动:

copy_to_user

copy_from_user

linux usb 驱动程序开发_linux 开发驱动_linux开发培训

Paste_Image.png

设备驱动程序分类(dev目录)->开发板查看设备和权限ls -l;确保有一个设备文件(可以打开打开)

*块设备(以b-kb [block]为单位)-主要是存储设备(n和SD u盘硬盘)

tty控制输入(站)主要/次要设备号(模拟进程ID)

重要: 网络设备(使用/无设备文件的无线网卡插槽编程)

usb-wifi输入子设备

移植问题的收集修改体系结构以使用交叉编译器./configure以启用共享库的共享

0. 定义字符设备结构cdev

1. 申请(dynamic.alloc_chrdev_region / static.MKDEV.register_chrdev_region)设备号2. 定义文件操作集file_operations并初始化(函数是函数指针重定向). [dev_t无符号32位整数设备号: main +次;计算申请的辅助设备的数量(相同主设备号下的应用程序,串行端口示例)] 2.1初始化cdev结构. cdev_init 3.将字符设备注册到内核. cdev_add 4.自动创建设备文件(4.1手动创建/ dev / Next mknod命令以创建4.2自动)

32位(31-20主(不同的硬件类型: uart i2c spi))19-0倍(相同硬件类型下的不同硬件实体)[uart0 uart1 ...]组成)

应用程序功能: MKDEV

注册: register_chrdev_region

*周立功的写作过程

(首先了解原理,框架和官方SDK)

注意事项[在汇编功能堆栈中运行C之前必须先初始化内存

uboot推荐的工具链4.4.1对应于uboot迁移文档的内存修改

首先在ubuntu下更改网卡,声卡MMU进行虚拟物理转换

linux 开发驱动_linux开发培训_linux usb 驱动程序开发

处于不同阶段的主要任务: BL0活跃起来

BL1(与外界通信)中断堆栈存储器CPU初始化开始. S(smdk.h)扩展类设置全部用C表示;

BL2串口网卡其他外设初始化

[将内存0x20000000映射到0x30000000到广东嵌入的含义

2. 在内核之外,内存甚至超过了地址的256M间隔时间

start_armboot扩展]

1. 内核运行步骤可以参考uboot运行步骤

2. 文件系统存储方面: 图像算法的差异

视频服务器分区-64K(分发管理节点更少,服务器速度提高了,并且节省了内存资源)

3. 存储交换技术-虚拟内存(长时间未使用的数据被移至硬盘)

4. uboot的主要变化: 设备启动位置,如何添加驱动程序进行引导

1. 内存范围(内核空间0xc0000000-ffffffff)用户空间(用户模式0-bf)

虚拟地址: 隔离进程以提高内存安全性

它是修改CPU频率以提高系统的运行速度. CPU内,但是实际上没有多少CPU可以达到300个,因此不要盲目地设置高FSB. 一般设置范围约为100-250. 用户正在设置“耐心等待”,并将其增加一点. 最好使用1MHz作为步进,并提高一点,以防一次过高而导致系统无法正常使用甚至CPU损坏! (通过界面软件进行设置)

GDT: 系统中唯一存储段寄存器(段描述符)内容的数组,该数组与程序协作以在保护模式下执行段寻址.

GDT是一种用于在保护模式下管理段描述符的数据结构,它对操作系统本身的操作以及管理和调度过程具有重要意义.

Paste_Image.png

Paste_Image.png


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-288489-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 孙权
        孙权

        不要听他的

      • 韩雪
        韩雪

        跟中国玩兵法

      • 赵瑞福
        赵瑞福

        一年估计只有加多宝赚的钱的零头的十分之一吧

      热点图片
      拼命载入中...