上一页 1 ··· 3 4 5 6 7 8 9 10 11 下一页
摘要: 或许习惯于用高级语言编程的大部分同学都会忽略了函数调用的具体过程是怎样的,如果想知道这个过程就不得不从汇编入手,但汇编语言又晦涩难懂。在这里谨以一个简单的例子说说我对函数调用过程的学习心得。 先上C语言写的代码: 1 #include<stdio.h> 2 3 4 unsigned int test(int a,int b) 5 { 6 int c,d; 7 c = a; 8 d = b; 9 return c;10 }11 12 int main()13 {14 unsigned int r;15 16 r = test(1,2);17 ... 阅读全文
posted @ 2012-06-03 20:27 lknlfy 阅读(2664) 评论(0) 推荐(0) 编辑
摘要: 作为多任务实现的一种机制,多线程应用得非常广泛,相对于多进程,多线程不仅运行效率高,而且还可以提高系统资源的使用效率。虽然网上关于多线程的讲解已经有一大堆,但出于学习的心态,有必要在这里做一下笔记。一、多线程编程常用函数1. int pthread_create(pthread_t * thread,const pthread_attr_t * attr,void * (*start_routine)(void *), void *arg);作用:创建一个新线程参数:thread:线程IDattr:线程属性(包括调度策略,调度参数,堆栈地址,堆栈大小等)。一般设置为NULL,即采用系统默... 阅读全文
posted @ 2012-06-02 19:29 lknlfy 阅读(960) 评论(0) 推荐(0) 编辑
摘要: 前阵子抱着打酱油的心态去面试了一下学校里某个俱乐部举行的一次执委面试,没想到被几个小问题给卡住了。面试完后下了一天苦工终于把那些问题搞定了,呵呵,看来没事多去面试一下还是有好处的,起码知道自己哪些地方存在不足。这里就说说其中一道关于C语言内存分配的问题。 看下面这个程序: 1 void allocmem(char **p) 2 { 3 char r[10]={1}; 4 *p = r; 5 } 6 7 8 int main() 9 {10 int i;11 char *m = NULL;12 13 allocmem(&m);14 if... 阅读全文
posted @ 2012-05-28 19:27 lknlfy 阅读(807) 评论(3) 推荐(0) 编辑
摘要: 在前三篇里学习了Linux平台设备和驱动的一些知识后,这篇就说一下驱动程序是怎么自动生成设备文件。 写过Linux驱动的可能都知道,Linux里有一类设备叫做混杂设备,而且还可以发现注册这一类设备后是不用手动去生成设备文件的。好吧,由这类设备的注册函数入手,从而去了解是怎样自动生成设备文件的。看看混杂设备注册函数在/drivers/char/misc.c里的定义: 1 int misc_register(struct miscdevice * misc) 2 { 3 struct miscdevice *c; 4 dev_t dev; 5 i... 阅读全文
posted @ 2012-05-16 19:28 lknlfy 阅读(1355) 评论(1) 推荐(0) 编辑
摘要: 注:基于Linux-2.6.38 上一篇说了平台设备是怎么注册进内核的,这一篇要说平台驱动(platform driver)的注册过程,看看当平台驱动注册进内核时是怎么与平台设备“联系”起来的。知道这些之后,以后想移植到新的内核或者添加其他平台设备(如SPI,IIC设备)或者编写平台设备驱动(如SPI,IIC驱动)就知道该怎么下手了。 这里以s3c处理器的framebuffer驱动为例进行说明(其他的平台驱动原理一样)。找到/drivers/video/samsung/s3cfb.c,首先看模块的初始化函数:1 int __devinit s3cfb_init(void)2 {3 ... 阅读全文
posted @ 2012-05-09 12:34 lknlfy 阅读(2627) 评论(3) 推荐(1) 编辑
摘要: 注:基于Linux-2.6.38 上一篇里介绍了Linux驱动里比较底层的内容,这里将以具体的平台(mini6410)来介绍平台设备(platform device,如IIC,UART,RTC)在初始化时是怎么注册进内核的。 还是/arch/arm/mach-s3c64xx/mach-mini6410.c这个文件,前面有篇文章已经说了里面的mini6410_machine_init()函数是什么时候被调用的,因此在这里不再重复,直接看这个函数里面的内容: 1 static void __init mini6410_machine_init(void) 2 { 3 u32 c... 阅读全文
posted @ 2012-05-08 16:26 lknlfy 阅读(1657) 评论(0) 推荐(0) 编辑
摘要: 注:基于linux-2.6.38 在linux源码的根目录下有一个叫drivers的目录,可以发现linux源码根目录下也就那么十来二十个目录,linux把drivers作为根目录下的一个独立的目录,足见drivers在linux里占有的分量有多重。 打开drivers目录一看,有一种晕呼呼的感觉,好几十个目录就这样“活生生”地摆在眼前,不知该如何下手。任何东西如果多了,但没有秩序去维持,肯定会变得很混乱,显然linux不会让这种情况出现。一般来说,里面的每一个目录可以说代表一类驱动,但linux整个driver的初始化操作在哪里?根据前人的探索和经验可知,没错,就在/drivers/base 阅读全文
posted @ 2012-05-07 20:19 lknlfy 阅读(3276) 评论(4) 推荐(2) 编辑
摘要: 注:下面的内容是以linux-2.6.38和mini6410为例进行学习的。 玩过或者移植过arm-linux的都应该知道在/arch/arm目录下有许多与具体处理器相关的目录,当然对于6410的话所对应的目录就是mach-s3c64xx,在里面找到与具体板子相关的文件mach-mini6410.c,没错,就是它。无论是出于想移植到新的内核还是出于想深入学习某一款arm等,对这个文件的学习是必不可少的。这个文件大部分内容是对平台设备(例如串口,LCD,Nand falsh等)的结构体初始化,在这个文件的最后有一个非常重要的宏:1 MACHINE_START(MINI6410, "MI 阅读全文
posted @ 2012-05-06 19:44 lknlfy 阅读(9267) 评论(0) 推荐(3) 编辑
摘要: 一.概述 首先, vim+cscope+ctags真的很强大,对于一个在Linux下玩了近2年的我来说,我在此感到十分惭愧。我之前极少使用vim,没接触过cscope和ctags,看程序也就用gedit和find。如今学习Linux内核时发现这3个工具非常有用,有了它们,我不用再在find之后的文件列表里苦苦找寻某个函数或者某个变量的定义,而是很轻松地找到想要的东西,最重要的是,对学习Linux内核的信心大增。在此仅以简单的形式记录(不完全,以后用到时再记录)这三个东东是怎么使用的,方便以后查询。二.笔记 在Linux内核源码根目录下执行两条命令:make cscope和make tags,. 阅读全文
posted @ 2012-05-06 15:44 lknlfy 阅读(3645) 评论(0) 推荐(0) 编辑
摘要: 一. 概述 内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,相反,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<---->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。 首先,驱动程序先分配好一段内存,接着用户进程通过库函数mmap()来告诉内核要将多大的内存映射到内核空间,内核经过一系列函数调用后调用对应的驱动程序的file_operation中的mmap函数,在该函数中调用remap_pfn_range()来建立映射关系。直白一点就是:驱动程序在mmap()中利用remap_p 阅读全文
posted @ 2012-04-27 16:45 lknlfy 阅读(12814) 评论(12) 推荐(1) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 11 下一页