
Linux 内核
文章平均质量分 79
分析Linux内核基本框架、设备数据流、进程线程、锁等相关内容。内容持续更新。
Bazinga bingo
自律的顶端是孤独,孤独的顶端是自由
展开
-
【Linux】谨慎使用system函数以及对应解决方案
使用system()函数并不是核心,它的返回值、它所执行命令的返回值以及命令执行失败原因如何定位,这才是重点。原创 2024-05-07 18:33:07 · 1292 阅读 · 0 评论 -
Linux内核(十七)Linux内核 panic函数 详解以及实际应用
当用户手上的系统设备没有接上串口,此时系统发生了不知名的panic 崩溃,看门狗重启了。size_t: 是标准C库中定义的,32位系统:unsigned int,在64为系统: long unsigned int。在启动脚本中可以限制log个数,不至于log信息堆积影响系统正常运行(实例中只保留最新的5个panic log)在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节.panic函数的主要作用是停止当前的系统运行,在系统监测到异常时调用该函数。文章实现log记录。原创 2023-09-04 09:00:00 · 1862 阅读 · 0 评论 -
Linux内核(十六)Linux 内核态进行读写文件的函数 使用和解析
这个函数和vfs_read()都是差不多的,只是调用的文件操作方法不同而已(file->f_op->write) ,如果没有定义file->f_op->write ,同样也需要do_sync_write()调用同样文件写操作, 首先把数据写到内存中,然后在适当的时候把数据同步到具体的存储介质中去。以open /sys/log为例,该方法最终的结果是,更新struct nameidata实例指针nd中的path、inode字段,使其指向路径/sys/,更新nd中的last值,使其为log。原创 2023-09-01 07:21:01 · 2189 阅读 · 0 评论 -
Linux内核(十五)sysrq 详解 II —— 代码框架详解
Linux 版本:Linux version 3.18.24sysrq模块源码路径:linux-3.18.24.x/drivers/tty/sysrq.c编译开启:CONFIG_MAGIC_SYSRQ=y1、sysrq模块初始化2、创建sysrq在proc下节点:sysrq_init_procfs3、本linux系统内,proc下sysrq事件的回调函数注册始终是打开的:sysrq_on()4、注册sysrq事件的回调函数:sysrq_register_handlersysrq产生kernel原创 2023-05-18 12:00:00 · 1390 阅读 · 0 评论 -
Linux内核(十五)sysrq 详解 I —— 使用手册
这是一组“魔术组合键”,只要内核没有被完全锁住,不管内核在做什么事情,使用这些组合键能即时打印出内核的信息。使用SysRq组合键是了解系统目前运行情况的最佳方式。因为打开sysrq键的功能以后,有终端访问权限的用户将会拥有一些特别的功能。因此,除非是要调试,解决问题,一般情况下,不要打开此功能。如果一定要打开,请确保你的终端访问的安全性。原创 2023-05-16 12:00:00 · 1552 阅读 · 0 评论 -
Linux内核(十四)Input 子系统详解 IV —— 配对的input设备与input事件处理器 input_register_handle
当 input设备注册Input_register_device 和 一个新的input事件注册input_register_handler 匹配上,都会调用回调函数handler->connect(handler, dev, id)(2)保存驱动设备的主次设备号,其中主设备号INPUT_MAJOR=13,次设备号=EVSEV_MINOR_BASE+驱动程序本身设备号。(3)会在/sys/class/input类下创建驱动设备event%d,比如键盘驱动event1。原创 2023-05-13 12:00:00 · 811 阅读 · 0 评论 -
Linux内核(十四)Input 子系统详解 III —— input 事件注册 input_register_handler
id_table[i]中支持相关的匹配项就匹配:成功就跳出;不成功匹配失败执行continue循环检测下一个。功能: 判断bitmap2是否是bitmap1的子集,是返回1,不是返回0。input函数路径:drivers/input/input.c。具体input子系统事件注册:evdev_init。路径:drivers/input/evdev.c。本文章中与input子系统相关的结构体可参考。原创 2023-05-12 22:10:05 · 928 阅读 · 0 评论 -
Linux内核(十四)Input 子系统详解 II —— 设备端 input 子系统注册 Input_register_device
6、遍历input_handler链表上,对链表中的每一个input_handler执行input_attach_handler函数。2、所有的输入设备的主设备号都是13,input-core通过次设备号来进行输入设备进行分类。input_allocate_device:为新设备提供input_dev结构体内存空间。5、将input_dev添加到input_dev_list链表。2、设置input_devce结构体中有关处理重复按键的成员。3、设置input_devce结构体中 获取和设置按键的函数。原创 2023-05-04 20:48:21 · 1471 阅读 · 1 评论 -
Linux内核(十四)Input 子系统详解 I —— 子系统介绍以及相关结构体解析
input子系统就是管理输入的子系统,和Linux其他子系统一样,都是Linux内核针对某一类设备而创建的框架。鼠标、键盘、触摸屏等都属于输入设备,Linux将这些设备的共同特性抽象出来,这就形成了input子系统的框架。Linux内核只需要通过input框架向用户层上报输入事件(如:按键值,坐标等),不需要关心应用层的事情输入设备本质上就是字符设备,经过input框架后,最终给用户空间提供可以访问的设备节点input_dev结构体是硬件驱动层,代表一个input设备。原创 2023-04-30 09:00:00 · 2934 阅读 · 0 评论 -
Linux内核(十三)系统软中断 software
中断要求快进快出,提高执行效率,尽量少做和硬件相关或数据处理等耗时繁琐的操作。中断注意事项中断会关闭调度,中断优先级高于任何任务的优先级。长时间中断处理会影响系统的效率,继而影响其他系统任务进行,系统任务超时引起不可预料的后果。中断处理程序中不可以睡眠,不可以使用引起睡眠的函数(如ssleep、msleep、kmalloc、copy_to_user、copy_from_user),也不能使用可以引起睡眠的锁(metux锁),可以使用自旋锁。原创 2023-03-02 22:19:50 · 993 阅读 · 0 评论 -
Linux内核(十二)[ RK3568 ] RTC驱动代码解析
平台:RK3568 内核版本:4.19.194文章目录RTC简介RTC相关结构体RTC整体调用框架RTC代码解析涉及到的目录功能总结RTC驱动注册函数解析应用层调用驱动流程解析RTC简介RTC 也就是实时时钟,用于记录当前系统时间,对于 Linux 系统而言时间是非常重要的,使用 Linux 设备的时候也需要查看时间。RTC是Linux的时间系统。RTC 设备驱动是一个标准的字符设备驱动,应用程序通过 open、 release、 read、 write 和 ioctl 等函数完成对 RT原创 2022-01-15 23:11:54 · 2260 阅读 · 1 评论 -
Linux内核(十一)WiFi MAC地址获取流程
platform:RKOS:LinuxKernel: 4.4.143用户空间查看MAC地址:/sys/class/net/wlan0/addressWIFI如何注册并生成address文件?net目录下的节点如eth/wlan生成都是通过网络设备注册生成的,以下是WiFi注册流程:注册后 /sys/class/net/wlan0/address 就生成了。WIFI MAC address如何获取?打开/sys/class/net/wlan0/address调用 函数address_sho原创 2022-07-07 22:06:40 · 2934 阅读 · 0 评论 -
Linux内核(十)WIFI BT电路解析 对应设备树配置解析
WL_REG_ON: 主要用于上电,休眠的时候,请保持GPIO上电,否则会丢失WiFi内部的状态,导致WiFi唤醒失败; SDIO注册上WIFI就有电压WL_HOST_WAKE: 主要用于WiFi设备有数据的时候,唤醒CPU,进入中断。(其中引脚的电平要看CPU如何配置的,如果配置的是高电平有效,那么默认情况下是低电平,当WiFi有数据过来的时候就拉高,直到主控这边把数据拿完再拉低,如果主控一直没有来拿数据就一直是高电平。)(通过WL_HOST_WAKE中断实现当有网络数据的时候,才唤醒CPU,平时C原创 2022-07-07 22:30:58 · 6379 阅读 · 3 评论 -
Linux内核(九)WIFI ----- SDIO接口驱动
SDIO接口的WIFI:1、WIFI是一个sdio卡设备2、具备wifi功能SDIO接口的WIFI驱动就是在WIFI外面套上一个SDIO驱动的外壳SDIO部分代码结构:drivers/mmc 下有 mmc卡、sd卡、sdio 卡驱动。|- mmc| |- card // 因为记忆卡都是块设备,当然需要提供块设备的驱动程序,这部分是实现将你的SD卡如何实现为块设备的| |- core // 是整个MMC的核心存,原创 2022-07-05 19:42:41 · 4528 阅读 · 0 评论 -
Linux内核(八) PHY状态机以及网络相关操作命令解析
文章目录背景解析状态机网络操作命令解析(1)运行ifconfig eth0 up命令背景上一篇介绍了PHY设备的识别,构建phy_device结构体的同时,将PHY状态机放在延时队列里,实时更新PHY的状态。介绍文件系统调用命令来对网口进行操作涉及驱动流程。解析状态机// drivers/net/phy/phy.c // 注册phy_device后,状态机就开始启动,监测phy状态void phy_state_machine(struct work_struct *work){ str原创 2022-01-10 22:39:48 · 2953 阅读 · 0 评论 -
Linux内核(七)[ IMX6ULL ] PHY驱动框架解析 —— MDIO总线
平台:freescale 内核版本:Linux version 4.1.15文章目录概述PHY控制器驱动PHY驱动解析一、相关结构体二、网口和mdio总线设备树配置(代码以imx6ull为例)三、MAC驱动和mdio控制器注册四、PHY设备驱动概述PHY芯片为OSI最底层 —— 物理层,通过MII/GMII/RMII/SGMII/XGMII等多种媒体独立接口(介质无关接口)与数据链路层的MAC芯片相连,并通过MDIO接口实现对PHY 状态的监控、配置和管理PHY与MAC整体的连接框图:注:原创 2022-01-09 23:58:14 · 8566 阅读 · 1 评论 -
Linux内核(六)[ RK3568 ] 手动/自动调整千兆网口延时TX RX
文章目录背景手动测试RX TX的延时值节点确认使用方法扫描delayline窗口效果图代码解析设备树配置相关结构体自动扫描延时驱动代码解析扫描函数解析背景最近在调试RK系列的网口,出现网口丢包很严重,或者获取不到IP(手动获取ip也无法ping通外网和内网)等。出现这类问题很大可能是MAC或PHY的延时出现问题,造成收发数据丢包。这时手动调整PHY芯片寄存器收发延时值或者MAC延时值(设备树节点里TX/RX值)很麻烦。我在测试过程中出现由于PCB的原因造成每块板子的延时值不同,需要按照每块板子进行网口延原创 2022-01-13 21:34:38 · 16491 阅读 · 0 评论 -
Linux内核(五) [ RK3568 ] PHY驱动框架解析 —— MDIO总线
平台:RK3568 内核版本4.19.194文章目录网口驱动相关结构体设备树配置与解析驱动流程详解网口驱动相关结构体// 不同平台的mac操作函数集结构体struct rk_gmac_ops { void (*set_to_rgmii)(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay); void (*set_to_rmii)(struct rk_priv_data *bs原创 2022-01-11 23:05:58 · 5916 阅读 · 1 评论 -
Linux内核 (四)[ IMX RK ] UART用户层与驱动层调用关系解析 (III)
背景系列讲解了uart-tty驱动框架以及open、write在驱动里的调用。本章研究下用户层读函数read如何从驱动中获取数据。驱动调用解析Read和write操作就会交给line discipline处理。调用Open/Read/Write则调用驱动tty_open/tty_read/tty_write// line discipline结构体 // include/linux/tty_ldisc.h struct tty_ldisc { struct tty_ldi原创 2022-02-03 09:20:04 · 1424 阅读 · 2 评论 -
Linux内核 (三)[ IMX RK ] UART用户层与驱动层调用关系解析 (II)
UART用户层接口函数调用驱动流程,本章主要介绍Write调用。Read和write操作就会交给line discipline处理。调用Open/Read/Write则调用驱动tty_open/tty_read/tty_write,先看个line discipline结构体// line discipline结构体 // include/linux/tty_ldisc.h struct tty_ldisc { struct tty_ldisc_ops *ops; st原创 2022-01-21 19:07:05 · 777 阅读 · 0 评论 -
Linux内核(二) [ IMX RK ] UART用户层与驱动层调用关系解析(I)
文章目录框架简介结构体之间重要的关联相关结构体解析上层调用open/wirte/read调用流程调用open函数流程框架简介在linux系统中,tty表示各种终端。终端通常都跟硬件相对应。下图为tty框架的层次结构最上面的用户空间会有很多对底层硬件(在本文中就是WK2414 SPI扩UART设备)的操作,像read,write等。用户空间主要是通过设备文件同 tty_core交互,tty_core根据用空间操作的类型再选择跟line discipline和tty_driver也就是serial_co原创 2022-01-20 22:21:50 · 1235 阅读 · 0 评论 -
Linux内核(一) [ IMX RK ] TTY-UART驱动框架解析
平台:NXP imx6ull 内核版本:4.1.15文章目录一、Linux TTY驱动框架二、Linux Uart驱动框架三、UART相关结构体uart_driver(UART驱动结构体) 、uart_port(UART端口) 、uart_ops(UART操作函数集)四、设备树配置五、串口驱动分析一、Linux TTY驱动框架Linux TTY驱动程序代码位于/drivers/tty下面。TTY整体框架大致分为TTY应用层、TTY文件层、TTY线路规程层、TTY驱动层、TTY设备驱动层。TTY应原创 2022-01-18 22:42:13 · 1936 阅读 · 0 评论