1@@Linux input 子系统分析(全)

1@@Linux input 子系统分析(全)
1@@Linux input 子系统分析(全)

Linux input子系统分析概述与数据结构

input_handler通过全局的input_handler_list链接在一起。事件处理器注册的时候实现这个操作(事件处理器一般内核自带,一般不需要我们来写)

input_hande没有一个全局的链表,它注册的时候将自己分别挂在了input_dev和input_handler的h_list上了。通过input_dev和input_handler就可以找到input_handle在设备注册和事件处理器,注册的时候都要进行配对工作,配对后就会实现链接。通过input_handle也可以找到input_dev和input_handler。

Linux input子系统分析

主要函数

95//如果比较成功进入下面的宏,否则进入下一个id

96MATCH_BIT(evbit,EV_MAX);

97......

98MATCH_BIT(swbit,SW_MAX);

99

100

101return id;

102}

103}

此函数主要是比较input_dev中的id和handler支持的id,这个存放在handler的id_table中。首先看id->driver_info有没有设置,如果设置了说明它匹配所有的id,evdev 就是这个样的handler

然后依据id->flag来比较内容,如果都比较成功进入MATCH_BIT,这个宏是用来按位进行比较的,功能是比较所支持事件的类型,只有所有的位都匹配才成功返回,否则进行下一个id的比较。

104#define MATCH_BIT(bit,max)\

105for(i=0;i

106if((id->bit[i]&dev->bit[i])!=id->bit[i])\

107break;\

108if(i!=BITS_TO_LONGS(max))\

109continue;

这个宏对于每种事件类型,以及每种事件类型支持的编码所有的位都比较一次,看handler的id是否支持,如果有一个不支持就不会比较成功,进入下一个id进行比较。

对于connect函数,每种事件处理器的实现都有差异,但原理都相同,因为触摸屏用的事件处理器为evdev,下面分析evdev的connect函数evdev_connect

110static int evdev_connect(struct input_handler*handler,struct input_dev*dev, 111const struct input_device_id*id)

112{

113//此函数传入三个参数,分别是:handler,dev,id

114struct evdev*evdev;

115int minor;

116int error;

117

118

119for(minor=0;minor

120if(!evdev_table[minor])

121break;

122//EVDEV_MINORS为32,说明evdev这个handler可以同时有32个输入设备和他配对,evdev_table中以minor(非次设备号,但是有一个换算关系)存放evdev 结构体,后面要详细分析这个结构体

123if(minor==EVDEV_MINORS){

124printk(KERN_ERR"evdev:no more free evdev devices\n");

125return-ENFILE;

126}

127//这个说明32个位置全都被占用了,连接失败

128evdev=kzalloc(sizeof(struct evdev),GFP_KERNEL);

129//分配一个evdev结构体,这个结构体是evdev事件处理器特有的,后面会详细分析

130if(!evdev)

131return-ENOMEM;

132

133

134INIT_LIST_HEAD(&evdev->client_list);

135spin_lock_init(&evdev->client_lock);

136mutex_init(&evdev->mutex);

137init_waitqueue_head(&evdev->wait);

138//初始化结构体的一些成员

139dev_set_name(&evdev->dev,"event%d",minor);

140//这个是设置evdev中device的名字,他将出现在/class/input中。

141//前面也有一个device是input_dev的,名字是input(n),注意与他的不同

142//这个结构是配对后的虚拟设备结构,没有对应的硬件,但是通过它可以找到相关的硬件

143evdev->exist=1;

144evdev->minor=minor;

145

146

147evdev->handle.dev=input_get_device(dev);

148evdev->https://www.360docs.net/doc/a27112973.html,=dev_name(&evdev->dev);

149evdev->handle.handler=handler;

150evdev->handle.private=evdev;

151//因为evdev中包含handle了,所以初始化它就可以了,这样就连接了input_handler与input_dev

152evdev->dev.devt=MKDEV(INPUT_MAJOR,EVDEV_MINOR_BASE+minor); //注意:这个minor不是真正的次设备号,还要加上EVDEV_MINOR_BASE

153evdev->dev.class=&input_class;

154evdev->dev.parent=&dev->dev;

155//配对生成的device,父设备是与他相关连的input_dev

156evdev->dev.release=evdev_free;

157device_initialize(&evdev->dev);

158

159

160error=input_register_handle(&evdev->handle);

161//注册handle结构体,这个函数后面详细分析

162if(error)

163goto err_free_evdev;

例,EVDEV_MINOR_BASE=64,可以看出系统总共可以注册8个handler

240list_add_tail(&handler->node,&input_handler_list);

241//连接到input_handler_list链表中

242list_for_each_entry(dev,&input_dev_list,node)

243input_attach_handler(dev,handler);

244//又是配对,不过这次遍历input_dev,和注册input_dev过程一样的245input_wakeup_procfs_readers();

246

247

248out:

249mutex_unlock(&input_mutex);

250return retval;

251}

这个函数其实和input_register_device大同小异,都是注册,都要配对。

Linux input子系统分析

输入子系统核心分析

Linux input子系统分析

事件处理层分析

二.事件处理层分析(以evdev事件处理器为例)

1.事件处理层与用户程序和输入子系统核心打交道,是他们两层的桥梁。一般内核有好几个事件处理器,像evdev mousedev jotdev。evdev事件处理器可以处理所有的事件,触摸屏驱动就是用的这个,所以下面分析这个事件处理器的实现。它也是作为模块注册到内核

63//这个函数所做的就是把client连接到evdev的client链表中

64error=evdev_open_device(evdev);

65//这个函数打开设备,有很多层调用,后面详细分析

66if(error)

67goto err_free_client;

68

69

70file->private_data=client;

71return0;

72

73

74err_free_client:

75evdev_detach_client(evdev,client);

76kfree(client);

77err_put_evdev:

78put_device(&evdev->dev);

79return error;

80}

(2)evdev设备打开函数evdev_open_device,由evdev_open调用。

81static int evdev_open_device(struct evdev*evdev)

82{

83int retval;

84

85

86retval=mutex_lock_interruptible(&evdev->mutex);

87if(retval)

88return retval;

89

90

91if(!evdev->exist)

92retval=-ENODEV;

93//判断设备结构是否存在,在evdev_connect中初始话此成员为1

94else if(!evdev->open++){

95retval=input_open_device(&evdev->handle);

96if(retval)

97evdev->open--;

98}

99//evdev->open分配结构的时候没有初始化,默认为0,也就是没有打开,每次打开都会加1

100mutex_unlock(&evdev->mutex);

101return retval;

102}

此函数在判断结构存在与否后,主要调用了input_open_device,这个函数是子系统核

心函数,定义在input.c中,下面分析这个函数:

103int input_open_device(struct input_handle*handle)

104{

105struct input_dev*dev=handle->dev;

106int retval;

107

108

109retval=mutex_lock_interruptible(&dev->mutex);

110if(retval)

111return retval;

112

113

114if(dev->going_away){

115retval=-ENODEV;

116goto out;

117}

118

119

120handle->open++;

121//将handle的打开计数加1,注意和evdev的open的区别

122if(!dev->users++&&dev->open)

123retval=dev->open(dev);

124//如果此input_dev没有进程在引用,并且定义了open方法,就调用open 方法

125if(retval){//retval=1说明没有打开成功

126dev->users--;

127if(!--handle->open){//说明有其他的进程已经打开了这个handle

128/*

129*Make sure we are not delivering any more events

130*through this handle

131*/

132synchronize_rcu();

133}

134}

135

136

137out:

138mutex_unlock(&dev->mutex);

139return retval;

140}

(3)读操作函数evdev_read

141static ssize_t evdev_read(struct file*file,char__user*buffer,

142size_t count,loff_t*ppos)

143{

144struct evdev_client*client=file->private_data;//这个客户端结构在打开的时候分配并保存在file->private_data中

145struct evdev*evdev=client->evdev;

146struct input_event event;

147int retval;

148

149

150if(count

151return-EINVAL;

152//这条语句提示,用户进程每次读取设备的字节数,不要少于input_event 结构的大小

153if(client->head==client->tail&&evdev->exist&&

154(file->f_flags&O_NONBLOCK))

155return-EAGAIN;

156//head等于tail说明目前还没有事件传回来,如果设置了非阻塞操作,则会立刻返回

157retval=wait_event_interruptible(evdev->wait,

158client->head!=client->tail||!evdev->exist);

159//没有事件就会睡在evdev的等待队列上了,等待条件是有事件到来或者设备不存在了(设备关闭的时候,清这个标志)

160if(retval)

161return retval;

162//如果能执行上面这条语句说明有事件传来或者,设备被关闭了,或者内核发过来终止信号

163if(!evdev->exist)

164return-ENODEV;

165

166

167while(retval+input_event_size()<=count&&

168evdev_fetch_next_event(client,&event)){

169//evdev_fetch_next_event这个函数遍历client里面的input_event buffer 数组

170if(input_event_to_user(buffer+retval,&event))

171//将事件复制到用户空间

172return-EFAULT;

173

174

175retval+=input_event_size();

176}

177

178return retval;//返回复制的数据字节数

179}

Linux input子系统分析事件传递过程

经打开,说明有进程读取设备关联的evdev。

66list_for_each_entry_rcu(handle,&dev->h_list,d_node)

67if(handle->open)

68handle->handler->event(handle,

69type,code,value);

70//调用相关的事件处理器的event函数,进行事件的处理

71rcu_read_unlock();

72}

下面分析evdev事件处理器的event函数

73static void evdev_event(struct input_handle*handle,

74unsigned int type,unsigned int code,int value)

75{

76struct evdev*evdev=handle->private;

77struct evdev_client*client;

78struct input_event event;

79

80

81do_gettimeofday(&event.time);

82event.type=type;

83event.code=code;

84event.value=value;

85//将传过来的事件,赋值给input_event结构

86rcu_read_lock();

87

88

89client=rcu_dereference(evdev->grab);

90//如果evdev绑定了client那么,处理这个客户端,触摸屏驱动没有绑定91if(client)

92evdev_pass_event(client,&event);

93else

94//遍历client链表,调用evdev_pass_event函数

95list_for_each_entry_rcu(client,&evdev->client_list,node)

96evdev_pass_event(client,&event);

97

98

99rcu_read_unlock();

100

101

102wake_up_interruptible(&evdev->wait);//唤醒等待的进程

103}

下面分析evdev_pass_event函数

104static void evdev_pass_event(struct evdev_client*client,

linux系统故障与分析

由于管理员忘记密码,或者由于系统受到黑客的入侵,系统密码文件被修改。导致管理员可能无法用帐号登录系统。 解决方法: 方法一,在系统启动时,进入单用户模式(linux single),然后用passwd命令重新设置密码,或修改密码文件即可恢复正常。 方法二,用急救启动盘组启动系统,然后将硬盘的文件系统安装到/mnt目录下,编辑/mnt/etc/passwd文件进行恢复。 方法三、将安装系统的硬盘拆下来,放在另一个Linux系统中,然后(mount)挂载此硬盘的系统安装区,将次硬盘分区中的/etc/passwd, /etc/shadow,/etc/group文件覆盖或修改,也可以恢复。 案例二:硬盘扇区错乱 在启动过程中最容易遇到的问题就是硬盘可能有坏道或扇区错乱(数据损坏)的情况,这种情况多由于异常断电、不正常关机导致。此种问题发生,在系统启动的时候,屏幕会显示: Press root password or ctrl+D:此时输入root密码系统自动进入单用户模式,输入“fsck -y /dev/hda6”(fsck为文件系统检测修复命令,“-y”设定检测到错误自动修复,/dev/hda6为发生错误的硬盘分区,请依据具体情况更改此参数),系统修复完成后,用命令“reboot”重新启动即可。 案例三、GRUB选项设置错误 “Error 15”显示系统无法找到grub.conf中指定的内核。 GRUB引导错误信息,我们观察发现因为打字错误,内核文件的“vmlinuz”打成了“vmlinux”,所以系统无法找到内核的可执行文件。我们可以按任意键回到GRUB编辑界面,修改此错误,回车保存后按“b”键即可正常引导,当然不要忘记进入系统后修改grub.conf文件中此处错误。这是很多初学Linux的用户在修改GRUB设置时很容易犯的错误,出现此黑屏提示时注意观察报错信息,即可针对性修复。 (二)GRUB引导故障排除 我发现有时Linux启动后会直接进入GRUB命令行界面(只有“grub>”提示符),此时很多用户就选择了重新安装GRUB甚至重新安装系统。其实一般而言此故障的原因最常见的有两个:一是GRUB配置文件中选项设置错误;二是GRUB配置文件丢失(还有少数原因,如内核文件或镜像文件损坏、丢失,/boot目录误删除等),如果是第一种情况,可以首先通过GRUB命令引导系统后修复;若是第二种情况,则要使用Linux救援模式修复了(本文后续有描述)。

操作系统

计算机科学与技术系 实验报告 专业名称计算机科学与技术 课程名称计算机操作系统 项目名称模拟实现单道路I/O系统设备分配程序 班级 13计科2班 学号 1304012046 姓名李孟霞 同组人员无 实验日期 2015.11.30

模拟实现单道路I/O系统设备分配程序 一、实验目的 熟练掌握单通路I/O系统中的设备分配方法。 二、实验内容 本实验要求实现模拟单通路I/O系统中的设备分配程序,有如下要求: 1、设计系统设备表SDT、设备控制表DCT、控制器表COCT、通道表CHCT 和逻辑设备表LUT。 2、提供给用户各表目的初态。 3、回答信息: 能够分配时,给出设备号、控制器号、通道号, 否则,给出无法分配的回答,插入相应的等待队列。 三、实验环境 Windows系统,C语言 四、实验步骤 1、任务分析 为单通路I/O系统设计系统设备表SDT、设备控制表DCT、控制器表COCT、通道表CHCT和逻辑设备表LUT五张表。用户可以查看各表目的内容,另外,程序为用户进程分配设备,并且输出分配结果,如果能够分配,则给出设备号、控制器号、通道号,否则,给出无法分配的回答,插入相应的等待队列。 2、概要设计 为实现本次实验任务要求,首先,定义SDT、DCT、COCT、CHCT、LUT 五张表,调用input()函数初始化各表内容;其次,调用print()函数,实现对上述四张表的输出显示;最后,调用add_process()函数,为用户进程申请设备,如果分配成功,给出设备号、控制器号、通道号,否则,给出无法分配的原因,并将该进程插入相应的等待队列中。 本程序包含如下3个模块: (1)主模块,由函数main()组成。

uml期末深刻复习

第一章 1、UML(Unified Modeling Langeage)是一种可视化的建模语言,提供了一种标准的、易于理解的方式描述系统的实现过程,从而实现了用户与设计者之间的有效交流。 2、定义系统的物理元素,用于描述事物的静态特征,包括类、接口、协作、用例、主动类、组件和节点。 3、行为建模元素包括哪些? 反映事物之间的交互过程和状态变化,包括交互图和状态图。 4、组织建模元素包括哪些? 子系统、模型、包、框架等。 5、关系元素包括哪些? 关联、泛化、组成、实现、聚集、依赖、约束 6、对于UML的描述,错误的是(A、C)。 A:UML是一种面向对象的设计工具。 B:UML不是一种程序设计语言,而是一种建模语言。 C:UML不是一种建模语言规格说明,而是一种表示的标准。 D:UML不是过程,也不是方法,但允许任何过程和方法使用它。 7、从系统外部用户角度看,用于描述系统功能集合的UML图是用例视图。 8、对如下的用例图的功能进行简单描述。 Buy Goods 8、在UML中,描述父类与子类之间关系的是泛化关系。 9、“交通工具”类与“汽车”类之间的关系属于(D)。 A:关联关系 B:聚集关系

C:依赖关系 D:泛化关系 第二章 1、从软件工程的角度,软件开发可分为:需求分析、系统分析、设计、实现、测试5个阶段。 2、用UML进行建模时会涉及9种图,Rose 2003只支持其中的8种,还有一种图只能用别的图来代替。这个不能在Rose中直接表示的图是(C)。 A:顺序图 B:用例图 C:对象图 D:构件图 3、应用题:Rose分别用哪些图描述系统的静态和动态方面? 静态:用例图、类图、构件图、部署图; 动态:状态图、协作图、顺序图、活动图。 4、默认情况下,Rose模型文件的扩展名为(A)。 A:.mdl B:.ptl C:.cat D:.sub 5、关于浏览窗口的描述,正确的是(A、B、C、D)。 A:可视化地显示模型中所有元素的层次结构 B:具有托放功能,通过模型元素的托放操作可以方便地改变一个模型的特征 C:在浏览器中的模型元素发生变化时,可以自动更新模型中的相关元素 D:只有在浏览窗口中才能把模型元素从模型中永久删除 6、Rose是什么的缩写?

Linux操作系统实验指导书

《Linux系统管理与维护》实验指导书 实验一初识Linux操作系统 一实验名称 初识Linux操作系统 二实验目的与要求 掌握Linux的启动、登录与注销。 三实验内容 1.以root用户和普通用户两种不同身份登录Linux,说出其登录后得差异。 2.图形模式下的注销、重启与关机。 3.学会在虚拟机上登录和注销Linux。 四操作步骤与结果分析 五问题与建议

实验二Linux的桌面应用 一实验名称 Linux的桌面应用 二实验目的与要求 熟悉Linux操作系统桌面环境 熟悉Linux文件系统及常用的操作 掌握Linux下使用外部存储设备、网络设备 掌握Linux下安装应用程序 三实验内容 1.查看GNOME提供的“应用程序”、“位置”或者“系统”菜单,运行其中的应用程 序和工具。 2.查看Linux文件目录结构,学会常用的文件目录操作,如复制、粘贴、移动、删 除、更名、创建文档、创建文件夹等。 3.练习在Linux下使用光盘和U盘。 4.学会网络配置,使计算机能够进行网络浏览等操作。 5.学会在Linux下安装新的应用软件。 四操作步骤与结果分析 五问题与建议

实验三Linux操作系统的安装 一实验名称 Linux操作系统的安装 二实验目的与要求 掌握安装Linux操作系统 三实验内容 1.通过学习《项目五Linux操作系统的安装及远程服务》的内容,学会如何安装Linux。 环境:windows 系统、vmware虚拟机、Redhat Linux镜像光盘。 通过安装向导将安装分为两步:1、基本安装,2、配置及具体安装。 在第一阶段重点如何分区,在第二阶段重点掌握如何设置密码及安装桌面环境。四操作步骤与结果分析 五问题与建议

Linux操作系统源代码详细分析

linux源代码分析:Linux操作系统源代码详细分析 疯狂代码 https://www.360docs.net/doc/a27112973.html,/ ?:http:/https://www.360docs.net/doc/a27112973.html,/Linux/Article28378.html 内容介绍: Linux 拥有现代操作系统所有功能如真正抢先式多任务处理、支持多用户内存保护虚拟内存支持SMP、UP符合POSIX标准联网、图形用户接口和桌面环境具有快速性、稳定性等特点本书通过分析Linux内核源代码充分揭示了Linux作为操作系统内核是如何完成保证系统正常运行、协调多个并发进程、管理内存等工作现实中能让人自由获取系统源代码并不多通过本书学习将大大有助于读者编写自己新 第部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 arch/i386/kernel/irq.h 19 arch/i386/kernel/process.c 22 arch/i386/kernel/signal.c 30 arch/i386/kernel/smp.c 38 arch/i386/kernel/time.c 58 arch/i386/kernel/traps.c 65 arch/i386/lib/delay.c 73 arch/i386/mm/fault.c 74 arch/i386/mm/init.c 76 fs/binfmt-elf.c 82 fs/binfmt_java.c 96 fs/exec.c 98 /asm-generic/smplock.h 107 /asm-i386/atomic.h 108 /asm- i386/current.h 109 /asm-i386/dma.h 109 /asm-i386/elf.h 113 /asm-i386/hardirq.h 114 /asm- i386/page.h 114 /asm-i386/pgtable.h 115 /asm-i386/ptrace.h 122 /asm-i386/semaphore.h 123 /asm-i386/shmparam.h 124 /asm-i386/sigcontext.h 125 /asm-i386/siginfo.h 125 /asm-i386/signal.h 127 /asm-i386/smp.h 130 /asm-i386/softirq.h 132 /asm-i386/spinlock.h 133 /asm-i386/system.h 137 /asm-i386/uaccess.h 139 //binfmts.h 146 //capability.h 147 /linux/elf.h 150 /linux/elfcore.h 156 /linux/errupt.h 157 /linux/kernel.h 158 /linux/kernel_stat.h 159 /linux/limits.h 160 /linux/mm.h 160 /linux/module.h 164 /linux/msg.h 168 /linux/personality.h 169 /linux/reboot.h 169 /linux/resource.h 170 /linux/sched.h 171 /linux/sem.h 179 /linux/shm.h 180 /linux/signal.h 181 /linux/slab.h 184 /linux/smp.h 184 /linux/smp_lock.h 185 /linux/swap.h 185 /linux/swapctl.h 187 /linux/sysctl.h 188 /linux/tasks.h 194 /linux/time.h 194 /linux/timer.h 195 /linux/times.h 196 /linux/tqueue.h 196 /linux/wait.h 198 init/.c 198 init/version.c 212 ipc/msg.c 213 ipc/sem.c 218 ipc/shm.c 227 ipc/util.c 236 kernel/capability.c 237 kernel/dma.c 240 kernel/exec_do.c 241 kernel/exit.c 242 kernel/fork.c 248 kernel/info.c 255 kernel/itimer.c 255 kernel/kmod.c 257 kernel/module.c 259 kernel/panic.c 270 kernel/prk.c 271 kernel/sched.c 275 kernel/signal.c 295 kernel/softirq.c 307 kernel/sys.c 307 kernel/sysctl.c 318 kernel/time.c 330 mm/memory.c 335 mm/mlock.c 345 mm/mmap.c 348 mm/mprotect.c 358 mm/mremap.c 361 mm/page_alloc.c 363 mm/page_io.c 368 mm/slab.c 372 mm/swap.c 394 mm/swap_state.c 395 mm/swapfile.c 398 mm/vmalloc.c 406 mm/vmscan.c 409

FANUC系统部分操作面板简介

;k;lm/n 部分面板按键功能 说明(FANUC) 一、FANUC0系统MDI面板: FANUC0系统MDI面板各键功能说明表 键名称功能说明 RESET复位键按下此键,复位CNC系统,包括取消报警、主轴故障复位、中途 退出自动操作循环与输入、输出过程等。 OUTPT START 输出启动键按下此键,CNC开始输出内存中得参数或程序到外部设备。 地址与数字键按下这些键,输入字母、数字与其它字符。 INPUT 输入键除程序编辑方式以外得情况,当面板上按下一个字母或数字键 以后,必须按下此键才能输入到CNC内。另外,与外部设备通 信时,按下此键,才能启动输入设备,开始输入数据到CNC内. CURSOR 光标移动键用于在CRT页面上,移动当前光标。 PAGE 页面变换键用于CRT屏幕选择不同得页面。 POS 页 面 切 换 键位置显示键在CRT上显示机床当前得坐标位置。 PRGRM 程序键在编辑方式,编辑与显示在内存中得程序. 在MDI方式,输入与显示MDI数据。 MENU OF SET 参数设置键刀具偏置数值与宏程序变量得显示得设定. DGNOS PRGRM 自诊断得参数键设定与显示参数表及自诊表得内容*

OPRALAR M 报警号显示键按此键显示报警号* AUXGRA PH 辅助图形图形显示功能,用于显示加工轨迹. ALTER 编 辑 键 替代键用输入域内得数据替代光标所在得数据。 DELET删除键删除光标所在得数据. INSRT插入键将输入域之中得数据插入到当前光标之后得位置上。CAN 取消键取消输入域内得数据。 EOB回车换行键结束一行程序得输入并且换行。 *表示尚未开发得功能键 二、FANUC0系统车床标准面板 FANUC0系统车床标准面板功能说明表 按钮名称功能说明MODE(模式选择旋 钮) EDIT编辑模式用于直接通过操作面板输入数控 程序与编辑程序。 AUTO 自动模式进入自动加工模式。 REF 回零模式机床回零;机床必须首先执行回 零操作,然后才可以运行。 MDIMDI模式单程序段执行模式. STEP/HAND LE 单步/手轮方式手动方式,STEP就是点动;HA NDLE就是手轮移动。 JOG 手动方式手动方式,连续移动。 DRY RUN 空运行模式按照机床默认得参数执行程序 DNC DNC模式从计算机读取一个数控程序。 运行控制按钮START循环启动程序运行开始;模式选择旋钮在 “AUTO”或“MDI”位置时按 下有效,其余模式下使用无效.

Linux操作系统源代码详细分析报告

Linux操作系统源代码详细分析 容简介: Linux 拥有现代操作系统所有的功能,如真正的抢先式多任务处理、支持多用户,存保护,虚拟存,支持SMP、UP,符合POSIX标准,联网、图形用户接口和桌面环境。具有快速性、稳定性等特点。本书通过分析Linux的核源代码,充分揭示了Linux作为操作系统的核是如何完成保证系统正常运行、协调多个并发进程、管理存等工作的。现实中,能让人自由获取的系统源代码并不多,通过本书的学习,将大大有助于读者编写自己的新程序。 第一部分 Linux 核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 arch/i386/kernel/irq.h 19 arch/i386/kernel/process.c 22 arch/i386/kernel/signal.c 30 arch/i386/kernel/smp.c 38 arch/i386/kernel/time.c 58 arch/i386/kernel/traps.c 65 arch/i386/lib/delay.c 73 arch/i386/mm/fault.c 74 arch/i386/mm/init.c 76 fs/binfmt-elf.c 82 fs/binfmt_java.c 96 fs/exec.c 98 include/asm-generic/smplock.h 107 include/asm-i386/atomic.h 108 include/asm-i386/current.h 109 include/asm-i386/dma.h 109 include/asm-i386/elf.h 113 include/asm-i386/hardirq.h 114 include/asm-i386/page.h 114 include/asm-i386/pgtable.h 115 include/asm-i386/ptrace.h 122 include/asm-i386/semaphore.h 123 include/asm-i386/shmparam.h 124 include/asm-i386/sigcontext.h 125 include/asm-i386/siginfo.h 125 include/asm-i386/signal.h 127 include/asm-i386/smp.h 130 include/asm-i386/softirq.h 132 include/asm-i386/spinlock.h 133 include/asm-i386/system.h 137 include/asm-i386/uaccess.h 139

Linux常见死机原因分析介绍

Linux常见死机原因分析介绍 宕机,指操作系统无法从一个严重系统错误中恢复过来,或系统硬件层面出问题,以致系统长时间无响应,而不得不重新启动计算机的现象。Linux系统也一样。不过原因有所不同。在排除了硬件故障/firmware版本/BIOS等等问题之外,Linux死机通常可能碰到如下几种情况 方法步骤 1,如果你的Linux死机的时候控制台上有乱七八糟的字符。恭喜你,这种情况叫做oops. 通常是Linux kernel认为自己发生了异常造成的。 可以通过oops消息查找出错的地方。 2,如果你的机器僵死,那么问题麻烦了。这种时候,通常是Kernel出现了死锁。Kernel不会知道自己死锁了,所以不会在屏幕上显示任何咚咚。

如果运气好,此时Kernel也许可能能够响应中断。不管怎样,你都无法进一步操作了。 3,严格来说,这第三种情况不算死机,现象如下:输入命令回车之后命令不能返回任何结果,但是控制台对回车可能有相应。但是命令无法结束,也不会有输出结果。 但是可以换到下一个控制台,而且还可以继续输入命令,但是输入命令之后还是没有输出。这种情况会有很多可能。通常是应用程序的系统调用长时间没有返回或者是满足不了应用的要求。 以上三种情况,system log的作用都不大。通常日志都不会纪录。所以只能使用Kernel的Debug工具。 补充:预防死机的小技巧 1、不要在同个硬盘安装多个操作系统 2、不要一次性打开多个网页浏览 3、在关闭电脑时,不要直接按电源按钮,否则会导致文件

丢失,下次使用不能正常开机导致死机 4、别让CPU、显卡超频,电脑温度过高 5、及时清理机箱内的灰尘 6、更换电脑硬件配置时,一定要插牢固 7、不要使用来历不明的软件和光盘,以免传染病毒 8、对系统文件或重要文件,最好使用隐含属性,以免因误操作而删除或覆盖这些文件 9、在安装应用软件时,若提示是否覆盖当前文件,一定不要覆盖,通常当前的系统文件是最好的 10、在运行大型应用软件时,不要在运行状态下退出以前运行的程序,否则会引起整个Windows崩溃 相关阅读:死机宕机实例介绍 自2015年3月11日下午5点起,据苹果用户反应

linux内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.360docs.net/doc/a27112973.html, 来源: https://www.360docs.net/doc/a27112973.html,/?business&aid=6&un=wwwlkk#7 linux2.6.35内核IMQ源码实现分析 (1)数据包截留并重新注入协议栈技术 (1) (2)及时处理数据包技术 (2) (3)IMQ设备数据包重新注入协议栈流程 (4) (4)IMQ截留数据包流程 (4) (5)IMQ在软中断中及时将数据包重新注入协议栈 (7) (6)结束语 (9) 前言:IMQ用于入口流量整形和全局的流量控制,IMQ的配置是很简单的,但很少人分析过IMQ的内核实现,网络上也没有IMQ的源码分析文档,为了搞清楚IMQ的性能,稳定性,以及借鉴IMQ的技术,本文分析了IMQ的内核实现机制。 首先揭示IMQ的核心技术: 1.如何从协议栈中截留数据包,并能把数据包重新注入协议栈。 2.如何做到及时的将数据包重新注入协议栈。 实际上linux的标准内核已经解决了以上2个技术难点,第1个技术可以在NF_QUEUE机制中看到,第二个技术可以在发包软中断中看到。下面先介绍这2个技术。 (1)数据包截留并重新注入协议栈技术

(2)及时处理数据包技术 QoS有个技术难点:将数据包入队,然后发送队列中合适的数据包,那么如何做到队列中的数

激活状态的队列是否能保证队列中的数据包被及时的发送吗?接下来看一下,激活状态的队列的 证了数据包会被及时的发送。 这是linux内核发送软中断的机制,IMQ就是利用了这个机制,不同点在于:正常的发送队列是将数据包发送给网卡驱动,而IMQ队列是将数据包发送给okfn函数。

Unity3D技术之Input按键系统详解

Unity3D技术之Input按键系统详解 默认输入轴: Horizontal 和 Vertical被映射到w, a, s, d键和方向键 Fire1, Fire2, Fire3被分别映射到Ctrl,Option(Alt)和Command键 Mouse X 和 Mouse Y被映射到鼠标移动增量 Window Shake X 和 Window Shake Y 被映射到窗口的移动 添加新的输入轴 添加新的虚拟轴,选择菜单Edit->Project Settings->Input : 名称(Name):名称用于从脚本使用这个轴 描述名称(Descriptive Name):正值名称显示于配置对话框的输入标签,用于独立版。 描述负名称(Descriptive Negative Name):负值名称显示于配置对话框的输入标签,用于独立版。文章出处【狗刨学习网】 负按钮(Negative Button):该按钮用于在负方向移动轴(如:左) 正按钮(Positive Button):该按钮用于在正方向移动轴(如:右) 备选负按钮(Alt Negative Button):备选按钮用于在负方向移动轴(如:a) 备选正按钮(Alt Positive Button):备选按钮用于在正方向移动轴(如:d) 重力(Gravity):当没有按钮被按下,在单位每秒速度,轴下降到0。 死亡(Dead):模拟的死区大小。设定范围内所有模拟设备的值为0。 灵敏度(Sensitivity):在单位每秒速度,轴将移向目标值。这近用于数码设备。 捕捉(Snap):如果启用,当按下相反方向的按钮,该轴值将重设为0。 反向(Invert):如果启用,负按钮将提供一个正值,反之亦然。

ic笔试常见试题

1.setup和holdup时间区别. Answer: 建立时间:触发器在时钟沿来到前,其数据输入端的数据必须保持不变的时间 保持时间:触发器在时钟沿来到后,其数据输入端的数据必须保持不变的时间 2.多时域设计中,如何处理信号跨时域 Answer: 情况比较多,如果简单回答的话就是:跨时域的信号要经过同步器同步,防止亚稳态传播。例如:时钟域1中的一个信号,要送到时钟域2,那么在这个信号送到时钟域2之前,要先经过时钟域2的同步器同步后,才能进入时钟域2。这个同步器就是两级d触发器,其时钟为时钟域2的时钟。这样做是怕时钟域1中的这个信号,可能不满足时钟域2中触发器的建立保持时间,而产生亚稳态,因为它们之间没有必然关系,是异步的。这样做只能防止亚稳态传播,但不能保证采进来的数据的正确性。所以通常只同步很少位数的信号。比如控制信号,或地址。当同步的是地址时,一般该地址应采用格雷码,因为格雷码每次只变一位,相当于每次只有一个同步器在起作用,这样可以降低出错概率,象异步FIFO的设计中,比较读写地址的大小时,就是用这种方法。 如果两个时钟域之间传送大量的数据,可以用异步FIFO来解决问题。 https://www.360docs.net/doc/a27112973.html,tch与register的区别,为什么现在多用register.行为级描述中latch如何产生的 区别不多说。为什么避免使用latch,因为设计中用latch会使设计后期的静态时序分析变的困难(必须用的地方当然另当别论)。 行为级描述中latch产生的原因:多由于构造组合逻辑电路时,使用if或case语句,没有把所有的条件给足,导致没有提到的条件,其输出未知。或者是每个条件分支中,没有给出所有输出的值,这就会产生latch。所以构造组合逻辑电路时,其always语句中的敏感信号必须包括所有的输入端,每个条件分支必须把所有的输出端的值都给出来。 4.BLOCKING NONBLOCKING 赋值的区别 Answer: 这个问题可参考的资料很多,讲的都很透彻,可以找一下。基本用法就是常说的“组合逻辑用BL OCKING,时序逻辑用NONBLOCKIN G”。 5.MOORE 与MEELEY状态机的特征 Answer: 6.IC设计中同步复位与异步复位的区别 Answer: 如果光说概念的话:同步复位在时钟沿采复位信号,完成复位动作。 异步复位不管时钟,只要复位信号满足条件,就完成复位动作。 象芯片的上电复位就是异步复位,因为这时时钟振荡器不一定起振了,可能还没有时钟脉冲。异步复位很容易受到复位端信号毛刺的影响,比如复位端信号由组合逻辑组成,那组合逻辑输出产生的冒险,就会使触发器错误的复位。 7.实现N位Johnson Counter,N= 8.用FSM实现101101的序列检测模块 9. 集成电路设计前端流程及工具。 10. FPGA和ASIC的概念,他们的区别 11. LATCH和DFF的概念和区别 Answer: LATC是H锁存器,DFF是触发器,其电路形式完全不同。 12. 用DFF实现二分频。

论文(linux操作系统与Windows操作系统的区别)

海南大学 毕业论文(设计) 题目:分析linux操作系统与Windows操作系统的区别 学号: 姓名: 年级: 学院: 系别: 专业: 指导教师: 完成日期:年月日

摘要 本文通过对Linux操作系统和Windows操作系统各自的发展特点与发展环境的比较,分析出windows与Linux的本质差别与存在此差别的根本原因。 通过二者内在特点及组成浅述,对两种操作系统做了权限、费用、读取、命令、弹性化与刻板化、安全稳定等方面的差异性对windows与Linux进行比较。 在硬件支持支持、购买能力、安装难易、占用内存、设备驱动、性能、稳定能力、编程、网络、安全、创新等10方面对windows与Linux做了优劣势的简单比较。 通过对windows与Linux更见详细的优劣势比较,以此对Linux与Windows 操作系统的区别做出了详细而具体的分析与论述。 借鉴以上分析结果,对不同人群、领域使用windows与Linux的优势劣势进行阐述,得出windows更适合初学者及工作需求低的人,而Linux更适合计算机高手及计算机专业人士使用。 关键词:Linux、Windows、操作系统、区别、开放源代码、稳定性。

Abstract Based on the Linux operating system and Windows operating system features and development of their own development environment, comparison and analysis of the nature of the differences between windows and Linux and the root cause of this difference exists.By the inherent characteristics and composition of both light above, made on the two operating systems permission, expenses, read, order, flexible and stereotypical, security and stability of the difference compared to the windows and Linux.Support in hardware support, purchasing power, ease of installation, take up memory, device drivers, performance, stability, capacity, programming, networking, security, innovation and other aspects of windows 10 and Linux do a simple comparison of the advantages and disadvantages. Through the windows and Linux even more detailed comparative advantages and disadvantages, in order for Linux and Windows operating systems to make the difference between a detailed and specific analysis and discussion.Learn from the above analysis, the different groups, areas of the advantages of using windows and Linux described disadvantages, more suitable for beginners to come and work windows of low demand, while Linux is more suitable for computer experts and computer professionals. Keywords: Linux; Windows; operating system; different;open source;stability.

Linux 常见故障诊断说明

Q:Linux 常见故障诊断说明 A:对大多数用户来说,由于 Linux 操作系统的易用性和 Windows 操作系统相比较起来还是存在一定差别的。在 Windows 操作系统下,如果系统发生一些故障或问题的时候,我们经常会用一些补救的措施来进行故障的排除,这些方法很多,而且简单易用。但是,这种在Linux操作系统进行故障排除的工作却要复杂一些,而且故障的发现不像在Windows操作系统那样可以及时预见,需要手工运行一些系统和网络的管理命令。下面,就对系统和网络两种类型在Linux操作系统中的常见故障诊断进行说明。 系统故障诊断 1.启动故障 这是在Linux操作系统中经常会遇到的问题。系统不能启动的原因主要有:在安装Linux 操作系统的过程中,LILO配置信息错误,导致安装完毕后,系统不能正常启动;重新安装其他的操作系统,也经常会导致原有的Linux不能启动。因为,这些新安装的操作系统默认为计算机中没有其他的操作系统,因而改写了硬盘的主引导记录(MBR),覆盖了Linux操作系统中的LILO系统引导程序,致使最后无法启动LILO;在操作linux操作系统过程中,由于运行错误的Linux命令,使系统重新启动时,出现异常。 解决方法: 如果在Linux操作系统安装过程中或安装过程后,制作了Linux系统的急救启动盘组,使用这些急救盘启动系统即可进入系统,然后对相应错误,进行配置即可解决问题;如果没有制作急救启动盘组,Linux系统不能启动,该怎么办呢?下面介绍三种解决方法: (1)进入Linux操作系统单用户模式,在boot提示符后,敲入:linux single,此模式下启动Linux,LILO配置和网络配置信息不加载在启动过程中。 (2)光盘启动,用第一张安装Linux操作系统的光盘(启动光盘)启动硬盘的Linux系统,主板BIOS里要设置光盘启动,重启机器后,出现 boot: 提示符后键入: vmlinuz root=/dev/linuxrootpartition noinitrd 其中,root=后面填入您的Linux root分区的分区号,也就是Linux系统的root文件系统所在的硬盘分区位置,例如:vmlinuz root=/dev/hda3 noinitrd。回车之后,即可进Linux系统。如果想恢复被破坏的LILO系统引导程序,可以编辑/etc/lilo.conf 之后, 运行/sbin/lilo即可。这种方法也适合其它原因对Linux操作系统造成的破坏。(注:软盘启动操作系统的过程也同上)。 (3)在DOS下运行loadlin程序启动系统。在个人计算机使用 Linux系统时,通常都是Linux和Windows 9x或Windows 2000并存的。如果知道Linux系统在硬盘上的确切安装分区,并且有loadlin程序(在 Red Hat Linux 光盘的 dosutil目录下就有这个程序),也可以启动Linux系统。loadlin是DOS系统下的程序,运行它可以从DOS系统下直接启动Linux系统,快速进入Linux环境。除loadlin程序之外,还需要一个 Linux启动内核的映像文件vmlinuz,在 Red Hat linux光盘的 images目录下有这个文件。例如,如果在Windows 2000系统下面,进入DOS的命令模式,然后运行下述的loadlin命令,即可重新进入Linux系统: loadlin vmlinuz root=/dev/linuxrootpartition 命令执行后,就开始引导Linux系统。用root身份登录后,编辑/etc/lilo.conf 之后,运行/sbin/lilo即可,这样操作后则重新将LILO系统引导程序装入MBR。 2.文件系统故障

读Linux内核源代码

Linux内核分析方法 Linux的最大的好处之一就是它的源码公开。同时,公开的核心源码也吸引着无数的电脑爱好者和程序员;他们把解读和分析Linux的核心源码作为自己的最大兴趣,把修改Linux源码和改造Linux系统作为自己对计算机技术追求的最大目标。 Linux内核源码是很具吸引力的,特别是当你弄懂了一个分析了好久都没搞懂的问题;或者是被你修改过了的内核,顺利通过编译,一切运行正常的时候。那种成就感真是油然而生!而且,对内核的分析,除了出自对技术的狂热追求之外,这种令人生畏的劳动所带来的回报也是非常令人着迷的,这也正是它拥有众多追随者的主要原因: ?首先,你可以从中学到很多的计算机的底层知识,如后面将讲到的系统的引导和硬件提供的中断机制等;其它,象虚拟存储的实现机制,多任务机制,系统保护机制等等,这些都是非都源码不能体会的。 ?同时,你还将从操作系统的整体结构中,体会整体设计在软件设计中的份量和作用,以及一些宏观设计的方法和技巧:Linux的内核为上层应用提供一个与具体硬件不相关的平台; 同时在内核内部,它又把代码分为与体系结构和硬件相关的部分,和可移植的部分;再例如,Linux虽然不是微内核的,但他把大部分的设备驱动处理成相对独立的内核模块,这样减小了内核运行的开销,增强了内核代码的模块独立性。 ?而且你还能从对内核源码的分析中,体会到它在解决某个具体细节问题时,方法的巧妙:如后面将分析到了的Linux通过Botoom_half机制来加快系统对中断的处理。 ?最重要的是:在源码的分析过程中,你将会被一点一点地、潜移默化地专业化。一个专业的程序员,总是把代码的清晰性,兼容性,可移植性放在很重要的位置。他们总是通过定义大量的宏,来增强代码的清晰度和可读性,而又不增加编译后的代码长度和代码的运行效率; 他们总是在编码的同时,就考虑到了以后的代码维护和升级。甚至,只要分析百分之一的代码后,你就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。而这一点是任何没有真正分析过标准代码的人都无法体会到的。 然而,由于内核代码的冗长,和内核体系结构的庞杂,所以分析内核也是一个很艰难,很需要毅力的事;在缺乏指导和交流的情况下,尤其如此。只有方法正确,才能事半功倍。正是基于这种考虑,作者希望通过此文能给大家一些借鉴和启迪。 由于本人所进行的分析都是基于2.2.5版本的内核;所以,如果没有特别说明,以下分析都是基于i386单处理器的2.2.5版本的Linux内核。所有源文件均是相对于目录/usr/src/linux的。 方法之一:从何入手 要分析Linux内核源码,首先必须找到各个模块的位置,也即要弄懂源码的文件组织形式。虽然对于有经验的高手而言,这个不是很难;但对于很多初级的Linux爱好者,和那些对源码分析很

Linux内核源代码阅读与工具介绍

Linux的内核源代码可以从很多途径得到。一般来讲,在安装的linux系统下,/usr/src/linux 目录下的东西就是内核源代码。另外还可以从互连网上下载,解压缩后文件一般也都位于linux目录下。内核源代码有很多版本,目前最新的版本是2.2.14。 许多人对于阅读Linux内核有一种恐惧感,其实大可不必。当然,象Linux内核这样大而复杂的系统代码,阅读起来确实有很多困难,但是也不象想象的那么高不可攀。只要有恒心,困难都是可以克服的。任何事情做起来都需要有方法和工具。正确的方法可以指导工作,良好的工具可以事半功倍。对于Linux内核源代码的阅读也同样如此。下面我就把自己阅读内核源代码的一点经验介绍一下,最后介绍Window平台下的一种阅读工具。 对于源代码的阅读,要想比较顺利,事先最好对源代码的知识背景有一定的了解。对于linux内核源代码来讲,基本要求是:⑴操作系统的基本知识;⑵对C语言比较熟悉,最好要有汇编语言的知识和GNU C对标准C的扩展的知识的了解。另外在阅读之前,还应该知道Linux内核源代码的整体分布情况。我们知道现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序、网络等组成。看一下Linux内核源代码就可看出,各个目录大致对应了这些方面。Linux内核源代码的组成如下(假设相对于linux目录): arch这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。如对于X86平台就是i386。 include这个目录包括了核心的大多数include文件。另外对于每种支持的体系结构分别有一个子目录。 init此目录包含核心启动代码。 mm此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下,如对应于X86的就是arch/i386/mm/fault.c。 drivers系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于drivers/sound。 ipc此目录包含了核心的进程间通讯代码。 modules此目录包含已建好可动态加载的模块。 fs Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext2文件系统对应的就是ext2子目录。 kernel主要核心代码。同时与处理器结构相关代码都放在arch/*/kernel目录下。 net核心的网络部分代码。里面的每个子目录对应于网络的一个方面。 lib此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/*/lib/目录下。

Android_Input分析

Input Subsystem分析 Android2.3.7的Input子系统由驱动、Native层InputManager、InputManager JNI、Java层InputManager组成。 Input子系统的驱动被封装为字符设备,目录位于/dev/input,上层架构通过扫描该目录,得到输入设备,open()设备,read()来自底层驱动的输入事件,再由上层处理转发。 Native层InputManager有: EventHub.cpp 使用poll机制,从字符设备获取事件。 InputReader.cpp 负责从EventHub获取事件并交给InputDispatcher进行分发。它有三个附属类协助其实现该层的功能,InputDevice、InputMapper(其子类有:SwitchInputMapper、KeyboardInputMapper、TouchInputMapper、MouseInputMapper、SingleTouchInputMapper、MultiTouchInputMapper等各种输入类型的映射)将事件分类交给InputDispatcher。还有个InputReaderThread负责创建InputReader线程,由InputManager类管理,该线程会受到Poll机制的阻塞。 InputDispatcher.cpp负责将事件分发给Connection(即foreground target,猜测是当前活动UI的代理)。他内部采用queue存储事件,并使用Looper类(使用epoll实现)实现对事件接收者的管理,一旦有事件来到,首先检查queue是否为空并插入事件,不空时立即唤醒Looper,进入事件处理循环。这里同样采用线程循环,名字是InputDispatcherThread,也是由InputManager类初始化,该线程同样会受到Poll机制的阻塞。InputDispatcher类比较复杂,其内部流程还不是很清楚,还有一些附属类尚未研究。 InputManager.cpp负责管理InputReaderThread和InputDispatcherThread线程,如它们的初始化、start和stop。 以上几个类都是从其相应的Interface抽象类继承下来的,表明它们是被作为独立的组件设计的,我们可以替换它们。但是JNI层依赖具体的InputManager,2.3.7版本的InputManager实现比较简单,依附于WindowManager服务,4.0代码将InputManager也提升为一个service,可能输入响应要提高一个级别。 JNI层InputManager有: com_android_server_InputManager.cpp负责初始化InputManager,向上面Java层提供Native调用。它继承自InputReaderPolicyInterface和InputDispatcherPolicyInterface,并将自己作为参数传递给InputReader和InputDispatcher,大概是用来实现一些策略。 它提供的功能很多,如registerInputChannel()函数提供给应用程序注册Input系统以实现事件输入,该机制被包装为InputChannel类,在Native层又被封装进Connection类,被Looper添加为事件接受者。 Java层InputManager有: InputManager.java几乎是对JNI层的封装,并为JNI提供了回调。它的初始化是在

相关文档
最新文档