<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[yy197696的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/yy197696</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; yy197696]]></copyright><item><title><![CDATA[【BSP开发经验】用户态栈回溯技术]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/139158995</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/139158995</guid><author>yy197696</author><pubDate>Thu, 23 May 2024 22:21:41 +0800</pubDate><description><![CDATA[在这张图中，计算机的栈空间采用的是向下增长的方式（MIPS架构没有专门入栈和出栈指令，栈的增长方向不定，可能是高地址向低地址增长，或是相反），SP(stack pointer)就是当前函数的栈指针，它指向的是栈底的位置。在MIPS平台开始栈回溯的时候，我们可以获取的信息有寄存器SP,PC,RA的内容，使用PC和RA我们可以得到当前函数和上一级函数地址，问题在于怎样通过SP寻找到上一级函数的栈，在没有直接获取栈地址的方法的情况下需要通过进行代码分析来实现。参考后面调用func1函数的操作。]]></description><category></category></item><item><title><![CDATA[【BSP开发经验】简易文件系统实现方式]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/139158778</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/139158778</guid><author>yy197696</author><pubDate>Thu, 23 May 2024 22:14:27 +0800</pubDate><description><![CDATA[../进程目录信息//进程打开文件信息/...int users;/结构体实例用户数量/int umask;/进程根目录和当前工作目录//目录项所在文件系统挂载信息，vfsmount.mnt//目录项指针/root成员表示进程访问内核根文件系统，通常为根文件系统的根节点，但也可以通过chroot()系统调用修改进程根目录。进程以绝对路径搜索文件时，从进程根目录开始。pwd成员表示进程当前工作目录。进程以相对路径访问文件时，将会从当前工作目录开始查找。]]></description><category></category></item><item><title><![CDATA[【BSP开发经验】Linux与uboot控制台串口]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/136386160</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/136386160</guid><author>yy197696</author><pubDate>Fri, 01 Mar 2024 08:53:34 +0800</pubDate><description><![CDATA[leadcore1861平台在到板后发现引出的串口控制台没有任何输出，询问厂家后了解到厂家代码指定串口4作为串口控制台，而我们使用了串口0，所以需要对uboot串口和linux串口控制台进行修改，指定到串口0输出。（3）board/开发板名字/serial.c、cpu/cpu名字/serial.c、drivers/serial/serial.c、drivers/serial/serial_xxx.c。next表示指向下一个串口设备的指针。在include/serial.h 中定义了表示串口设备的数据结构。]]></description><category></category></item><item><title><![CDATA[【BSP开发经验】Linux内核开发调试手段]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/136386021</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/136386021</guid><author>yy197696</author><pubDate>Fri, 01 Mar 2024 08:47:55 +0800</pubDate><description><![CDATA[内核开发比用户空间开发更难的一个因素就是内核调试艰难。内核错误往往会导致系统宕机，很难保留出错时的现场。调试内核的关键在于你的对内核的深刻理解，同时需要掌握一些内核调试的基本手段。]]></description><category></category></item><item><title><![CDATA[【网络BSP开发经验】网络流量应用识别技术]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/134719165</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/134719165</guid><author>yy197696</author><pubDate>Thu, 30 Nov 2023 18:50:05 +0800</pubDate><description><![CDATA[针对上述问题，我们新框架需要完成以下几个重要的功能点：1）报文解析流程设备无关化2）输出报文解析统计数据3）流量重放整体应用识别框架可以分为三个部分：1）报文解析引擎：负责报文解析匹配，输入skb，输出flow_info，flow_info中包含匹配到的应用信息，特征库序号以及smac.然后基于次应用识别引擎开发跨平台报文分析工具，支持流量重放分析。2）策略执行器：根据报文解析引擎返回的结果对报文进行相关处理（DROP 或者 MARK）]]></description><category></category></item><item><title><![CDATA[【BSP开发经验】uboot gpl框架开发经验]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/134714068</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/134714068</guid><author>yy197696</author><pubDate>Thu, 30 Nov 2023 15:44:11 +0800</pubDate><description><![CDATA[U-Boot 的 GPL 隔离是指在 U-Boot 中，将 GPL 认为具有侵权风险的代码与非 GPL 代码分隔开来，以避免 GPL 认为有侵权风险的代码“污染”了非 GPL 代码，从而使得整个 U-Boot 项目遵守 GPL 协议，保障代码的版权和使用权。第 3 行的“.text”是段名（代码段），后面的冒号是语法要求，冒号后面的大括号里面可以填上要链接到“.text”这个段里面的所有文件，“(.text)”中的“”是通配符，表示所有输入文件的.text段都放到“.text”中。链接脚本是文本文件。]]></description><category></category></item><item><title><![CDATA[【网络BSP开发经验】Linux gmac驱动调试]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/132567050</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/132567050</guid><author>yy197696</author><pubDate>Tue, 29 Aug 2023 17:52:57 +0800</pubDate><description><![CDATA[网络设备驱动是linux内核中三大类设备驱动之一，它用来完成高层网络协议的底层数据传输及设备控制。网络设备与其他两种设备的区别：网络接口不存在于linux的文件系统中，及/dev下没有设备文件，用户通过套接口socket函数使用网络。网络除了响应来自内核的请求外，还需要处理外界的异步数据除了数据处理，网络设备还要完成地址设置、配置网络参数及流量统计等管理任务。]]></description><category></category></item><item><title><![CDATA[【网络BSP开发经验】交换芯片驱动开发1（RTL8306MB交换芯片驱动开发）]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/129571370</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/129571370</guid><author>yy197696</author><pubDate>Wed, 15 Mar 2023 22:34:37 +0800</pubDate><description><![CDATA[网络BSP 交换芯片驱动开发]]></description><category></category></item><item><title><![CDATA[【C/C++】C语言runtime调用技术]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/128168416</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/128168416</guid><author>yy197696</author><pubDate>Sun, 04 Dec 2022 00:01:31 +0800</pubDate><description><![CDATA[C语言编译后，在可执行文件中会有 。如果想要动态调用一个C函数，首先需要 根据函数名找到这个函数地址 ，然后根据函数地址进行调用。动态链接器已经提供一个 API：，可以通过函数名字拿到函数地址：
从上面代码中可以看出，test方法是没有返回值和参数的。所以funcPointer只能在指向参数和返回值都是空的函数时才能正确调用到。
对于有返回值和有参数的C函数，需要指明参数和返回值类型才能使用。
不同的函数都有不同的参数和返回值类型，也就没办法通过一个万能的函数指针去支持所有函数的动态调用，必须要让函数的参数]]></description><category></category></item><item><title><![CDATA[【Linux内核代码分析1】Linux时间子系统及HRTIMER实现]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/128168314</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/128168314</guid><author>yy197696</author><pubDate>Sat, 03 Dec 2022 23:55:25 +0800</pubDate><description><![CDATA[（1）嵌入式设备需要较好的电源管理策略。传统的linux会有一个周期性的时钟，即便是系统无事可做的时候也要醒来，这样导致系统不断的从低功耗（idle）状态进入高功耗的状态。这样的设计不符合电源管理的需求。
（2）多媒体的应用程序需要非常精确的timer，例如为了避免视频的跳帧、音频回放中的跳动，这些需要系统提供足够精度的timer
和低精度timer不同，高精度timer使用了人类的最直观的时间单位ns（低精度timer使用的tick是和内核配置相关，不够直接）。本质上linux早期时间子系统如图kerne]]></description><category></category></item><item><title><![CDATA[【嵌入式Linux开发学习】基于TFTP的通用代码烧写方式]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/127504985</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/127504985</guid><author>yy197696</author><pubDate>Mon, 24 Oct 2022 23:47:18 +0800</pubDate><description><![CDATA[对于从事嵌入式行业的人来说，进行代码升级一定不会陌生。相对于单片机相对单一的烧写方式，嵌入式Linux开发中的烧写方式就丰富了许多。常见的比如串口烧写，USB烧写（fastboot），sd卡烧写。]]></description><category></category></item><item><title><![CDATA[【嵌入式Linux开发学习】rootfs通过ramfs挂载技巧]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/127470254</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/127470254</guid><author>yy197696</author><pubDate>Sun, 23 Oct 2022 02:22:46 +0800</pubDate><description><![CDATA[在使用initramfs的过程中我感觉相比于传统的我们直接挂载块设备/dev/mmcblk0 /mmc/sda1 之类的挂载点来看相比于读写块设备 ，读写ram总归是会快很多的，系统性能会有所提高。可以避免一些需要频繁擦写数据的情况对于块设备的消耗，可以提升设备寿命，对于不怎么开关机长期保持上电状态的设备比如交换机，网桥之类尤其如此。]]></description><category></category></item><item><title><![CDATA[【BSP开发学习6】模块符号的导入与导出以及使用模块规避GPL传染性]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/126446314</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/126446314</guid><author>yy197696</author><pubDate>Sun, 21 Aug 2022 00:18:11 +0800</pubDate><description><![CDATA[依据GPL 的相关规定，如果原始授权人采用GPL来发布自己的作品，那么无论该作品的任何衍生作品，都要遵从GPL 的规则，尽管你对于该衍生作品拥有著作权，但是你也不可以因此认为它是你的心血而另立新规，可谓“子子孙孙无穷尽也”。GPL 下的软件，是允许作为学习来复制使用的。由于相当多的内核符号都是以EXPORT_SYMBOL_GPL（）导出的，所以历史上曾经有一些公司把内核的EXPORT_SYMBOL_GPL（）直接改为EXPORT_SYMBOL（），然后将修改后的内核以GPL形式发布。，就可以方便的调用了。]]></description><category></category></item><item><title><![CDATA[【BSP开发之kernel】Linux启动流程以及编译流程分析]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/126187026</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/126187026</guid><author>yy197696</author><pubDate>Fri, 05 Aug 2022 22:50:54 +0800</pubDate><description><![CDATA[uImage 是老版本 uboot 专用的镜像文件，uImag 是在 zImage 前面加了一个长度为 64。展开就是 @ make -f ./scripts/Makefile.build obj=$@arch/arm/kernel/vmlinux.lds 就是整个 Linux 的链接脚本。字节的“头”，这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息。用 objcopy 取消掉 vmlinux 中的一些其他信息。zImage 是经过 gzip 压缩后的 Image。...]]></description><category></category></item><item><title><![CDATA[【BSP开发学习5】GPIO子系统]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/126187003</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/126187003</guid><author>yy197696</author><pubDate>Fri, 05 Aug 2022 22:47:44 +0800</pubDate><description><![CDATA[gpio_request 函数用于申请一个 GPIO 管脚，在使用一个 GPIO 之前一定要使用 gpio_request。如果不使用某个 GPIO 了，那么就可以调用 gpio_free 函数进行释放。因为权限问题，所以没有办法手动添加设备节点，也没有mdev,udev进行设备节点的管理，可以使用echo 8 > /proc/sys/kernel/printk调整打印等级。此函数用于设置某个 GPIO 的值，此函数是个宏，定义如下。所以需要手动添加设备节点。打印问题，默认打印等级很低。...]]></description><category></category></item><item><title><![CDATA[【BSP开发学习4】Linux 内核时间管理]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/126186986</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/126186986</guid><author>yy197696</author><pubDate>Fri, 05 Aug 2022 22:46:36 +0800</pubDate><description><![CDATA[Linux 内核中有大量的函数需要时间管理，比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源，时钟源的频率可以设置， 设置好以后就周期性的产生定时中断，系统使用定时中断来计时。中断周期性产生的频率就是系统频率，也叫做节拍率(tick rate)(有的资料也叫系统频率)，比如 1000Hz，100Hz 等等说的就是系统节拍率。...]]></description><category></category></item><item><title><![CDATA[【BSP开发学习3】内核并发处理]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/126186978</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/126186978</guid><author>yy197696</author><pubDate>Fri, 05 Aug 2022 22:45:33 +0800</pubDate><description><![CDATA[可能引起Linux 内存混乱的原因。]]></description><category></category></item><item><title><![CDATA[【BSP开发学习2】平台设备驱动]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/126186958</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/126186958</guid><author>yy197696</author><pubDate>Fri, 05 Aug 2022 22:44:35 +0800</pubDate><description><![CDATA[为什么要使用设备驱动模型
我对于Linux 引入设备驱动模型的理解是就在于将一份驱动代码分成两份，一份代码是通用的也就是驱动driver ，令一份代码不是通用的会随着板子CPU的不同,发生改变。通过sys文件系统下面的目录和文件可以清楚的了解到Linux系统中的设备情况和组织关系。

sysfs提供一种可以显式描述内核对象，对象属性以及对象关系的方法。树形结构中每一个目录与一个kobject对象相对应，其包含了目录的组织结构和名字等信息。在Linux系统中， kobject结构体是组成设备驱动模型的基本结构]]></description><category></category></item><item><title><![CDATA[【BSP开发学习1】通用字符设备开发]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/126186949</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/126186949</guid><author>yy197696</author><pubDate>Fri, 05 Aug 2022 22:43:50 +0800</pubDate><description><![CDATA[8 };在 cdev 中有两个重要的成员变量：ops 和 dev，这两个就是字符设备文件操作函数集合file_operations 以及设备号 dev_t。编写字符设备驱动之前需要定义一个 cdev 结构体变量，这个变量就表示一个字符设备。...]]></description><category></category></item><item><title><![CDATA[【Linux开发基础知识】shell语法整理]]></title><link>https://blog.youkuaiyun.com/yy197696/article/details/126186929</link><guid>https://blog.youkuaiyun.com/yy197696/article/details/126186929</guid><author>yy197696</author><pubDate>Fri, 05 Aug 2022 22:42:44 +0800</pubDate><description><![CDATA[变量定义  a=1变量引用 $a ${a}在Makefile 中 对于Makefile 变量的引用 使用Makefile 下的方式$(a)对于shell 中的变量使用$${a}数组名=(元素1 元素2 元素3 … 元素n)]]></description><category></category></item></channel></rss>