<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[tmkeepgood的专栏]]></title><description><![CDATA[我的积累历程]]></description><link>https://blog.youkuaiyun.com/tmkeepgood</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; tmkeepgood]]></copyright><item><title><![CDATA[7z报错 "Can't allocate required memory"的解决方法]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/105638529</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/105638529</guid><author>tmkeepgood</author><pubDate>Mon, 20 Apr 2020 16:41:06 +0800</pubDate><description><![CDATA[错误：


7-Zip [32] 15.09 beta : Copyright (c) 1999-2015 Igor Pavlov : 2015-10-16
p7zip Version 15.09 beta (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,32 bits,32 CPUs Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70G...]]></description><category></category></item><item><title><![CDATA[int (*func(int)) (int *,int)]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/70169793</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/70169793</guid><author>tmkeepgood</author><pubDate>Fri, 14 Apr 2017 10:38:28 +0800</pubDate><description><![CDATA[转自：http://www.iteye.com/problems/24480


#include   
  
#define NULL 0  
#define ASGN 1  
#define MUL  2  
  
int asgn(int* a, int b) {  
    return *a = b;  
}  
  
int mul(int* a, int b) {]]></description><category></category></item><item><title><![CDATA[mutex与semaphore的区别]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/69951324</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/69951324</guid><author>tmkeepgood</author><pubDate>Mon, 10 Apr 2017 16:55:24 +0800</pubDate><description><![CDATA[mutex与semaphore的区别

摘自：http://blog.163.com/iam_zhangyong/blog/static/18234533820112147419797/


Mutex 的发音是 /mjuteks/ ，其含义为互斥(体)，这个词是Mutual Exclude的缩写。
Mutex在计算机中是互斥也就是排他持有的一种方式，和信号量-Semaphore有可以]]></description><category></category></item><item><title><![CDATA[创建系统时间命名的文件夹]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/46537263</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/46537263</guid><author>tmkeepgood</author><pubDate>Wed, 17 Jun 2015 19:27:34 +0800</pubDate><description><![CDATA[@echo off
set my_date=%date:~0,4%%date:~5,2%%date:~8,2%
set my_time=%time:~0,2%%time:~3,2%%time:~6,2%
set dir_name=%my_date%%my_time%
mkdir %dir_name%
根据各个系统的时间/日期格式不同，需要做稍许调整]]></description><category></category></item><item><title><![CDATA[tasklet、wait_queue、completion、work_queue用法总结]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/40895619</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/40895619</guid><author>tmkeepgood</author><pubDate>Fri, 07 Nov 2014 17:21:29 +0800</pubDate><description><![CDATA[对于内核中常用的中断处理机制tasklet/work_queue/wait_queue/completion做一些总结，方便在合适的时候采用合适的机制。]]></description><category></category></item><item><title><![CDATA[利用mmc_test.c研究mmc模块]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/39322257</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/39322257</guid><author>tmkeepgood</author><pubDate>Tue, 16 Sep 2014 20:12:20 +0800</pubDate><description><![CDATA[mmc初始化流程研究及mmc_test.c的使用
不清楚mmc_test.c的作者希望大家如何利用该模块，通过向该模块的probe函数传入一个合法的mmc_card指针，便可完成对该模块的使用。]]></description><category></category></item><item><title><![CDATA[linux 添加系统调用的方法（arm架构）]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/38621029</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/38621029</guid><author>tmkeepgood</author><pubDate>Sat, 16 Aug 2014 22:54:10 +0800</pubDate><description><![CDATA[在linux中，系统调用是非常重要的一个机制。本文首先探讨了系统调用需要哪些文件的支持，之后讨论如何增加自己的系统调用。]]></description><category></category></item><item><title><![CDATA[linux中通过等待队列来实现阻塞]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/38620651</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/38620651</guid><author>tmkeepgood</author><pubDate>Sat, 16 Aug 2014 22:27:36 +0800</pubDate><description><![CDATA[linux中，可以用wait_queue来实现阻塞。]]></description><category></category></item><item><title><![CDATA[内核通知链机制的原理及实现]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/19817589</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/19817589</guid><author>tmkeepgood</author><pubDate>Mon, 24 Feb 2014 13:10:12 +0800</pubDate><description><![CDATA[转自：http://blog.sina.com.cn/s/blog_6683e49d0100tovr.html
一、概念：
    大多数内核子系统都是相互独立的，因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求，也即是让某个子系统在发生某个事件时通知其它的子系统，Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用，而不能够在内核与用户空间之间进行事件的通知]]></description><category></category></item><item><title><![CDATA[Linux中的工作队列]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/19817459</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/19817459</guid><author>tmkeepgood</author><pubDate>Mon, 24 Feb 2014 13:06:04 +0800</pubDate><description><![CDATA[转自 http://tanatseng.blog.163.com/blog/static/174991629201132734828701/

工作队列一般用来做滞后的工作，比如在中断里面要做很多事，但是比较耗时，这时就可以把耗时的工作放到工作队列。说白了就是系统延时调度的一个自定义函数。
 
工作队列是实现延迟的新机制，从 2.5 版本 Linux
内核开始提供该功能。不同于微线程一步]]></description><category></category></item><item><title><![CDATA[u-boot 到 kernel 传递参数的流程]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/18675665</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/18675665</guid><author>tmkeepgood</author><pubDate>Wed, 22 Jan 2014 22:01:43 +0800</pubDate><description><![CDATA[u-boot部分：
normal_mode -> vlx_nand_boot -> vlx_entry 
8f860134 :
8f860134:       e92d4008        push    {r3, lr}
8f860138:       eb000869        bl      8f8622e4 
8f86013c:       e30017de        ]]></description><category></category></item><item><title><![CDATA[解密module_init]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/18005975</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/18005975</guid><author>tmkeepgood</author><pubDate>Wed, 08 Jan 2014 17:34:26 +0800</pubDate><description><![CDATA[在Linux底下写过driver模块的对这个宏一定不会陌生。module_init宏在MODULE宏有没有定义的情况下展开的内容是不同的，如果这个宏没有定义，基本上表明阁下的模块是要编译进内核的(obj-y)。
1.在MODULE没有定义这种情况下，module_init定义如下：
#define module_init(x) __initcall(x);
因为
#define __ini]]></description><category></category></item><item><title><![CDATA[让vim显示空格,及tab字符 vim 多行注释]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/17592545</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/17592545</guid><author>tmkeepgood</author><pubDate>Thu, 26 Dec 2013 21:27:27 +0800</pubDate><description><![CDATA[1、显示 TAB 键




文件中有 TAB 键的时候，你是看不见的。要把它显示出来：
:set list
现在 TAB 键显示为 ^I，而 $显示在每行的结尾，以便你能找到可能会被你忽略的空白字符在哪里。 
这样做的一个缺点是在有很多 TAB 的时候看起来很丑。如果你使用一个有颜色的终端，或者使用 GUI 模式，Vim 可以用高亮显示空格和TAB。 
使用 ‘listchar]]></description><category></category></item><item><title><![CDATA[工作队列的使用]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/17348893</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/17348893</guid><author>tmkeepgood</author><pubDate>Mon, 16 Dec 2013 11:03:42 +0800</pubDate><description><![CDATA[由于在中断中不能进行阻塞型操作，而有时候确实需要在中断时读取某些内存单元的值，此时可以考虑利用工作队列来实现。
 
struct work_struct xxx_wq;//定义工作队列
......
INIT_WORK(&xxx_wq,read_data);//初始化工作队列，在工作队列中需要执行的是函数read_data
......
schedule_work(&read_busm]]></description><category></category></item><item><title><![CDATA[通过mmap将连续物理地址映射到用户空间]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/17307513</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/17307513</guid><author>tmkeepgood</author><pubDate>Fri, 13 Dec 2013 20:40:54 +0800</pubDate><description><![CDATA[由于MMU对用户空间的内存采用页式管理，用户空间的内存都是虚拟的，只有当真正写入物理内存时，系统才会判断是否为该虚拟内存分配物理内存，如果未分配就会触发缺页中断，然后分配一整页的内存给应用程序。所以用户空间的内存表面上连续，但是实际的物理内存不一定连续。
 
        由于种种原因，我们有时候会需要用户空间的虚拟内存在物理上面也连续。按照MMU的管理方式，虚拟内存最多只能有一页——409]]></description><category></category></item><item><title><![CDATA[strtol的用法]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/17111433</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/17111433</guid><author>tmkeepgood</author><pubDate>Wed, 04 Dec 2013 08:26:41 +0800</pubDate><description><![CDATA[该函数可用于将ASCII码转换为各种进制的数。
 
unsigned long value = strtol("0x12345678",NULL,16);
第一个参数用于设定待转换的字符串(会自动识别0x)，第二个参数和起始位置有关，第三个参数用于设定需要的进制。
结果：
12345678]]></description><category></category></item><item><title><![CDATA[ffs的另外一种实现方法]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/17095011</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/17095011</guid><author>tmkeepgood</author><pubDate>Tue, 03 Dec 2013 14:12:30 +0800</pubDate><description><![CDATA[kernel中有个宏ffs，是用于从一个数中找出第一个为1的位(由低到高)，为了提高效率，用了汇编指令实现。在其它应用中，由于不需要考虑效率问题，可以采用其他方式实现：]]></description><category></category></item><item><title><![CDATA[Linux内核中ioremap映射的透彻理解]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/17004863</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/17004863</guid><author>tmkeepgood</author><pubDate>Thu, 28 Nov 2013 13:22:01 +0800</pubDate><description><![CDATA[几乎每一种外设都是通过读写设备上的寄存器来进行的，通常包括控制寄存器、状态寄存器和数据寄存器三大类，外设的寄存器通常被连续地编址。根据CPU体系结构的不同，CPU对IO端口的编址方式有两种：
　　（1）I/O映射方式（I/O-mapped）
　　典型地，如X86处理器为外设专门实现了一个单独的地址空间，称为"I/O地址空间"或者"I/O端口空间"，CPU通过专门的I/O指令（如X86的IN和O]]></description><category></category></item><item><title><![CDATA[axi总线介绍]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/16966695</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/16966695</guid><author>tmkeepgood</author><pubDate>Tue, 26 Nov 2013 16:17:50 +0800</pubDate><description><![CDATA[AXI（Advanced eXtensible Interface）是一种总协议，该协议是ARM公司提出的AMBA（Advanced Microcontroller Bus Architecture）3.0协议中最重要的部分，是一种面向高性能、高带宽、低延迟的片内总线。它的地址/控制和数据相位是分离的，支持不对齐的数据传输，同时在突发传输中，只需要首地址，同时分离的读写数据通道、并支持显著传输访问]]></description><category></category></item><item><title><![CDATA[使用__builtin_return_address获得程序运行栈情况]]></title><link>https://blog.youkuaiyun.com/tmkeepgood/article/details/16965947</link><guid>https://blog.youkuaiyun.com/tmkeepgood/article/details/16965947</guid><author>tmkeepgood</author><pubDate>Tue, 26 Nov 2013 15:42:36 +0800</pubDate><description><![CDATA[项目中遇到了一个多线程的问题，系统总是莫名其妙的崩溃，而且bug不可重现，后来发现是接收到某些信号的问题，于是乎就加入了信号处理函数，想获得是什么地方触发了这个信号，因为感觉多线程调试比较麻烦，于是就想到了使用利用__builtin_return_address来获得函数运行栈的方法。

直接上测试代码：



 
#include 
#include 
#include 
]]></description><category></category></item></channel></rss>