linux
a254373829
这个作者很懒,什么都没留下…
展开
-
vim中taglist插件的安装和使用
下载地址:http://www.vim.org/scripts/script.php?script_id=273 1>下载taglist_45.zip包,复制到~/.vim/目录下,解压后生成两个目录doc, plugin, doc/为插件的帮助文档。 2> 打开vim, 输入以下命令生成taglist的帮助标签 :helpt原创 2012-04-30 13:32:59 · 1026 阅读 · 0 评论 -
linux pm runtime
pm runtime核心只提供机制(功能), 什么的时候上电/掉电等策略应由driver去实现。 driver里实现的pm runtime的call back函数被runtime 核心封装了起来,会暴露一些API接口来间接的调用这么Call back函数。pm runtime利用了一个工作队列pm_wq来负责具体的电源事务,上电和下电有同步和异步之分:设备状态在PM runtime中的表示原创 2013-04-11 16:56:59 · 3419 阅读 · 0 评论 -
linux 编译模块时发生找不到符号的错误
在内核新添加了一个文件,EXPORT_SYMBOL出来一些函数接口,然后创建一个头文件来申明这些API。 然后在一个模块里调用这些API, 编译出错:ERROR:· func_name [module_name.ko] undefined!但是在其它编译进内核的文件里调用确没有问题。原来是忘记在新添加的代码文件里包含了一个头文件: #include . EXPORT_SYMBO原创 2013-03-18 16:30:24 · 2583 阅读 · 0 评论 -
构建一个编译时错误
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) , 如果e为非0的话,将会产生一个编译时错误, 因为一个位域不能为负数, 为0 的话OK。 原来一个结构体的定义也可以这样,木有结构名,其成员也木有名, 尼玛都是无名氏啊, 其实不管怎么奇怪,只要你丫编译器能认识就行了。 算是一种约定吧, 这个宏的名字取得反义。。。原创 2013-03-16 20:58:40 · 906 阅读 · 0 评论 -
伙伴系统算法中的伙伴
一个块的伙伴究竟是位于该块的前面还是后面,取决于oder的值:buddy_idx = page_idx ^ (1 如果page_idx的值大于1page_idx = 32, order = 2时, buddy_idx = 36 order = 3时, buddy_idx = 40原创 2013-02-27 11:31:23 · 891 阅读 · 0 评论 -
proc文件的读写函数
每一个文件都有相应的文件操作表,最主要的就是读操作和写操作了, proc文件的读写函数得注意其对应的返回值,如果在读函数内一直返回一个正数,则上层会认为该文件还有数据需要读取,会一直无限的读下去。。。在实现proc文件读操作时,应该更新传递进来的offset参数来表示文件指针,在调用copy_to_user之前,应该将*offset的值与文件对应的数据buffer的长度进行比较,如果大于buffe原创 2013-03-08 10:16:53 · 1951 阅读 · 0 评论 -
从用户空间传递到内核中字符串的长度
当通过proc文件系统向内核传递一个字符串时,例如"abcde", 其字符串的长度为6而不是5, 其中多了一个换行符:root@android:/ # echo "abcde" >/proc/slab_trace root@android:/ # dmesg>>[ 131.487923] slab_trace_write: slab_trace_name:abcde>[ 131.原创 2013-03-08 09:55:56 · 976 阅读 · 0 评论 -
linux 工作队列
书上写的工作队列的实现是创建一个单独的线程来执行相应的work. 但是最新的内核实现却不是这样的,原先的工作队列的接口都快要废弃了, New API:alloc_workqueue(name, flags, max_active)alloc_ordered_workqueue(const char *name, unsigned int flags){原创 2013-01-22 10:36:36 · 3904 阅读 · 0 评论 -
/proc/iomem
/proc/iomem这个文件记录的是物理地址的分配情况,内存只占用4G(32位CPU)物理地址的一部分,一般从地址0开始,每一行都代表一个资源(地址范围和资源名), 可用物理内存的资源名为“System RAM”,如01000000-35aeffff : System RAM这个是由e820表中的 E820_RAM类型的表项通过insert_resource这个API注册到iomem原创 2013-02-04 16:40:30 · 15003 阅读 · 0 评论 -
__initcall不能用于模块代码中
如题, 本来想在debugfs中生成一个文件的,发现用__initcall用在模块中不起作用,可考虑用模块参数代替,/sys/module/xxxx/parameters.原创 2013-02-01 09:01:06 · 743 阅读 · 0 评论 -
linux 启动参数指定HIGHMEM 区的大小
在命令行参数添加highmem=XX[KMG]可以指定高端内存的大小,如 highmem=10M, 则高端内存只有10M可用,就算你的内存有2G的大小,系统能用的内存也只有低端内存+10M的空间, 就1G还不到吧原创 2012-12-14 15:58:49 · 1424 阅读 · 0 评论 -
工作队列相关
创建一个工作队列后,内核会生成一个内核线程,当向该工作队列提交一个工作时,该工作不一定在对应的内核线程中执行,这是由于内核维护了一个线程池, 系统中所有工作队列中的工作都挂在Per cpu的全局变量中(struct global_cwq),然后每个工作者线程从中选取工作执行(不论该工作属于哪个工作队列)。 尼玛天天发邮件用英语,搞得现在都不想写中文文档了,你妹啊。其实英语还是那么菜。原创 2012-11-23 16:44:13 · 442 阅读 · 0 评论 -
linux device suspend/resume test
See Documentation/power/basic-pm-debuggingecho 0 > /proc/sys/kernel/printkecho devices > /sys/power/pm_test原创 2013-05-25 20:40:12 · 1174 阅读 · 0 评论 -
linux usleep_range(min, max)
这个延迟函数最少的延迟时间为50us, 就算min=max=1, 实际的效果应该不是延迟1us, 而是50us, 大牛们说的。。。原创 2013-05-25 20:23:49 · 10167 阅读 · 0 评论 -
linux cmdline参数解析
我们可以通过 cat /proc/cmdline来获取内核的命令行参数,但是每个参数是怎么在代码解析的, 以slub为例,在源码中有如下代码:__setup("slub_min_order=", setup_slub_min_order);__setup("slub_max_order=", setup_slub_max_order);__setup("slub_min_obj原创 2013-01-16 17:59:56 · 10935 阅读 · 0 评论 -
linux pfn, page, physical/virtual address
从页框号page结构体(定义在include/linux/mm_types.h文件里)pfn_to_page(pfn);page_to_pfn(page);页框号物理地址得到页框号:physical_addr >> PAGE_SHIFT #asm/page_types.h物理地址: pfn page结构体 虚拟地址page_address(page)如果是线性映射原创 2014-03-31 17:58:11 · 2857 阅读 · 0 评论 -
linux模块引用一个外部符号
当驱动被编译成一个模块时,引用外部符号(函数或者变量)时,这个外部符号得先通过EXPORT_SYMBOL给导出来才行,否则编译时会找不到该符号得定义。原创 2014-03-31 17:07:15 · 972 阅读 · 0 评论 -
访问硬件寄存器的位域值
一般在驱动程序中,经常需要读硬件寄存器的值,然后在检查其中某些字段的值,通常的做法是设置一些位掩码,然后与一下就可以了,今天看驱动代码,发现还有如下的方法,觉得还不错。union A { struct { u64 part1:2; u64 part2:2; u64 part3:60; } part;原创 2014-02-14 11:45:46 · 763 阅读 · 0 评论 -
迭代总线上的所有device/driver
drives/base/bus.cbus_for_each_dev;bus_for_each_drv;bus_find_device;获取设备名字:include/linux/device.hdev_name(struct device *dev);原创 2013-12-12 17:27:57 · 612 阅读 · 0 评论 -
linux container_of(ptr, type, member)
container_of宏的作用是根据指向一个结构体某个成员的指针得到这个结构体的基址。@include/linux/kernel.h#define container_of(ptr, type, member) ({ \const typeof( (type *)0->member) * __mptr = (ptr); \(type *)( (char *)__mptr原创 2013-09-06 10:21:34 · 1210 阅读 · 0 评论 -
linux 监控驱动suspend/resume的执行
当pm核心去调用驱动的suspend/resume的回调函数时,它会设置一个定时器来监视回调函数的执行,如果回调长时间没有执行完毕的话, 定时器函数会调用BUG()让系统挂掉重启,所以在写pm相关的回调函数时,要确保不能长时间阻塞,否则后果你是知道的, 可以看下dpm_wd_handler这个函数/* kernel/drivers/base/power/main.c **/static vo原创 2013-08-28 16:15:37 · 6986 阅读 · 0 评论 -
linux 软中断和tasklet
1. 软中断是什么 ? 软中断是一种延时机制,代码执行的优先级比进程要高,比硬中断要低。相比于硬件中断,软中段是在开中断的环境中执行的(长时间关中断对系统的), 代码也是执行在中断/线程上下文的,也是不能睡眠的,虽然每个cpu都有一个对应的ksoftirqd/n线程来执行软中断,但是do_softirq这个函数也还会在中断退出时调用到,因此不能睡眠(中断上下文不能睡眠的原因是由于调度系统是以进原创 2013-08-19 13:51:26 · 2179 阅读 · 0 评论 -
linux disable CPU c4/c6 state
echo 1 > /sys/devices/system/cpu/cpuX/cpuidle/state[3/4]/disable原创 2013-05-31 11:05:27 · 2121 阅读 · 0 评论 -
vim vimdiff
Shell: Ctrl + R (反向查找历史命令) vim:vim 从 vim7 开始加入了多标签切换的功能, 相当于多窗口. 之前的版本虽然也有多文件编辑功能, 但是总之不如这个方便啦。用法::tabnew [++opt选项] 〔+cmd〕 文件 建立对指定文件新的tab:tabc 关闭当前的tab:tabo转载 2012-03-14 17:01:10 · 2736 阅读 · 0 评论 -
linux del_timer_sync
Note: You must not hold locks that are held in interrupt context * while calling this function. Even if the lock has nothing to do * with the timer in question. Here's why: * * CPU0原创 2013-05-25 20:33:28 · 3025 阅读 · 0 评论 -
New device resource allocate function
The root cause is that irq is freed after XXXisp_pci_remove, as pci_disable_msifunction will check whether irq has been freed or not, if not, it'll call BUG_ONto trigger panic. so devres functions原创 2012-11-23 16:32:17 · 1365 阅读 · 0 评论 -
获取pt_regs结构的宏
arch/x86/include/asm/processor.hstruct pt_regs * task_pt_regs(struct task_struct *p);原创 2012-11-30 09:34:10 · 2674 阅读 · 0 评论 -
内核模块符号解析出错
如果内核的panic发生在动态加载的模块代码,如果模块在编译时变量INSTALL_MOD_STRIP = --strip-unneeded, 则panic后打印的函数调用链有可能没有函数符号解析出来,也可能解析出来的符号是错误的(通过cscope工具发现A函数根本没调用B函数,但call trace却显示A调用了B, 这是由于可能实际上是C函数调用了B,但C的符号在相应的.ko文件已经被去掉了,而原创 2012-11-07 17:57:14 · 1525 阅读 · 0 评论 -
进程 可执行文件
进程是系统中的一种抽象,是系统中竞争资源的基本单位,资源所涵盖的范围其实很广,软件是建立在硬件基础之上的,最终的行为还是会落实到硬件之上,在一个系统中的硬件部分中,熟悉每个硬件的功能以及每个硬件模块之间的通信有助于对整个软件系统的理解,毕竟软件是对硬件的一种抽象,抽象是在实体的基本之上构建的,如进程的内存地址空间和物理上的和CPU连接的地址总线所确定的物理地址,两者之间通过叫页表的数据结构来建立一原创 2012-05-18 18:04:06 · 672 阅读 · 0 评论 -
ps -aux中STAT列的标志位
$ps aux 输出结果中的STAT列的可能标志S 睡眠。通常是在等待某个事件的发生,如一个信号或有输入可用R 运行。 严格来说,应是“可运行”,即在运行队列中,处于正在执行或即将运行状态D 不可中断的睡眠(等待)。通常是在等待输入或输出完成T (terminate)停止。通常是被shell作业控制所停止,或者进程正处于调试器的控制之下Z原创 2012-06-06 12:43:22 · 8763 阅读 · 0 评论 -
shell 基础知识
变量定义: shell预定义变量是以符号$开头,如$0, $1...代表shell脚本本身,第一个参数... . $# 代表参数的个数,从$1开始计数, $? 代表前一个命令的返回值. $* / $@代表所有位置参数的内容。 $$ 代表当前进程的进程号 $0 当前执行的进程名 变量默认类型为“字符串”, eg: $sum=100原创 2012-05-21 13:08:38 · 337 阅读 · 0 评论 -
linux shell中数制转换
指定输入进制,输出进制和本转换的数,然后交给bc这个程序去过滤计算,如$echo "ibase=10; obase=2; 255" | bc #十六进制数中A-F必须为大写。11111111xx进制转制为十进制利用( (variable=xx#yy) ) #xx代表数的进制,yy为xx进制的数,如$ ( (var=16#10) )$echo $var16原创 2012-05-30 08:48:27 · 758 阅读 · 0 评论 -
基本的正则表达式字符
正则表达式是一种处理字符串的方法,它是以行为单位来进行字符串的处理行为,通过一些特殊符号的辅助,可以让用户达到查找,删除,替换某特定字符串的处理目的。正则表达式类似于一种规范,只要相应的工具程序遵循这种规范,那么该工具程序就可以利用正则表达式来处理字符串。(如vi, grep, find, sed etc) 常用的正则表达式特殊字符: ^word ;等查原创 2012-05-06 20:25:58 · 338 阅读 · 0 评论 -
linux kernel initcall函数
在一个内核函数的定义中添加一个__init属性,在编译后的内核映像中位于特殊的init section中,但并不能保证会在内核初始化的时候被调用,应该通过以下的宏来确保初始化函数会被调用。linux/init.h 相关宏定义: /* * A "pure" initcall has no dependencies on anything else,原创 2012-05-03 10:16:07 · 618 阅读 · 0 评论 -
ubuntu 访问samba
加协议前缀smb://原创 2012-04-30 19:15:27 · 726 阅读 · 0 评论 -
git常用命令图解
转载 2012-04-30 18:37:46 · 516 阅读 · 0 评论 -
linux mutex互斥体和semaphore信号量的区别
mutex互斥体只用于保护临界区的代码(访问共享资源),而不用于锁之间的同步,即一个线程释放mutex锁后,马上又可能获取同一个锁,而不管其它正在等待该mutex锁的其它线程。 semaphore信号量除了起到保护临界区的作用外,还用于锁同步的功能,即一个线程释放semaphore后,会保证正在等待该semaphore的线程优先执行,而不会马上在获取同一个sema原创 2012-04-24 18:03:29 · 1841 阅读 · 0 评论 -
linux mint fcitx 五笔拼音
安装fcitxsudo apt-get install fcitx安装五笔拼音字库sudo apt-get install fcitx-table-wbpy配置fcitx为默认输入法im-switch -s fcitx转载 2012-03-20 22:15:42 · 4460 阅读 · 0 评论 -
linux mint flasher plugin
cp libflashplayer.so /usr/lib/mozilla/plugins/转载 2012-03-17 11:01:02 · 561 阅读 · 0 评论 -
get_mm_rss(mm)
get_mm_rss函数用于获取一个进程当前所占用的物理内存的字节数。rss : resident set size, the non-swappend physical memory that a task has used in.原创 2012-06-08 16:19:50 · 2677 阅读 · 0 评论