文章分类 - Linux / Linux内核
Linux内核源码分析
摘要:MDIO 我们平时看到网口映入眼帘的就是RJ45网口底座,也很少追究网口底座之下还有什么。最近在搞MDIO的驱动,对MAC、PHY之间的关系很陌生。而这两者也是组成网口的物理硬件,所以趁着这次机会弄清楚这两者之间的关系。 上图是组成网口的基本单元,一般SOC芯片内部会集成MAC,然后外接PHY芯片,
阅读全文
摘要:在linux kernel中读写文件使用的api和用户态的是不一样的,不能直接使用用户态的api。这里简单记录下使用的函数和使用方法。内核内的文件操作主要通过 file 结构体进行,配合 vfs(虚拟文件系统)的相关 API 来读写文件。 1 打开文件 在内核中要操作文件,首先要打开文件。内核中使用
阅读全文
摘要:I2C-Stub模拟I2C器件 在有时候没有I2C器件,但是需要通过I2C器件完成某些特定功能的时候,比如最近想使用libmctp库来开发MCTP的相关功能,Linux提供了I2C-Stub驱动来模拟I2C器件。这篇文章主要是用来记录I2C-Stub的使用。 1 编译I2C-Stub驱动 在Linu
阅读全文
摘要:在用户空间如何创建USB Gadget设备,并使用该设备来模拟网卡?在看到这篇[博客](Android USB之复合设备(gadget)详解 - sheldon_blogs - 博客园)的时候,看到里面有对于configfs的介绍: configfs是基于ram的文件系统,与sysfs的功能有所不同
阅读全文
摘要:在做代码移植时,看到一些寄存器操作相关的代码,发现一些宏定义在新版本的代码中已经没有了。这些宏主要是芯片各个IP的寄存器物理地址的宏定义。众所周知,在操作系统启动完,并启用MMU的情况下,是无法直接读写寄存器物理地址来操作芯片的IP的。无论是在用户态还是在内核态,都需要把物理地址映射成虚拟地址,再通
阅读全文
摘要:在看LINUX设备驱动(第三版)的时候,需要自己手敲代码然后验证。因此需要搭建一个可以编译内核驱动的编译环境。本文搭建ARM的交叉编译环境,能够单独编译出模块ko。 1 代码准备 在driver目录下创建helloworld文件夹,并在该文件夹下创建hello.c和Makefile文件。 hello
阅读全文
摘要:有些跑在i2c的协议(例如MCTP Over I2C)都是需要双向传输消息的。 当请求方发送MCTP请求消息之后,会等待响应方处理请求之后,读取响应方的响应消息。对于i2c器件来说,一般都是主设备给从设备发消息。当请求方发送MCTP请求消息时,请求方作为主设备。响应方处理完请求发送给请求方时,响应方
阅读全文
摘要:1 打开文件描述符 读写i2c器件的时候,一般代码流程都是: 打开设备获取设备文件描述符 ioctl设置读取的i2c器件的从地址 调用read/write函数读写数据 int fd = open("/dev/i2c-1", O_RDWR); ioctl(fd, I2C_SLAVE, 0x50); /
阅读全文
摘要:1 内核日志级别 内核通过 printk 输出日志,其级别由 /proc/sys/kernel/printk 控制。直接读取该文件即可: cat /proc/sys/kernel/printk 输出示例如下: 4 4 1 7 四个数字分别表示: 当前控制台日志级别(Console Log Level
阅读全文
摘要:pipe_read函数逻辑 相对简单,这里只关注内部实现,暂时忽略copy_page_to_iter函数实现: /* 对管道上锁,避免竞态 */ __pipe_lock(pipe); for (;;) { /* 管道当前可读的数据缓冲区数量;这里的for循环就是需要把缓冲区的数据全部读取出来存放到用
阅读全文
摘要:在使用open函数打开管道时,会对管道的inode节点进行内存分配: /* 防止并发,上锁保护 */ spin_lock(&inode->i_lock); /* 首次打开管道,需要申请内存,这里判断是否已经分配内存 */ if (inode->i_pipe) { pipe = inode->i_pi
阅读全文

浙公网安备 33010602011771号