
在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: 多任务处理(中断+计时器),软件和硬件分离,出色的用户体验,快速存储(碎片管理算法)
设备管理驱动程序

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命令环境

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


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进行虚拟物理转换

处于不同阶段的主要任务: 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
跟中国玩兵法
一年估计只有加多宝赚的钱的零头的十分之一吧
不要听他的