
linux
文章平均质量分 83
monkea123
这个作者很懒,什么都没留下…
展开
-
File_operations结构体
file_operation通俗解释转载 2022-08-25 16:09:18 · 3539 阅读 · 0 评论 -
杂项设备(misc device)
杂项设备(misc device)杂项设备也是嵌入式系统中用得比较多的一种设备驱动。在 Linux 内核的include/linux目录下有miscdevice.h文件,要把自己定义的misc device从设备定义在这里。其实是因为这些字符设备不符合预先确定的字符设备范畴,所有这些设备采用主编号10 ,一起归于misc device,其实misc_register就是用主标号10调用register_chrdev()的,只不过misc是将一些字符设备存放在misc类中。换句话说,misc设备其实也就是特原创 2020-10-17 20:03:29 · 1829 阅读 · 0 评论 -
platform平台驱动模型 总线-驱动-设备
platform 总线(1)相对于usb、pci、i2c等物理总线来说,Linux 提出了 platform 这个虚拟总线,相应的就有 platform_driver 和 platform_device。platform总线是虚拟的、抽象出来的。(2)CPU与外部通信的2种方式:地址总线式连接和专用接口式连接。平台总线对应地址总线式连接设备,也就是SoC内部集成的各种内部外设。Linux系统内核使用bus_type结构体表示总线,此结构体定义在文件include/linux/device.h,bus_原创 2020-10-17 19:01:08 · 473 阅读 · 0 评论 -
自旋锁和互斥锁
A hybrid mutex behaves like a spinlock at first on a multi-core system. If a thread cannot lock the mutex, it won’t be put to sleep immediately, since the mutex might get unlocked pretty soon, so instead the mutex will first behave exactly like a spinlock.原创 2020-10-07 21:09:23 · 167 阅读 · 0 评论 -
等待队列代码实现
hpet_read(struct file *file, char __user *buf, size_t count, loff_t * ppos){ DECLARE_WAITQUEUE(wait, current); /* 定义一个等待队列 */ unsigned long data; ssize_t retval; struct hpet_dev *devp; devp = file->private_data; /* 私有化数据 */ if (!devp->原创 2020-10-07 20:35:10 · 249 阅读 · 0 评论 -
Linux 阻塞和非阻塞 IO
IO 指的是 Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式 IO 就会将应用程序对应的线程挂起,直到设备资源可以获取为止。对于非阻塞 IO,应用程序对应的线程不会挂起,它要么一直轮询等待,直到设备资源可以使用,要么就直接放弃。比如你打开浏览器,访问新浪首页,浏览器这个程序就需要通过网络IO获取新浪的网页。浏览器首先会发送数据给新浪服务器,告诉它我想要首页的HTML,这个动作是往外发数据,叫Outpu原创 2020-10-04 21:00:50 · 160 阅读 · 0 评论 -
linux驱动开发之地址映射(mmu)
在编写驱动之前,我们需要先简单了解一下 MMU 这个神器, MMU 全称叫做 Memory Manage Unit,也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU,但是现在Linux 内核已经支持无 MMU 的处理器了。 MMU 主要完成的功能如下:①、完成虚拟空间到物理空间的映射。②、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。我们重点来看一下第①点...原创 2020-01-11 14:20:44 · 1565 阅读 · 0 评论 -
Linux 设备号
设备号的组成为了方便管理, Linux 中每个设备都有一个设备号,设备号由主设备号和次设备号两部分组成,主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。 Linux 提供了一个名为 dev_t 的数据类型表示设备号, dev_t 定义在文件 include/linux/types.h 里面12 typedef __u32 __kernel_dev_t;......15 t...原创 2020-01-09 17:24:54 · 582 阅读 · 0 评论 -
printk的用法及优先级
这里使用了 printk 来输出信息,而不是 printf!因为在 Linux 内核中没有 printf 这个函数。 printk 相当于 printf 的孪生兄妹, printf运行在用户态, printk 运行在内核态。在内核中想要向控制台输出或显示一些内容,必须使用printk 这个函数。不同之处在于, printk 可以根据日志级别对消息进行分类,一共有 8 个消息级别,这 8 个消息级别...原创 2020-01-09 17:11:11 · 1710 阅读 · 0 评论 -
linux驱动模块的加载和卸载
Linux 驱动有两种运行方式,第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序。第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),在Linux 内核启动以后使用“insmod”命令加载驱动模块。在调试驱动的时候一般都选择将其编译为模块,这样我们修改驱动以后只需要编译一下驱动代码即可,不需要编译整个 Linux 代码。而且在调试的时候...原创 2020-01-09 12:04:03 · 4601 阅读 · 1 评论 -
字符设备驱动开发总概
字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动...原创 2020-01-09 11:37:37 · 419 阅读 · 0 评论 -
Linux驱动分类简介
Linux驱动主要具有如下几点作用:系统调用是应用程序和内核之间的接口,驱动程序是内核和硬件之间的接口;驱动程序接受上层软件(应用程序、内核)的请求,完成对硬件的操作,屏蔽了硬件的细节;驱动程序将硬件设备抽象成一个文件,应用程序操作文件即操作硬件,符合Linux“一切皆文件”的思想。驱动的分类及特点计算机硬件系统有CPU、存储器以及外设组成,Linux驱动针对的对象是存储器和外设;...原创 2020-01-09 11:19:17 · 1740 阅读 · 0 评论 -
linux驱动面试题
1、字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件?答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件。评:这只是其中一种方式,也叫手动创建设备文件。还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后。那么在系统启动...原创 2020-01-09 11:16:42 · 5482 阅读 · 0 评论 -
ubuntu的子目录用途
但是这些都是 Ubuntu 所需要的,其中有很多子目录和文件我们嵌入式 Linux 是用不到的,所以这里就看一些常用的子目录:1、 /bin 目录看到“bin”大家应该能想到 bin 文件, bin 文件就是可执行文件。所以此目录下存放着系统需要的可执行文件,一般都是一些命令,比如 ls、 mv 等命令。此目录下的命令所有的客户都可以使用。2、 /dev 目录dev 是 device 的...原创 2019-12-12 20:14:33 · 303 阅读 · 0 评论 -
ubuntu16.04突然无法联网问题解决方法之一
今天,使用ubuntu下载东西时,突然提醒网络连接失败,问题如下:输入:ifconfig输出:ens33 Link encap:以太网 硬件地址 00:11AA:fE:22:FbUP BROADCAST MULTICAST MTU:1500 跃点数:1接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0发送数据包:0 错误:0 丢弃:0 过载:0 载波:0碰撞:0 发送队列长度:...原创 2019-12-12 17:17:39 · 1443 阅读 · 0 评论 -
Linux 内核启动流程
链接脚本 vmlinux.lds要分析 Linux 启动流程,同样需要先编译一下 Linux 源码,因为有很多文件是需要编译才会生成的。首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的。 vmlinux.lds 中有如下代码: vmlinux.lds 链接脚本492 OUTPUT...原创 2019-12-07 17:30:57 · 787 阅读 · 1 评论 -
linux源码剖析五 make zImage 过程
vmlinux、 Image, zImage、 uImage 的区别前面几小节重点是讲 vmlinux 是如何编译出来的, vmlinux 是 ELF 格式的文件,但是在实际中我们不会使用 vmlinux,而是使用 zImage 或 uImage 这样的 Linux 内核镜像文件。那么vmlinux、 zImage、 uImage 他们之间有什么区别呢?①、 vmlinux 是编译出来的最原始...原创 2019-12-06 21:19:28 · 1062 阅读 · 0 评论 -
linux源码剖析四 built-in.o 文件编译生成过程
vmliux 依赖 vmlinux-deps,而 vmlinux-deps=$(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN), KBUILD_LDS是连接脚本,这里不考虑,剩下的 KBUILD_VMLINUX_INIT 和 KBUILD_VMLINUX_MAIN 就是各个子目录下的 built-in.o、 .a 等文件。最终 v...原创 2019-12-06 21:09:57 · 2877 阅读 · 0 评论 -
linux 顶层makefile源码剖析三 make 过程
125 PHONY := _all126 _all:......192 PHONY += all193 ifeq ($(KBUILD_EXTMOD),)194 _all: all195 else196 _all: modules197 endif......608 all: vmlinux第 126 行, _all 是默认目标,如果使用命令“make”编译 Linux 的话...原创 2019-12-06 20:04:39 · 399 阅读 · 0 评论 -
linux make xxx_defconfig 过程 Makefile.build 脚本分析
config-targets := 0mixed-targets := 0dot-config := 1ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),) ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),) dot-config ...原创 2019-12-05 20:54:06 · 730 阅读 · 0 评论 -
linux 顶层 Makefile 详解
Linux 的顶层 Makefile 和 uboot 的顶层 Makefile 非常相似,因为 uboot 参考了 Linux,前 602行几乎一样,所以前面部分我们大致看一下就行了。1、版本号顶层 Makefile 一开始就是 Linux 内核的版本号2、 MAKEFLAGS 变量MAKEFLAGS 变量设置如下所示:。3、命令输出Linux 编译的时候也可以通过“V=1”来输出...原创 2019-12-05 20:17:26 · 1218 阅读 · 0 评论 -
linux编译后文件夹
arch 架构相关目录。Linux 自带block 块设备相关目录。crypto 加密相关目录。Documentation 文档相关目录。drivers 驱动相关目录。firmeare 固件相关目录。fs 文件系统相关目录。include 头文件相关目录。init 初始化相关目录。ipc 进程间通信相关目录。kernel 内核相关目录。lib 库相关目录。mm 内存管理相...原创 2019-12-05 19:41:31 · 1418 阅读 · 0 评论 -
imx6ull bootcmd 和 bootargs 环境变量
uboot 中有两个非常重要的环境变量 bootcmd 和 bootargs,接下来看一下这两个环境变量。bootcmd 和 bootagrs 是采用类似 shell 脚本语言编写的,里面有很多的变量引用,这些变量其实都 是 环 境 变 量 , 有 很 多 是 NXP 自 己 定 义 的 。 文 件 mx6ulevk.h 中 的 宏CONFIG_EXTRA_ENV_SETTINGS 保存着这些环境...原创 2019-11-21 19:51:14 · 1872 阅读 · 0 评论 -
uboot源码分析十二 uboot使用bootz启动linux流程二
bootm_os_get_boot_func 函数do_bootm_states 会调用 bootm_os_get_boot_func 来查找对应系统的启动函数,此函数定义在文件 common/bootm_os.c 中493 boot_os_fn *bootm_os_get_boot_func(int os)494 {495 #ifdef CONFIG_NEEDS_MANUAL_RELO...原创 2019-11-21 09:48:15 · 742 阅读 · 0 评论 -
uboot源码分析十一 uboot使用bootz启动linux流程一
images 全局变量不管是 bootz 还是 bootm 命令,在启动 Linux 内核的时候都会用到一个重要的全局变量:images, images 在文件 cmd/bootm.c 中有如下定义43 bootm_headers_t images; /* pointers to os/initrd/fdt images */images 是 bootm_headers_t 类型的全局变...原创 2019-11-21 09:26:14 · 1162 阅读 · 1 评论 -
uboot源码分析十 uboot启动流程七 run_main_loop 函数 cli_loop 函数
run_main_loopuboot 启动以后会进入 3 秒倒计时,如果在 3 秒倒计时结束之前按下按下回车键,那么就会进入 uboot 的命令模式,如果倒计时结束以后都没有按下回车键,那么就会自动启动 Linux 内核 , 这 个 功 能 就 是 由 run_main_loop 函 数 来 完 成 的 。 run_main_loop 函 数 定 义 在 文 件common/board_r.c ...原创 2019-11-19 20:19:55 · 2542 阅读 · 0 评论 -
uboot源码分析九 uboot启动流程六 board_init_r 函数
board_init_rboard_init_f 函数,在此函数里面会调用一系列的函数来初始化一些外设和 gd 的成员变量。但是 board_init_f 并没有初始化所有的外设,还需要做一些后续工作,这些后续工作就是由函数 board_init_r 来完成的void board_init_r(gd_t *new_gd, ulong dest_addr){#ifdef CONFIG_NEE...原创 2019-11-19 19:10:16 · 1994 阅读 · 0 评论 -
uboot源码分析八 uboot启动流程五 relocate_code 函数
relocate_code 函数relocate_code 函数是用于代码拷贝的 此函数定义在文件 arch/arm/lib/relocate.S 中/* * relocate - common relocation function for ARM U-Boot * * Copyright (c) 2013 Albert ARIBAUD <albert.u.boot@ari...原创 2019-11-19 12:15:17 · 1232 阅读 · 1 评论 -
uboot源码分析七 uboot启动流程四 board_init_f 函数(板子初始化内存空间分配)
_main 中会 board_init_f 函数, board_init_f 函数主要有两个工作:①、初始化一系列外设,比如串口、定时器,或者打印一些消息等。②、初始化 gd 的各个成员变量, uboot 会将自己重定位到 DRAM 最后面的地址区域,也就是将自己拷贝到 DRAM 最后面的内存区域中。这么做的目的是给 Linux 腾出空间,防止 Linux kernel 覆盖掉 uboot,将...原创 2019-11-19 11:08:51 · 1100 阅读 · 0 评论 -
uboot源码分析六 uboot启动流程三 lowlevel_init 函数 s_init 函数 _main 函数
lowlevel_init 函数函数 lowlevel_init 在文件 arch/arm/cpu/armv7/lowlevel_init.S 中定义,/* * A lowlevel_init function that sets up the stack to call a C function to * perform further init. * * (C) Copyright...原创 2019-11-16 21:35:38 · 1872 阅读 · 0 评论 -
[uboot] global_data介绍
==一、global_data功能1、global_data存在的意义在某些情况下,uboot是在某些只读存储器上运行,比如ROM、nor flash等等。在uboot被重定向到RAM(可读可写)之前,我们都无法写入数据,更无法通过全局变量来传递数据。而global_data则是为了解决这个问题。这里顺便一下,后续的uboot的relocation操作,也就是uboot的重定向操作,最...转载 2019-11-16 21:32:24 · 779 阅读 · 0 评论 -
uboot源码分析六 uboot启动流程二
reset 函数第 43 行,读取寄存器 cpsr 中的值,并保存到 r0 寄存器中。第 44 行,将寄存器 r0 中的值与 0X1F 进行与运算,结果保存到 r1 寄存器中,目的就是提取 cpsr 的 bit0~bit4 这 5 位,这 5 位为 M4 M3 M2 M1 M0, M[4:0]这五位用来设置处理器的工作模式,第 45 行,判断 r1 寄存器的值是否等于 0X1A(0b...原创 2019-11-16 19:48:05 · 481 阅读 · 0 评论 -
ARM简介 (teq指令)
接触ARM,嵌入式也有1年多的时间,期间因为各种原因有一些断断续续,但是从未放弃。今天就来对ARM处理器进行一下总结,可能会比较乱,知识的跳跃也会比较大,但都是我根据自己的总结,有的是我以前记载在笔记本上的,有的则是我写在google notebook里面的东西。因为水平有限,可能还有会错误,欢迎指正!计算机体系结构:冯.诺依曼体系结构:我们将数据和指令都存储在一个存储器中的计算机称为冯.诺依...转载 2019-11-16 18:25:22 · 4934 阅读 · 0 评论 -
uboot源码分析五 启动流程分析一 链接脚本 u-boot.lds
链接脚本 u-boot.ldsOUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS{ . = 0x00000000; . = ALIGN(4); .text : { *(.__image_copy_start) ...原创 2019-11-16 17:55:28 · 649 阅读 · 0 评论 -
uboot分析四 make过程
ALL-y 包含 u-boot.srec、 u-boot.bin、 u-boot.sym、System.map、 u-boot.cfg 和 binary_size_check 这几个文件。根据 uboot 的配置情况也可能包含其他的文件ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.binifeq ($(CONFIG_SPL_FSL_PBL),...原创 2019-11-16 17:13:26 · 818 阅读 · 1 评论 -
uboot源码分析二 顶层makefile源码分析一
MAKEFLAGS 变量make 是支持递归调用的,也就是在 Makefile 中使用“make”命令来执行其他的 Makefile文件,一般都是子目录中的 Makefile 文件。假如在当前目录下存在一个“subdir”子目录,这个子目录中又有其对应的 Makefile 文件,那么这个工程在编译的时候其主目录中的 Makefile 就可以调用子目录中的 Makefile,以此来完成所有子目录...原创 2019-11-14 21:13:22 · 794 阅读 · 0 评论 -
shell脚本命令
在平时的运维工作中,今天写一篇shell脚本入门,我们经常会碰到这样一个场景:执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢之极了!这个时候,就可以使用EOF结合cat命令行进行内容的追加了。小编现在就是当运维的,你有什么不懂欢迎留言。下面就对EOF的用法进行梳理:EOF是END O...转载 2019-11-12 21:36:56 · 245 阅读 · 0 评论 -
I.MX6U 的时钟系统 和 主频设置
一。7 路 PLL 时钟源ARM_PLL(PLL1)此路 PLL 是供 ARM 内核使用的, ARM 内核时钟就是由此 PLL 生成的,此 PLL 通过编程的方式最高可倍频到 1.3GHz。528_PLL(PLL2),此路 PLL 也叫做 System_PLL,此路 PLL 是固定的 22 倍频,不可编程修改。因此,此路 PLL 时钟=24MHz * 22 = 528MHz,这也是为...原创 2019-11-05 19:49:29 · 1955 阅读 · 2 评论 -
LINUX C中sigprocmask()函数用法
1、有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。这种情况是通过阻塞信号实现的。2、信号阻塞和忽略信号的区别。http://blog.youkuaiyun.com/linux_ever/article/details/50344837阻塞的概念和忽略信号是不同的。操作系统在信号被进程解除阻塞之前不会讲信号传递出去,被阻塞的信号也不会影响...转载 2019-11-03 17:52:29 · 342 阅读 · 0 评论 -
转知乎epoll理解
首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。不管是文件,还是套接字,还是管道,我们都可以把他们看作流。之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回来...原创 2019-11-03 17:43:40 · 115 阅读 · 0 评论