linux driver
文章平均质量分 73
linux driver
wmzjzwlzs
这个作者很懒,什么都没留下…
展开
-
min_free_kbytes
上图基本揭示了几个水位的含义,当 MemFree 低于 watermarklow 时,kswapd 进行内存回收,直到空闲内存达到 watermarkhigh 后停止回收。如果申请内存的速度太快,导致空闲内存降至 watermarkmin 后,内核就会进行 direct reclaim(直接回收),用回收上来的空闲页满足内存申请,这样会阻塞应用程序。可用内存至少 8G,不达标就无法安装。为了凑这3台10G内存的服务器我已经费了不少劲了,free -m 输出中 free 不是有 9G 吗,为什么还报错?原创 2023-07-25 21:39:01 · 439 阅读 · 0 评论 -
CFS调度器-2
系统LinuxCFS 的产生就是为了在真实的硬件上模拟“理想的多任务处理器”,使每个进程都能够公平的获得 CPU。原创 2023-07-03 14:28:52 · 161 阅读 · 0 评论 -
devtmpfs分析
do_path_lookup()调用filename_lookup(),然后调用path_lookupat()函数。//对于"/usr/"路径, 此时已到路径尾。统一设备模型里,几乎任何总线的任何设备,只要发生注册操作,即device_add()操作,就有可能调用devtmpfs留给统一设备模型的接口devtmpfs_create_node().*err = sys_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, options);//第一次mount。原创 2023-06-14 17:40:58 · 889 阅读 · 0 评论 -
Linux 虚拟文件系统 VFS 源码剖析
fs_context 是 file_system_type 和 super_block 之间的桥梁,创建和配置 super_block 都离不开 fs_context,主要在 mount 调用时使用。Linux 中挂载的 super_block 除了链接到对应的 file_system_type::fs_supers 链表上,还将其链接到全局链表 super_blocks 中。mount_bdev() 和 kill_block_super() 两个函数都不是 ext4 专有函数,都是通用函数。原创 2023-06-14 17:29:57 · 1195 阅读 · 1 评论 -
linux mount 流程详解
本文代码基于Linux 5.10。Linux mount 主要通过mount 命令或者mount api来实现, 本文主要介绍mount 调用在内核中的实现。原创 2023-06-14 17:26:15 · 1014 阅读 · 0 评论 -
Linux内存分配器slub
因此,每次添加的时候都会判断当前的pobjects是否大于kmem_cache的cpu_partial成员,如果大于,那么就会将此时per cpu partial链表中所有的slab移送到kmem_cache_node的partial链表,然后再将刚刚释放obj的slab插入到per cpu partial链表。当然,kmem_cache_create仅仅是创建了一个描述slab缓存池布局的数据结构,并没有从伙伴系统申请内存,具体的申请内存操作是在kmeme_cache_alloc中完成的。原创 2023-06-14 17:26:57 · 683 阅读 · 0 评论 -
Linux 文件 io 的原子性与 O_APPEND 参数
文件 io 的原子性,是用锁来保证的,文件表有一把,保护偏移量,inode 有一把,保护读写数据。实际上,只有加上了 O_APPEND 参数,才能对同一个文件的写入操作实现真正的原子性这里没有讨论 read(),但是类比 write(),其行为也是一样的,只是写数据变为读数据。原创 2023-06-14 17:22:29 · 1150 阅读 · 0 评论 -
Linux内存管理 —— 文件系统缓存和匿名页的交换
所以swapness反映了是否积极地使用swap空间,而将swapness=0则意味着不再交换匿名页,除非当内存不足(free and file-backed pages < high watermark in a zone)的情况下才使用swap空间(这里的意思是,内存触到low之后就发起回收,直到内存回到high水位停止,但如果回收完file-backed页面都到不了high,就得开始回收匿名页了,这段时间内即使swapness=0也出现了回收匿名页的情况)。可认为是为匿名页伪造的文件背景。原创 2023-06-14 17:18:08 · 549 阅读 · 0 评论 -
基数树RadixTree
对于长整型数据的映射,如何解决Hash冲突和Hash表大小的设计是一个很头疼的问题。radix树就是针对这种稀疏的长整型数据查找,能快速且节省空间地完成映射。借助于Radix树,我们可以实现对于长整型数据类型的路由。利用radix树可以根据一个长整型(比如一个长ID)快速查找到其对应的对象指针。这比用hash映射来的简单,也更节省空间,使用hash映射hash函数难以设计,不恰当的hash函数可能增大冲突,或浪费空间。radix tree是一种多叉搜索树,树的叶子结点是实际的数据条目。原创 2023-05-07 12:26:14 · 518 阅读 · 1 评论 -
CFS调度器
导语CFS(完全公平调度器)是Linux内核2.6.23版本开始采用的进程调度器,它的基本原理是这样的:设定一个调度周期(sched_latency_ns),目标是让每个进程在这个周期内至少有机会运行一次,换一种说法就是每个进程等待CPU的时间最长不超过这个调度周期;然后根据进程的数量,大家平分这个调度周期内的CPU使用权,由于进程的优先级即nice值不同,分割调度周期的时候要加权;每个进程的累计运行时间保存在自己的vruntime字段里,哪个进程的vruntime最小就获得本轮运行的权利。原创 2023-04-19 21:08:33 · 486 阅读 · 0 评论 -
linux内存模型
本文基于以下软硬件假定:架构:AARCH64内核版本:5.14.0-rc5。原创 2023-04-14 20:42:23 · 493 阅读 · 0 评论 -
linux sparse
Sparse 诞生于 2004 年, 是由linux之父开发的, 目的就是提供一个静态检查代码的工具, 从而减少linux内核的隐患.其实在Sparse之前, 已经有了一个不错的代码静态检查工具("SWAT"), 只不过这个工具不是免费软件, 使用上有一些限制.所以 linus 还是自己开发了一个静态检查工具.具体可以参考这篇文章(2004年的文章了): Finding kernel problems automatically。原创 2023-04-14 20:40:11 · 416 阅读 · 0 评论 -
kernel_neon_begin
*这样可能会导致内核在进行浮点运算时,可能会破坏此时用户空间的浮点寄存器状态,导致用户空间的fpsimd_state状态异常,随后程序的行为将变的不可控。这部分需要查阅内核文档,如在X86上要用 kernel_fpu_begin()/kernel_fpu_end(),在arm上用 kernel_neon_begin()/ kernel_neon_end()。需要使用硬浮点,需要内核开启对硬浮点支持,同时编译时要使用上面的softfp或hard,才可以使用FPU/Neon进行计算。原创 2022-11-11 23:00:44 · 684 阅读 · 0 评论 -
arm linux中断过程
转自:ARM linux的中断处理过程 (转) - 嵌入专栏 - 博客园 一、前言本文主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件行为和软件动作。具体整个处理过程分成三个步骤来描述:1、第二章描述了中断处理的准备过程2、第三章描述了当发生中的时候,ARM硬件的行为3、第四章描述了ARM的中断进入过程4、第五章描述了ARM的中断退出过程本文涉及的代码来自3.14内核。另外,本文注意描述ARM指令集的内容,有些source code为了简短一些,删除了THUMB相关的代码,除此之外,有些原创 2022-10-23 19:14:25 · 722 阅读 · 0 评论 -
Memory Barriers
转自:Unsorted Documentation — The Linux Kernel documentationOn atomic types (atomic_t atomic64_t and atomic_long_t).The atomic type provides an interface to the architecture's means of atomicRMW operations between CPUs (atomic operations on MMIO are原创 2022-06-18 09:10:37 · 186 阅读 · 0 评论 -
Buffer Sharing and Synchronization
转自:Buffer Sharing and Synchronization — The Linux Kernel documentationThe dma-buf subsystem provides the framework for sharing buffers for hardware (DMA) access across multiple device drivers and subsystems, and for synchronizing asynchronous hardware acce原创 2022-06-18 09:06:26 · 390 阅读 · 0 评论 -
hwspinlock
===========================Hardware Spinlock Framework===========================Introduction============Hardware spinlock modules provide hardware assistance for synchronizationand mutual exclusion between heterogeneous processors and those not op原创 2022-04-26 11:11:20 · 536 阅读 · 0 评论 -
pinctrl_select_state default
bus_add_driver--driver_attach----__driver_attach------driver_probe_device--------really_probe----------pinctrl_bind_pins------------pinctrl_select_state default原创 2022-03-25 15:02:53 · 334 阅读 · 0 评论 -
echo 1 > /proc/sys/vm/block_dump
+++ b/kernel/linux-5.4/block/blk-core.c@@ -1178,6 +1178,7 @@ blk_qc_t submit_bio(struct bio *bio) op_is_write(bio_op(bio)) ? "WRITE" : "READ", (unsigned long long)bio->bi_iter.bi_sector,.原创 2022-03-18 17:58:58 · 398 阅读 · 0 评论 -
MMC分区流程分析
Chipset: msm8926OS: Android4.4Kernel: 3.4.0在N久之前的会议上留下了两个问题:1. 内核在加载emmc驱动时是如何知道当前有几个分区的?2. 如何知道/dev/mmcblkXpX对应的是哪个分区呢?读取分区加载sd/emmc驱动的时候,有如下流程:来看看Check_partition():核心的部分是check_part这个结构体,里面放的都是对应的解析分区的算法:算法不是我们需要关注的,解析哪一块区域等小弟...转载 2021-12-22 16:59:03 · 1324 阅读 · 0 评论 -
linux cma
1. of_reserved_mem_device_init(struct device *dev)给dev的cma_area赋值, 这个值是在dev的dts node中memory-region指向的cma(shared-dma-pool)2.通过dma_alloc_contiguous分配cma内存时,如果dev的cma_area有问题,会向default_area cma区域申请内存,否则向dev指向的cma区域申请内存...原创 2021-10-20 20:32:00 · 282 阅读 · 0 评论 -
sysfs read原理
第一部分为sysfs操作:该部分涉及目录创建、文件创建、文件打开、文件读取。1.目录创建目录创建函数为sysfs_create_dir_ns()。/*** sysfs_create_dir_ns - create a directory for an object with a namespace tag* @kobj: object we're creating directory for* @ns: the namespace tag to use*/int sysfs_cre...原创 2021-07-03 22:11:42 · 306 阅读 · 0 评论 -
spin_lock已经包含内存屏障的处理了
/** ARMv6 ticket-based spin-locking.** A memory barrier is required after we get a lock, and before we* release it, because V6 CPUs are assumed to have weakly ordered* memory.*/static inline void arch_spin_lock(arch_spinlock_t *lock){ u...转载 2021-07-03 21:40:17 · 283 阅读 · 0 评论 -
EHCI与OHCI驱动switch
问题:EHCI与OHCI是两个控制器,对应两个驱动程序,当一个设备插入root hub usb后,两个驱动是如何防止冲突的?网上搜了好多zi转载 2021-06-13 22:34:27 · 617 阅读 · 2 评论 -
/proc/sysrq-trigger详解
转自https://www.cnblogs.com/xu-neal/p/3835705.html# 立即重新启动计算机echo "b" > /proc/sysrq-trigger# 立即关闭计算机echo "o" > /proc/sysrq-trigger# 导出内存分配的信息 (可以用/var/log/message 查看)echo "m" > /proc/sysrq-trigger# 导出当前CPU寄存器信息和标志位的信息echo "p" > /proc/sys原创 2021-06-05 21:51:55 · 306 阅读 · 0 评论 -
led驱动
#include <mach/regs-gpio.h>#include <mach/hardware.h>#include <linux/gpio.h>#include <linux/poll.h>#include <linux/interrupt.h>#include <linux/module.h>#inclu...原创 2012-04-12 22:16:40 · 121 阅读 · 0 评论 -
按键中断驱动
#include <mach/regs-gpio.h>#include <mach/hardware.h>#include <linux/gpio.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include &l...原创 2012-04-18 21:37:48 · 135 阅读 · 0 评论 -
按键驱动,应用程序
总结:int与char的混用导致错误(copy_to_user())。。。。。。。。。。。。。。。#include <mach/regs-gpio.h>#include <mach/hardware.h>#include <linux/gpio.h>#include <linux/module.h>#include <linux/k...原创 2018-10-25 15:30:30 · 167 阅读 · 0 评论 -
一个tp小程序
#include <linux/delay.h>#include <linux/slab.h>#include <linux/interrupt.h>#include <linux/irq.h>#include <linux/kernel.h>#include <linux/semaphore.h>#includ...原创 2016-12-16 15:57:31 · 376 阅读 · 0 评论 -
关于u-boot引导linux启动
这两天在移植u-boot,花了两天完全是因为卡在nandflash里了,关于nandflash下次再写吧,这次记录一下刚刚遇到的一个问题吧。。。呵呵。 u-boot在引导linux启动,需要传递环境变量等配置 设置一些宏定义,在include/configs文件下的配置文件里添加#define CONFIG_SETUP_MEMORY_TAGS 1#define CONF...原创 2012-11-04 10:46:57 · 127 阅读 · 0 评论 -
ethernet phy driver
个人理解,可能有误1. 如果在dts中指定了phy id(ethernet-phy-id%4x.%4x), 会走of_mdiobus_register_phy->phy_device_create->phy_device_create,phy core层不会再通过mdio读phy id寄存器.2. 如果在dts中没指定phy id(ethernet-phy-id%4x.%4x), 会走of_mdiobus_register_phy->phy_device_create->get_原创 2021-05-12 20:23:14 · 1144 阅读 · 1 评论 -
device_add与device_create
2.6.30.4内核,字符设备驱动模块。。 class_create(THIS_MODULE, DEVICE_NAME); //注册一个类,使mdev可以在"/dev/"目录下 面建立设备节点。。 device_create (mydriver_class, NULL, MKDEV(MYDEVICE_MAGOR,0),NUll,DEVICE_MAME)//创建设备节点。。...原创 2012-03-26 21:12:23 · 220 阅读 · 0 评论 -
drm
所以当移除dpu时,要移除display-subsystem下对应的port原创 2018-11-27 20:12:40 · 339 阅读 · 0 评论 -
v4l2
原创 2018-11-22 20:30:53 · 130 阅读 · 0 评论 -
yaffs2注意事项
想要yaffs2在配置选项中出现,要选中MTD/caching…。。在进行nand flash烧写时,烧写的大小必须是页对齐的,使用nand write时,页大小是2kbyte,使用nand write.yaffs时,对齐大小要求是2kbyte+64byte,64byte是OOB区域的大小。。...原创 2012-03-26 21:09:35 · 248 阅读 · 0 评论 -
驱动中检查文件系统有没有mount
s32 check_fs_mounted(char *path_name){ struct path root_path; struct path path; s32 err; err = kern_path("/", LOOKUP_FOLLOW, &root_path); if (err) ...原创 2017-01-11 17:12:59 · 323 阅读 · 0 评论 -
启动用户空间init进程
内核挂接根文件系统成功之后,将通过run_init_process()函数执行应用程序。这是一个尝试的过程,如果execute_command存在,则执行execute_command,如果不存在,则顺序执行/sbin/init,/etc/init,/bin/init,/bin/sh,直到有一个成功为止。如果都不存在,panic()函数已经等在后面了。。...原创 2012-06-30 23:57:08 · 166 阅读 · 0 评论 -
Linux启动过程简介(根文件系统加载过程)?
Linux启动过程简介 许多人对Linux的启动过程感到很神秘,因为所有的启动信息都在屏幕上一闪而过。其实, Linux的启动过程并不象启动信息所显示的那样复杂,它主要分成两个阶段: 1.启动内核。在这个阶段,内核装入内存并在初始化每个设备驱动器时打印信息。 2.执行程序init。装入内核并初始化设备后,运行init程序。init程序处理所有程序的启动, 包括重要系统精...原创 2012-06-20 21:00:33 · 110 阅读 · 0 评论 -
LINUX启动注意
今天亲测了一下,UBOOT只负责加载内核,根文件系统是由LINUX内核加载的,且根文件系统在FLASH中地址必须与SMDK.C中一致。。原创 2012-06-29 18:05:29 · 81 阅读 · 0 评论 -
mount根文件系统
/* * Prepare the namespace - decide what/where to mount, load ramdisks, etc. */void __init prepare_namespace(void){int is_floppy;if (root_delay) {printk(KERN_INFO "Waiting %d sec before mount...原创 2018-10-25 14:48:21 · 194 阅读 · 0 评论