摘要: linux 内核的主体是以GNU的C语言编写的,GNU为此提供了编译工具gcc。GNU对C语言本身作了不少扩充。1) gcc 从 C++ 语言中吸收了“inline”和“const”。inline 函数的使用与#define 宏定义相似,但更有相对的独立性,也更安全,因为“inline”函数会进行参数的类型检查。使用inline 函数也有利于程序调试。如果编译时不加优化,则这些inline函数就是普通的、独立的函数,更便于调试。调试好了以后,再采用优化重新编辑一次,这些inline函数就像宏操作一样融入了引用处的代码中,有利于提高运行效率,由于inline函数的大量使用,相当一部分代码从.c文 阅读全文
posted @ 2013-10-18 10:59 linux_rookie 阅读(597) 评论(0) 推荐(0) 编辑
摘要: 可以看出,在页面目录中共有210= 1024个目录项,每个目录项指向一个页面表,而在每个页面表中又共有1024个页面描述项。由图看出来,从线性地址到物理地址的映射过程为:1)从CR3取得页面目录的基地址;2)以线性地址中的dir位段为下标,在目录中取得相应页面表的基地址;3)以线性地址中的page位段为下标,在所得到的的页面表中取得相应的页面描述项;4)将页面描述项中给出的页面基地址与线性地址中的offset位段相加得到物理地址;目录项结构为:目录项的直观表示如下图:页表项的结构基本上于此相同,但没有“页面大小”位ps,所以第8位保留不用,但第7位(在目录项中保留不用)则为D标志,表示该页面已 阅读全文
posted @ 2013-10-18 10:56 linux_rookie 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 当我们说一个CPU是“16位”或“32”位时,指的是处理器中“算数逻辑单元”(ALU)的宽度。数据总线通常与ALU具有相同的宽度。当Intel决定在16位CPU 8086中采用1M字节的内存空间,地址总线的宽度也就确定了,那就是20位。问题就来了:既然是ALU是16位,也就是说直接加以运算的指针长度是16位,即这个指针所能代表的地址最多有216,不能达到20位地址总线所能寻址的最大空间,于是Intel在8086 CPU中设置了4个“段寄存器”:CS、DS、SS和ES,分别用于可执行代码、数据、堆栈和其他。每个段寄存器都是16位的,对应于地址总线中的高16位。每条“访内”指令中的“内部地址”都是 阅读全文
posted @ 2013-10-18 10:53 linux_rookie 阅读(559) 评论(0) 推荐(0) 编辑
摘要: linux内核版本:linux-2.6.30.4目的:当按下K1,K2,K3,K4时,分别代表输入L、S、ENTER、LEFTSHIFT经过上一节知道,在我们写驱动的时候input核心层和handler层都不需要修改,要修改的只是input_device层。写一个符合input子系统驱动程序的步骤:1.分配一个input_device结构体;2.设置3.注册4.硬件相关代码,比如中断服务程序里上报事件 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #inc... 阅读全文
posted @ 2013-08-08 11:25 linux_rookie 阅读(1095) 评论(0) 推荐(0) 编辑
摘要: 输入子系统的核心代码在/driver/input/input.c,先看入口函数input_init(),在这里调用了register_chrdev(INPUT_MAJOR, "input", &input_fops);内核帮我们做了注册设备号的工作,发现在结构体input_fops里只定义了open函数,像read,write等函数都没有定义,进入这个open函数去看看有什么内容:input_open_file() struct input_handler *handler handler = input_table[iminor(inode) >> 5 阅读全文
posted @ 2013-08-08 11:24 linux_rookie 阅读(691) 评论(0) 推荐(0) 编辑