上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 45 下一页

2011年6月6日

摘要: 本问分析基于Linux 0.11内核,转载请标明出处http://blog.csdn.net/yming0221/archive/2011/06/06/6528490.aspxcopy_mem(int nr, struct task_struct *p)函数是为进程设置段基址,限长,并复制页表。下面是其代码// 设置新任务的代码和数据段基址、限长并复制页表。// nr 为新任务号;p 是新任务数据结构的指针。int copy_mem (int nr, struct task_struct *p){ unsigned long old_data_base, new_data_base, dat. 阅读全文
posted @ 2011-06-06 22:03 yming0221 阅读(248) 评论(0) 推荐(0)

2011年6月5日

摘要: 本文分析基于Linux 0.11内核,转载请表明出处http://blog.csdn.net/yming0221/archive/2011/06/05/6527337.aspxLinux在move_to_user_mode()之后,进程0通过fork()产生子进程实际就是进程1(init进程)。其中fork()是通过内嵌汇编的形式给出#define _syscall0(type,name) /type name(void) /{ /long __res; /__asm__ volatile ( "int $0x80" / // 调用系统中断0x80。:"=a&qu 阅读全文
posted @ 2011-06-05 22:24 yming0221 阅读(183) 评论(0) 推荐(0)

2011年6月3日

摘要: 用C语言编写一个双向链表。如果你有一定的C语言编程经验,这自然是小菜一碟。有的读者可能连一个小程序都没有写过,那也不用害怕,可以参考任何一本《数据结构》和C语言的书籍。先弄明白基本概念,把书上的代码看明白,再把代码抄到电脑里,保证编译过去,调试它到正常运行。反复这个过程,直到你能独立完成它为止。写第一行代码是很痛苦的,我培训过好几个同事,他们不是计算机系毕业的,开始在电脑前坐一整天,一行代码都敲不出来,我最早写程序时的情况也好不了多少,不过没有关系,迈出这一步就好了。花1-3天时间,完成这个任务后,再继续往下阅读。当你读到这里的时候,相信你已经独立写出了一个双向链表。恭喜你!迈出这一步可是值得 阅读全文
posted @ 2011-06-03 12:55 yming0221 阅读(157) 评论(0) 推荐(0)

2011年6月1日

摘要: 本文分析基于Linux 0.11内核,转载请标明出处,http://blog.csdn.net/yming0221/archive/2011/06/01/6459119.aspx在main.c的程序中,当设备初始化完毕后,程序将从内核模式切换到用户模式,也就是所说的任务0,执行fork()函数(该函数使用内嵌的汇编,防止函数调用弄乱堆栈,造成写时复制COPY_ON_WRITE)切换到用户堆栈并执行任务0使用iret指令,首先将有关的值压入堆栈,然后执行iret指令。将刚刚压入对堆栈的数据根据标志位弹入相应的寄存器。//// 切换到用户模式运行。// 该函数利用iret 指令实现从内核模式切换到 阅读全文
posted @ 2011-06-01 13:46 yming0221 阅读(303) 评论(0) 推荐(0)

2011年5月30日

摘要: 更改了客户端IP后怎么都无法mount NFS,能ping 通,NFS,PORTMAP服务运行正常,找了好久,原来是在/etc/hosts.allow配置文件中的允许IP网段没有包含最后更改的客户端IP 网段 阅读全文
posted @ 2011-05-30 14:20 yming0221 阅读(242) 评论(0) 推荐(0)

2011年5月29日

摘要: 本文分析基于Linux 0.11内核,转载请标明出处http://blog.csdn.net/yming0221/archive/2011/06/01/6459119.aspx以下是硬件初始化函数void trap_init(void){ int i; set_trap_gate(0,÷_error); set_trap_gate(1,&debug); set_trap_gate(2,&nmi); set_system_gate(3,&int3); /* int3-5 can be called from all */ set_system_gate(4,&a 阅读全文
posted @ 2011-05-29 22:25 yming0221 阅读(388) 评论(0) 推荐(0)

2011年5月25日

摘要: 驱动代码#include <linux/module.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/fcntl.h>#define MY_DEVICE_NAME "mydevice"#define MY_DEVICE_MAJOR 240int device_open(st 阅读全文
posted @ 2011-05-25 14:35 yming0221 阅读(212) 评论(0) 推荐(0)

2011年5月24日

摘要: 1、static(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容char a = 'A'; // global variablevoid msg() { printf("Hello/n"); }下面是main.c的内容int main(void){ extern char a; // extern variable must be declared before use 阅读全文
posted @ 2011-05-24 13:47 yming0221 阅读(254) 评论(0) 推荐(0)

2011年5月23日

摘要: 第一次写Linux驱动,环境搭建了好久,第一次可能是由于GCC的版本问题,编译出来的驱动只能insmod,而无法rmmod然后是make时使用的内核版本和本系统的版本不一致,导致出现insmod: error inserting 'hello.o' :-l invalid module format错误最后成功驱动代码:#include <linux/module.h> #include <linux/init.h> MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void) 阅读全文
posted @ 2011-05-23 15:18 yming0221 阅读(264) 评论(0) 推荐(0)
摘要: 刚接触Linux设备驱动时,初学者往往连如何编译驱动程序都不懂,更别说编译进内核或加载测试了。一般都是在网上找个最简单的 helloworld驱动程序,然后严格按照网上所说的步骤编译,结果却得到一大堆见都没见过的错误,更不要说根据错误信息来解决问题了,很多人到这里就 不知道如何往下进行了。十几天前我也卡在这里很长时间,现在知道所以然了就记下来,些许对一些同道者有帮助。一个基本的Linux设备驱动开发环境由宿主机和目标机组成,宿主机就是用来做驱动开发工作的主机,目标机就是用来运行和测试设备驱动的主机,在宿 主机上需要有开发工具(gcc,gdb,make等)和linux源码(版本要对应目标机上的l 阅读全文
posted @ 2011-05-23 14:22 yming0221 阅读(140) 评论(0) 推荐(0)
上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 45 下一页

导航