<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[kunkliu的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/kunkliu</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; kunkliu]]></copyright><item><title><![CDATA[WFE和WFI的区别]]></title><link>https://blog.csdn.net/kunkliu/article/details/130005200</link><guid>https://blog.csdn.net/kunkliu/article/details/130005200</guid><author>kunkliu</author><pubDate>Fri, 07 Apr 2023 09:53:08 +0800</pubDate><description><![CDATA[1. 概念：WFI(Wait for interrupt)和WFE(Wait for event)是两个让核进入low-power standby模式的指令，由ARM architecture定义，由ARM core实现。]]></description><category></category></item><item><title><![CDATA[__raw_writel, writel_relaxed 和 writel的区别]]></title><link>https://blog.csdn.net/kunkliu/article/details/129940167</link><guid>https://blog.csdn.net/kunkliu/article/details/129940167</guid><author>kunkliu</author><pubDate>Mon, 03 Apr 2023 21:27:22 +0800</pubDate><description><![CDATA[write_relaxed： 在ARM平台上与__raw_writel一样，因为与__raw_writel相比，它只多做。一个DSB和L2的sync。内容在DMA开始之前都到memory里，所以开始DMA的指令(writel)里加了。对于ARM而言，当多个写以代码的顺序到达相同设备时，执行的顺序也是被保证的，不过。其实： writel也不能保证写的东西一定完成，它只能保证写的指令或写的内容。所以说： 只有在有DMA操作的代码里，writel才是必须的，其实它是一个。对于不同的设备，执行的顺序就不被保证了。]]></description><category></category></item><item><title><![CDATA[rpmsg 内核开发 用户层接口]]></title><link>https://blog.csdn.net/kunkliu/article/details/129939864</link><guid>https://blog.csdn.net/kunkliu/article/details/129939864</guid><author>kunkliu</author><pubDate>Mon, 03 Apr 2023 21:16:59 +0800</pubDate><description><![CDATA[地址：https://blog.csdn.net/thisway_diy/article/details/129195479。Tina Linux E907开发指南。7.2 rpmsg 用户层接口。7.1 rpmsg 内核开发。]]></description><category></category></item><item><title><![CDATA[linux的uapi文件夹,【linux】Linux kernel uapi header file（用户态头文件）]]></title><link>https://blog.csdn.net/kunkliu/article/details/129939788</link><guid>https://blog.csdn.net/kunkliu/article/details/129939788</guid><author>kunkliu</author><pubDate>Mon, 03 Apr 2023 21:13:23 +0800</pubDate><description><![CDATA[例如：在A.h中inline function时发现里面用到的某些struct定义在B.h中，而B.h中又有inline function需要用到A.h中的struct，就会造成循环包含recursive include。转发自：http://vh21.github.io/linux/2014/11/21/linux-kernel-uapi-include-file.html。把userspace API的文件独立到 include/uapi跟arch/xxxx/include/uapi下，]]></description><category></category></item><item><title><![CDATA[虚拟机ubuntu20.04安装qemu跑Linux]]></title><link>https://blog.csdn.net/kunkliu/article/details/129914676</link><guid>https://blog.csdn.net/kunkliu/article/details/129914676</guid><author>kunkliu</author><pubDate>Sun, 02 Apr 2023 18:22:53 +0800</pubDate><description><![CDATA[sudo apt install aptitude -y //安装处理依赖关系更好的软件管理工具。本文一步一操作，在Ubuntu20.04下安装基本的qemu+linux5.0开发环境。3、补全常用的目录，具体直接ls /看看你当前ubuntu的，把常用的补全。/* (鉴于一切从零开始，这里也涉及到依赖库的情况)三、安装busybox制作根文件系统。二、安装qemu虚拟器。]]></description><category></category></item><item><title><![CDATA[Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统]]></title><link>https://blog.csdn.net/kunkliu/article/details/129913921</link><guid>https://blog.csdn.net/kunkliu/article/details/129913921</guid><author>kunkliu</author><pubDate>Sun, 02 Apr 2023 17:30:16 +0800</pubDate><description><![CDATA[通过NFS网络根文件系统，可以实现开发板在通过u-boot启动内核后，通过NFS网络在别的PC主机上挂载根文件系统。对于开发调试阶段的工作学习提供了很大的便利，可以直接在Linux主机上开发、编译驱动或者APP，并将目标文件拷贝到NFS服务目录中进行使用（此时文件相当于被拷贝到了开发板的根文件系统中）。》，已经实现了通过u-boot加载Kernel启动开发板，并且挂载根文件系统，本文讲述通过NFS网络挂载根文件系统。使用NFS网络文件系统时，需要Linux主机关闭系统防火墙，否则，系统在运行时会出现异常。]]></description><category></category></item><item><title><![CDATA[Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核]]></title><link>https://blog.csdn.net/kunkliu/article/details/129913888</link><guid>https://blog.csdn.net/kunkliu/article/details/129913888</guid><author>kunkliu</author><pubDate>Sun, 02 Apr 2023 17:25:55 +0800</pubDate><description><![CDATA[gcc标签（空格分隔）： Qemu ARM Linux在上文《》中已经简单讲述了通过Qemu模拟直接启动Linux内核，并挂在SD卡根文件系统的方法，这种方法是直接启动内核，与实际应用中ARM板的启动方式：u-boot、kernel、rootfs有些不同。现在就来讲述下通过Qemu搭建通过u-boot启动Linux内核并挂载根文件系统的方法。]]></description><category></category></item><item><title><![CDATA[Qemu搭建ARM vexpress开发环境(一)]]></title><link>https://blog.csdn.net/kunkliu/article/details/129913859</link><guid>https://blog.csdn.net/kunkliu/article/details/129913859</guid><author>kunkliu</author><pubDate>Sun, 02 Apr 2023 17:24:17 +0800</pubDate><description><![CDATA[嵌入式软件开发依赖于嵌入式硬件设备，比如：开发板、外部模块设备等，但是如果只是想学习、研究Linux内核，想学习Linux内核的架构，工作模式，需要修改一些代码，重新编译并烧写到开发板中进行验证，这样未必有些复杂，并且为此专门购买各种开发版，浪费资金，开会演示效果还需要携带一大串的板子和电线，不胜其烦。然而Qemu的使用可以避免频繁在开发板上烧写版本，如果进行的调试工作与外设无关，仅仅是内核方面的调试，Qemu模拟ARM开发环境完全可以完美地胜任。目录下面简单介绍下我的Qemu开发环境搭建过程。]]></description><category></category></item><item><title><![CDATA[Linux内存管理之CMA简介]]></title><link>https://blog.csdn.net/kunkliu/article/details/129903287</link><guid>https://blog.csdn.net/kunkliu/article/details/129903287</guid><author>kunkliu</author><pubDate>Sat, 01 Apr 2023 21:23:32 +0800</pubDate><description><![CDATA[1.概述在过程中经常需要使用到连续大块物理内存，尤其是DMA设备。而实际在系统经过长时间的允许之后，物理内存会出现比较严重的碎片化现象，虽然通过内存规整，内存回收等手动可以清理出一段连续的物理内存，但是并不能保证一定能够申请较大连续物理块。最初连续申请较大块物理内存，一般都是只在DMA场景中使用，因此内核专门把物理内存划分出ZONE_DMA专门用于DMA内存申请(当然划分DMA_ZONE还有其他原因，在较早DMA中由于DMA寻址地址限制 只能将一定范围的物理内存），用于解决DMA申请连续物理内存问题。]]></description><category></category></item><item><title><![CDATA[dma_alloc_coherent的2种内存分配方式]]></title><link>https://blog.csdn.net/kunkliu/article/details/129903014</link><guid>https://blog.csdn.net/kunkliu/article/details/129903014</guid><author>kunkliu</author><pubDate>Sat, 01 Apr 2023 21:07:17 +0800</pubDate><description><![CDATA[rmem_dma_ops.device_init() = rmem_dma_device_init 将reserved-memory内存一致性建页表（memremap(MEMREMAP_WC))并绑定到dev->dma_mem中。dma_alloc_coherent(dev, GFP_ATOMIC) = pci_alloc_consistent 从预留的cma_pool分配，不可被中断。of_reserved_mem_device_init （要求reserved内存shared-dma-pool）]]></description><category></category></item><item><title><![CDATA[宋宝华： 关于DMA ZONE和dma alloc coherent若干误解的彻底澄清]]></title><link>https://blog.csdn.net/kunkliu/article/details/129902597</link><guid>https://blog.csdn.net/kunkliu/article/details/129902597</guid><author>kunkliu</author><pubDate>Sat, 01 Apr 2023 20:50:16 +0800</pubDate><description><![CDATA[宋宝华，他有10几年的Linux开发经验。他长期在大型企业担任一线工程师和系统架构师，编写大量的Linux代码，并负责在gerrit上review其他同事的代码。Barry Song是Linux的活跃开发者，是某些内核版本的最活跃开发者之一（如https://lwn.net/Articles/395961/ 、]]></description><category></category></item><item><title><![CDATA[dma_alloc_coherent 申请内存用法和问题总结]]></title><link>https://blog.csdn.net/kunkliu/article/details/129901551</link><guid>https://blog.csdn.net/kunkliu/article/details/129901551</guid><author>kunkliu</author><pubDate>Sat, 01 Apr 2023 19:22:00 +0800</pubDate><description><![CDATA[检查内核打印，给cma分配的地址是否在4G以上，dma_allocat_coherent() 要求地址低于掩码[(0x1 << 32)-1] = 0xFFFFFFFF。4M这个限制是本身应该是分的普通内存的限制， 例如把配置加一个CONFIG_FORCE_MAX_ZONEORDER=16把最大限制改成128M也能解决。使用这个接口最大只能申请到4M的内存，申请超过4M时，报。在dts中添加cma节点，可指定cma大小和空间。，dma分配默认会走cma，空间会大点。可配置大小，也可指定地址。]]></description><category></category></item><item><title><![CDATA[makefile：make -C M=参数的使用]]></title><link>https://blog.csdn.net/kunkliu/article/details/129886043</link><guid>https://blog.csdn.net/kunkliu/article/details/129886043</guid><author>kunkliu</author><pubDate>Fri, 31 Mar 2023 18:11:25 +0800</pubDate><description><![CDATA[当从内核源码目录返回时，KERNELRELEASE已被被定义，kbuild也被启动去解析kbuild语法的语句，make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系，以及要生成的目标模块名。KERNELRELEASE 是在内核源码的顶层Makefile中定义的一个变量，在第一次读取执行此Makefile时，KERNELRELEASE没有被定义，所以make将读取执行else之后的内容。当make的目标为all时，-C。Makefile为，]]></description><category></category></item><item><title><![CDATA[virtio技术（3）virtqueue机制]]></title><link>https://blog.csdn.net/kunkliu/article/details/129782303</link><guid>https://blog.csdn.net/kunkliu/article/details/129782303</guid><author>kunkliu</author><pubDate>Sun, 26 Mar 2023 18:12:37 +0800</pubDate><description><![CDATA[virtio的关键技术是virtqueue机制，其提供了一套统一的用于virito前端和后端的通信机制。Descriptor Area：用于描述数据buffer；Driver Area：驱动需要传递给设备的额外数据；Device Area：设备需要传递给驱动的额外数据。最新的virtio协议版本定义有两种virtqueue格式：Split Virtqueue和Packed Virtqueue，下面针对这两种格式，我们分别进行描述。]]></description><category></category></item><item><title><![CDATA[virtio-net 实现机制]]></title><link>https://blog.csdn.net/kunkliu/article/details/129782266</link><guid>https://blog.csdn.net/kunkliu/article/details/129782266</guid><author>kunkliu</author><pubDate>Sun, 26 Mar 2023 18:06:31 +0800</pubDate><description><![CDATA[① virtio表示虚拟化IO，用于实现设备半虚拟化，即虚拟机中运行的操作系统需要加载特殊的驱动（e.g. virtio-net）且虚拟机知道自己是虚拟机相较于基于完全模拟的全虚拟化，基于virtio的半虚拟化可以提升设备访问性能② 运行在虚拟机中的部分称为前端驱动，负责对虚拟机提供统一的接口③ 运行在宿主机中的部分称为后端驱动，负责适配不同的物理硬件设备① 传统的网络收包流程完全靠中断驱动，当网络包到达十分频繁时，就会频繁触发中断，进而影响系统的整体性能。]]></description><category></category></item><item><title><![CDATA[virtio-net 实现机制【一】（图文并茂）]]></title><link>https://blog.csdn.net/kunkliu/article/details/129782218</link><guid>https://blog.csdn.net/kunkliu/article/details/129782218</guid><author>kunkliu</author><pubDate>Sun, 26 Mar 2023 18:03:17 +0800</pubDate><description><![CDATA[① virtio表示虚拟化IO，用于实现设备半虚拟化，即虚拟机中运行的操作系统需要加载特殊的驱动（e.g. virtio-net）且虚拟机知道自己是虚拟机相较于基于完全模拟的全虚拟化，基于virtio的半虚拟化可以提升设备访问性能② 运行在虚拟机中的部分称为前端驱动，负责对虚拟机提供统一的接口③ 运行在宿主机中的部分称为后端驱动，负责适配不同的物理硬件设备。]]></description><category></category></item><item><title><![CDATA[浅谈Linux设备虚拟化技术的演进之路]]></title><link>https://blog.csdn.net/kunkliu/article/details/129782056</link><guid>https://blog.csdn.net/kunkliu/article/details/129782056</guid><author>kunkliu</author><pubDate>Sun, 26 Mar 2023 17:47:21 +0800</pubDate><description><![CDATA[vDPA 的全称是 Virtio Data Path Acceleration，它表示一类设备：这类设备的数据面处理是严格遵循 Virtio 协议规范的，即驱动和设备会按照第三节提到的 Virtio 通信流程来进行通信，但控制路径，比如：通信流程里面提到的 ring buffer 和 deor table 的内存地址，驱动如何告知设备，设备支持的特性，驱动如何感知，这些都是厂商自定义的，不一定会遵循 Virtio 协议。在最早期阶段，设备虚拟化常常和机器模拟器技术，比如：QEMU，绑定在一起。]]></description><category></category></item><item><title><![CDATA[virtio 简介]]></title><link>https://blog.csdn.net/kunkliu/article/details/129780255</link><guid>https://blog.csdn.net/kunkliu/article/details/129780255</guid><author>kunkliu</author><pubDate>Sun, 26 Mar 2023 15:51:41 +0800</pubDate><description><![CDATA[virtio 是一种 I/O 半虚拟化解决方案，是一套通用 I/O 设备虚拟化的程序，是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象。提供了一套上层应用与各 Hypervisor 虚拟化设备（KVM，Xen，VMware等）之间的通信框架和编程接口，减少跨平台所带来的兼容性问题，大大提高驱动程序开发效率。在完全虚拟化的解决方案中，guest VM 要使用底层 host 资源，需要 Hypervisor 来截获所有的请求指令，然后模拟出这些指令的行为，这样势必会带来很多性能上的开销。]]></description><category></category></item><item><title><![CDATA[print_hex_dump用法]]></title><link>https://blog.csdn.net/kunkliu/article/details/129730053</link><guid>https://blog.csdn.net/kunkliu/article/details/129730053</guid><author>kunkliu</author><pubDate>Thu, 23 Mar 2023 14:23:14 +0800</pubDate><description><![CDATA[【代码】print_hex_dump用法。]]></description><category></category></item><item><title><![CDATA[Linux Kernel编程 --- Mailbox驱动框架]]></title><link>https://blog.csdn.net/kunkliu/article/details/129719036</link><guid>https://blog.csdn.net/kunkliu/article/details/129719036</guid><author>kunkliu</author><pubDate>Wed, 22 Mar 2023 21:04:46 +0800</pubDate><description><![CDATA[（1）driver 通过mbox_controller_register 注册controller；（2）client 通过mbox_request_channel调用driver->startup；（3）client 通过mbox_send_message调用driver->send_data，并等待txdone；（4）driver 收到remote的中断读取数据调用mbox_chan_received_data将数据放到 client->rx_buffer中；]]></description><category></category></item></channel></rss>