linux
李子
天若有情天亦老
月若无恨月长圆
展开
-
相隔一定时间才printk一次信息
上次介绍了 dynamic debug 及 print_once 当有时候,你需要10S 内,某个打印语句只打印一次,你就可以使用下面的demo:int f(){ unsigned long later; later = jiffies + msecs_to_jiffies(1000*10); if (time_after(ji原创 2013-10-22 23:09:16 · 1202 阅读 · 0 评论 -
BUG_ON实现分析
传入的参数非法或为空,程序跑到了不可能的分支,你可以使用 BUG_ON(1) 直接让系统奔溃,并打印当前的文件名,行数,及调用函数栈问题暴露出来了,就好解决问题了,越早越好#ifndef BUG_ON#define BUG_ON(cond) assert(!(cond))#endifBUG_ON其实会调用assertkernel中一般很少直接使用assert,当然u原创 2013-10-22 22:34:44 · 3692 阅读 · 0 评论 -
linux 目录意思及用途
Directory NameUse to store this kind of files/binAll your essential program (executable files) which can be use by most of the user are store here. For e.g. vi, ls program are store here.翻译 2013-10-29 22:50:33 · 1388 阅读 · 0 评论 -
seqlock分析
当需要同步的数据比较简单,且是多读少写,且写优先的,情况下你可以使用 seqlockseqlock 的底层是用spin实现,所以自然继承了spin的特性如: 禁止抢占,sleep 等typedef struct { unsigned sequence; spinlock_t lock;} seqlock_t;序列号初始化为0,即偶数,代表没有上锁#def原创 2013-10-22 22:48:33 · 1361 阅读 · 0 评论 -
linux驱动中实现延时
其实有的时候最简单的方法,就是最实用最好的。没有用到timer,sleep,直接用循环:static bool nand_status_ready(u32 u4Status){ u32 timeout = 0xFFFF; while ((DRV_Reg32(NFI_STA_REG32) & u4Status) != 0) { time原创 2013-10-23 22:24:45 · 1840 阅读 · 0 评论 -
Linux 文件系统体系结构
翻译 2013-10-29 22:46:31 · 1452 阅读 · 0 评论 -
linux快速查询ascii编码
有的时候需要知道ascii对应的二进制不需要上网,也可以查询man ascii原创 2013-11-02 12:58:35 · 1540 阅读 · 0 评论 -
linux快速查询支持的信号
有的时候想给别的进程发送信号: kill -9 pid 但是你又不记得有什么信号或者信号的索引值,你可以输入命令: kill -l原创 2013-11-02 10:44:48 · 1074 阅读 · 0 评论 -
linux查看二进制文件
有的时候二进制文件不能用gedit等编辑器打开但是你可以在命令行在查看hexdump youfilehexdump -n 10 youfile (假如文件太长,你只想查看前面10个字节)原创 2013-11-02 13:47:07 · 2857 阅读 · 0 评论 -
得到kernel版本的几种方法
操作都是在kernel的顶层目录进行:1 首先查看帮助: make help | grep version 输出: kernelrelease - Output the release version string kernelversion - Output the version stored原创 2013-11-02 14:23:22 · 2354 阅读 · 0 评论 -
linux信号的默认处理方式
参考: kernel/include/linux/signal.h* +--------------------+------------------+ * | POSIX signal | default action | * +--------------------+------------------+ * | SIGHUP | t原创 2013-11-05 23:54:25 · 2668 阅读 · 0 评论 -
ARM架构函数调用时候变量存储规则
首先看个实例main.c 文件内容如下:int myAddadd(int a, int b ,int c ,int d ,int e, int f ,int g ){ int temp=0; int sum=10; sum=a+b+c+d; sum=sum+e+f; return sum;}int main(){原创 2013-11-05 23:47:32 · 1511 阅读 · 0 评论 -
linux kernel奔溃时候的检测点
原创 2013-11-05 23:57:24 · 1496 阅读 · 0 评论 -
linux md5sum 应用
首先看个最简单的例子:$ md5sum ./1/iAmCdRom.iso ./2/iAmCdRom.iso 773682e3494b6155855dd580bef8cb04 ./1/iAmCdRom.iso34d75a13d98b245c2a32a0bf816abb36 ./2/iAmCdRom.iso//更多详细的选项如下:$ md5sum --helpUsag原创 2013-11-08 20:57:11 · 1536 阅读 · 0 评论 -
tail命令实现截取掉文件开始的一部分字节
实现把文件开始的1024个字节截取(注意参数N / +N的区别):tail -c +1024 ./secro_dump.bin > cut_secro.im原创 2013-11-27 22:11:47 · 4528 阅读 · 0 评论 -
取得下个参数宏定义
#define skip(n) do { argc -= (n); argv += (n); } while (0)实际当中用的时候,只需要:skip(1); //就可以取得下个参数原创 2013-11-27 22:14:57 · 1190 阅读 · 0 评论 -
linux gcc 怎么只预处理,不编译链接等
由于一些特殊的目的,只需要预处理如: 检查某些宏定义,是否正确等 。gcc --help输出:-E Preprocess only; do not compile, assemble or link 仅仅预处理,不编译,汇编或链接 gcc -E ./main原创 2013-10-28 22:56:03 · 4186 阅读 · 0 评论 -
linux多线程在/proc目录的结构
linux的多线程,其实就是clone系统调用的实现的(共享文件等)首先看个具体的例子:#include #include #include #include #include #include #include void *print_message_function( void *ptr ); int main() {原创 2013-10-28 22:28:19 · 2668 阅读 · 0 评论 -
中断处理函数用spinlock注意点
参考:http://stackoverflow.com/questions/4752031/why-cant-you-sleep-while-holding-spinlockExample: your driver is executing and has just taken out a lock that controls access to its device. While the l原创 2013-10-27 12:16:42 · 4243 阅读 · 0 评论 -
gcc/g++中生成map文件
gcc/g++中生成map文件在通过gcc/g++间接调用链接程序ld时,所有的ld选项前必须加上“-Wl,”,因为-Map是ld的选项。所以,要让g++生成mapfile,需要增加编译参数“ -Wl,-Map,mapfile”。例:gcc -o hellowor原创 2011-08-05 16:52:53 · 7807 阅读 · 0 评论 -
linux怎么查函数头文件
直接man sleep看到的帮助是shell命令sleepman 3 sleep才是sleep函数。直接man sleep相当于man 1 sleep,1里面的都是命令man 2 xxx用于系统调用man 3 xxx 用于库函数如果某个库函数没有同名的转载 2011-08-23 16:10:31 · 2340 阅读 · 0 评论 -
kmalloc vmalloc 用法和区别
参考:http://stackoverflow.com/questions/116343/what-is-the-difference-between-vmalloc-and-kmallocvmalloc 很少用,因为kernel中很少用虚拟内存 (返回的是逻辑地址)kmalloc 的地址是连续的kmalloc is the preferred way, as long as you原创 2013-10-01 00:57:52 · 2597 阅读 · 0 评论 -
The rsync algorithm
ref : http://rsync.samba.org/tech_report/The problemImagine you have two files, A and B, and you wish to update B to be the same as A. The obvious method is to copy A ontoB. Now imagine th转载 2013-10-04 08:52:25 · 992 阅读 · 0 评论 -
rsync实时同步(搭配inotify-tools)
rsync可以实现文件的同步功能,但是如何实现两台服务器的文件实时同步呢?本文介绍使用rsync+inotify实现文件实时同步。Inotify 是文件系统事件监控机制,只要是内核版本在2.6.13以上的linux系统都可以用。inotify-tools下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-to转载 2013-10-04 08:29:31 · 3770 阅读 · 0 评论 -
printk只打印一次
今天无意中在kernel发现一个宏定义:#define printk_once(x...) ({ \ static bool __print_once; \ \ if (!__print_once) { \ __print_once = true; \ printk(x); \ } \}) 这样的话,有的原创 2013-10-08 22:13:29 · 2333 阅读 · 0 评论 -
hrtimer 高精定时器使用例子
在kernel,有个线程每个十秒往上层系统上报battery及USB的状态信息。 加入直接sleep 10 秒的话,插入USB的时候不能及时更新状态,这个时候就可以使用 hrtimer + wait queue 来实现了 void battery_kthread_hrtimer_init(void){ ktime_t ktime;原创 2013-10-16 23:02:12 · 3183 阅读 · 0 评论 -
kernel中遍历所有进程
看下具体的宏定义实现:#define for_each_process(p) \ for (p = &init_task ; (p = next_task(p)) != &init_task ; )在看下具体例子,打印所有进程的函数调用栈:static void wdt_report_info (void){ struct task_struct *task ;原创 2013-10-18 22:38:07 · 2811 阅读 · 1 评论 -
动态调用kernel任意函数(anycall)
有的时候只需要简单调用下别的kernel函数或者别的模块函数没有export,而你又不想单独编译kernel重新下载的时候或者动态去修改某个驱动的寄存器值。首先看下效果及使用步骤:加入kernel ,更多时候是驱动中有以下函数: ssize_t justfortest0(){ printk(KERN_ERR"[anycall] successful....just原创 2013-10-18 23:02:36 · 1898 阅读 · 0 评论 -
进程nice值曲线图
时间片由HZ驱动,所以时间片的最小值是1/HZ在O(1)调度器中,比2.4增强负的nice(2003修改),故意调整时间片的线性关系,使nice值为19的时间片精确地为1个jiffy.为了更好的理解,请看下面的曲线图: A \ | [timeslice length] \ |原创 2013-10-18 22:41:21 · 1282 阅读 · 0 评论 -
printk导致系统崩溃
具体实例如下: printk(KERN_ERR "random addess s is: %s\n",(char *)0X00000333); 输出为 : random addess s is: (null) printk(KERN_ERR "random addess s is: %s\n",(char *)0X000003333); 却会导致系统崩溃 通过分析pr原创 2013-10-18 23:21:30 · 4195 阅读 · 1 评论 -
printk,klogd,syslogd 关系
printk ------------> ________________________________ | /proc/kmsg | | [FI原创 2013-10-18 23:32:35 · 2042 阅读 · 1 评论 -
debugfs例子
static ssize_t anycall_write(struct file *file, const char __user *user_buf, size_t size, loff_t *ppos){ char buf[64]; int buf_size; int ret=0; buf_size = min(size, (sizeof(buf)原创 2013-10-19 11:00:52 · 1435 阅读 · 0 评论 -
proc fs 例子
static ssize_t write_sysrq_trigger(struct file *file, const char __user *buf, size_t count, loff_t *ppos){ if (count) { char c; if (get_user(c, buf)) return -EFAULT; __handl原创 2013-10-19 11:03:58 · 1119 阅读 · 0 评论 -
如何mount ext4 分区
mount -t ext4 target_path/your.img ./mount_dir 上面mount的时候有可能失败: 第一中,没有权限: sudo mount -t ext4 target_path/your.img ./mount_dir 第二中,由于你的your.img不是一个真正的分区后者设备:原创 2013-11-28 21:46:23 · 8839 阅读 · 0 评论