- 博客(46)
- 资源 (13)
- 收藏
- 关注
原创 内核中一个重要的函数copy_from_user
主要参考:《情景分析》这个函数的功能是很明显的,就是将用户空间中的内容拷贝到内核空间中:static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n){ int sz = __compil
2011-11-30 17:23:40 7900
原创 以sethostname()系统调用为例学习系统调用
在分析了中断和异常之后,对于系统调用的过程应该是很容易理解的,这篇博文中除了介绍系统调用,还会涉及到一个比较重要的知识点——异常修正。int sethostname(const char* name, size_t size)参数name是要设置的主机名;len是name的长度;调用后返回0表示成功,返回-1表示失败。失败时用户程序中的全局变量errno和iu含有具体的出错代码。
2011-11-30 16:58:28 6498
原创 动态时钟
/** * struct tick_sched - sched tick emulation and no idle tick control/stats * @sched_timer: hrtimer to schedule the periodic tick in high * resolution mode * @idle_tick: Store the last idle t
2011-11-30 14:05:44 3015
原创 timer 子系统的初始化过程
概览:系统刚上电时,需要注册 IRQ0 时钟中断,完成时钟源设备,时钟事件设备,tick device 等初始化操作并选择合适的工作模式。由于刚启动时没有特别重要的任务要做,因此默认是进入低精度 + 周期 tick 的工作模式,之后会根据硬件的配置(如硬件上是否支持 HPET 等高精度 timer)和软件的配置(如是否通过命令行参数或者内核配置使能了高精度 timer 等特性)进行切换。在一个
2011-11-29 21:59:01 5510
原创 广播模式
/* * Periodic broadcast: * - invoke the broadcast handlers */static void tick_do_periodic_broadcast(void){ raw_spin_lock(&tick_broadcast_lock); cpumask_and(to_cpumask(tmpmask),
2011-11-29 21:48:37 2539
原创 动态时钟
/** * struct tick_sched - sched tick emulation and no idle tick control/stats * @sched_timer: hrtimer to schedule the periodic tick in high * resolution mode * @idle_tick: Store the last idle t
2011-11-29 21:31:08 2198
原创 从系统调用nanosleep()学习High-Resolution Timers
nanosleep()则是Linux中的系统调用,它是使用定时器来实现的,该调用使调用进程睡眠,并往定时器队列上加入一个hrtimer型定时器,time_list结构里包括唤醒时间以及唤醒后执行的函数,通过nanosleep()加入的定时器的执行函数仅仅完成唤醒当前进程的功能。系统通过一定的机制定时检查这些队列(比如通过系统调用陷入核心后,从核心返回用户态前,要检查当前进程的时间片是否已经耗尽,如
2011-11-29 14:24:47 6105
原创 硬件时钟处理过程
static struct irqaction irq0 = { .handler = timer_interrupt, .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER, .name = "timer"};/* * Default timer interrupt handler f
2011-11-28 23:46:32 1049
原创 late_time_init
在timer_init()中,我们将late_time_init初始化为x86_late_time_init():static __init void x86_late_time_init(void){ x86_init.timers.timer_init(); //最终调用hpet_time_init tsc_init();}/* Default timer init
2011-11-27 21:54:59 2022
原创 time_init
/* * Initialize TSC and delay the periodic timer init to * late x86_late_time_init() so ioremap works. */void __init time_init(void){ late_time_init = x86_late_time_init;}函数x86_late_time_ini
2011-11-27 15:40:52 2270
原创 timerkeeping_init
我们首先弄清楚两个概念时钟源和时钟事件设备(源):(1)时钟源/** * struct clocksource - hardware abstraction for a free running counter * Provides mostly state-free accessors to the underlying hardware. * This is the st
2011-11-27 15:38:38 834
原创 hrtimers_init()
void __init hrtimers_init(void){ hrtimer_cpu_notify(&hrtimers_nb, (unsigned long)CPU_UP_PREPARE, (void *)(long)smp_processor_id()); register_cpu_notifier(&hrtimers_nb);#ifdef CONFIG_HIGH_RES_
2011-11-27 15:19:45 980
原创 init_timers();
void __init init_timers(void){//初始化本 CPU 上的软件时钟相关的数据结构 int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE, (void *)(long)smp_processor_id()); //因为是初始化阶段,所以得到的CPU为启动CPU init_
2011-11-27 15:07:19 4654
原创 tick_init();
/** * tick_init - initialize the tick control * * Register the notifier with the clockevents framework */void __init tick_init(void){ clockevents_register_notifier(&tick_notifier);//这里用到了通知链技术,
2011-11-27 11:33:28 2544
转载 内核通知链机制的原理及实现
转自:http://blog.sina.com.cn/s/blog_6683e49d0100tovr.html这篇文章是对以下两位博主的文章进行了简单整理转载引用,备忘。非常感谢两位的分享。http://my.chinaunix.net/space.php?uid=25445243&do=blog&id=212959http://yfydz.cublog.cn 一、
2011-11-27 11:26:58 1401
原创 时钟
http://www.ibm.com/developerworks/cn/linux/l-cn-timerm/?S_TACT=105AGX52&S_CMP=reg-ccidhttp://blog.csdn.net/dog250/article/details/5303566http://www.ibm.com/developerworks/cn/linux/l-cn-clocks/先搞
2011-11-26 23:35:06 708
原创 中断队列的初始化
参考文章:http://bbs.chinaunix.net/thread-3566316-1-1.html参考文章:http://www.linuxidc.com/Linux/2011-02/32129.htm在“初始化中断向量表”的博文中,我们留下了一个问题,就是void __init native_init_IRQ(void){ int i; /* Exec
2011-11-26 19:40:32 1858
原创 时钟中断处理
参考文章:http://www.ibm.com/developerworks/cn/linux/l-cn-timerm/?S_TACT=105AGX52&S_CMP=reg-ccid http://blog.csdn.net/dog250/article/details/5303566 http://www.ibm.com
2011-11-25 21:07:44 855
原创 High-Resolution Timers
通常软时钟是建立在周期性的时钟中断的基础之上的,为了获取精度较高的软时钟中断,不得不提高时钟中断频率,但是过高的中断频率会造成CPU运算周期的浪费。High-Resolution机制,通过可编程的硬件定时器,把它的到期时间设置为软定时器队列中最早到期的时间,当时钟到期时,再把剩余的软定时器队列的最早到期时间编程到硬件定时器中,这样既能提高软时钟的精度,也不至于影响系统的性能。High-Reso
2011-11-25 13:51:46 3628
原创 时钟中断
内核在启动时通过RTC获取一个起始时间,然后就可以利用TSC、HPET等机制维护自己的时间。1.时钟源内核把每一个可用于计时的时钟抽象为时钟源(clocksource)结构:/** * struct clocksource - hardware abstraction for a free running counter * Provides mostly state-fr
2011-11-23 15:43:12 6105
原创 异常(以页面异常和除零错误为例)
在了解了中断的工作原理之后,你会发现,异常的处理是如此简单!与中断相比,异常的处理无非多了对出错码的处理:ENTRY(page_fault) RING0_EC_FRAME pushl_cfi $do_page_fault ALIGNerror_code: /* the function address is in %gs's slot on the stack */ pushl
2011-11-23 14:14:35 2610
原创 tasklet
我们从软中断的初始化说起:软中断的初始化是在star_kernel中调用softirq_init完成的。void __init softirq_init(void){ int cpu; for_each_possible_cpu(cpu) { //初始化每个CPU的tasklet_vec队列、tasklet_hi_vec队列以及软中断工作列表。 int i; per
2011-11-22 20:55:35 2214
原创 关于handle_level_irq、handle_edge_irq和中断嵌套问题
在中断的响应和服务的博文中,我们提到了handle_level_irq,但是忽略了另一个和他对应的函数handle_edge_irq。现在我们需要单独地对他们分析一下,并借此来分析有关Linux中断嵌套的问题!在说这两个函数之前,我们有必要先了解电平触发和边缘触发,及他们之间的区别。可以参考博文http://blog.csdn.net/sunnybeike/article/details/69
2011-11-17 23:06:55 6062 1
转载 电平触发和边缘触发
转自:http://hancejohn.blog.163.com/blog/static/3458190920100111036828/ 记得以前上大学时,老师讲到下降沿触发时,怎么也分不清下降沿触发与低电平触发有什么区别,乍看,它们似乎是一样的,比如键盘扫描程序扫描键盘是否按下:某事件设为低电平触发【采用周期时间扫描方式查询触发条件是否成立】,初始化时为高电平即事件未触发,当电平突然
2011-11-17 20:58:11 8286 1
原创 软中断与Bottom Half
/* * Exit an interrupt context. Process softirqs if needed and possible: */void irq_exit(void){ account_system_vtime(current); trace_hardirq_exit(); sub_preempt_count(IRQ_EXIT_OFFSET); if (!in
2011-11-17 16:29:04 2848
转载 Linux中断牛刀小试
转自:http://www.linuxidc.com/Linux/2011-02/32129.htm前言 在前面分析了中断的基本原理后,就可以写一个内核中断程序来体验以下,也可以借此程序继续深入来了解内核中断的执行过程 一.内核中断程序 : 我们还是来看一看成程序: 在看程序之前,要熟悉如何进行模块编程,和了解module_pararm()的用法。如果不熟悉的话请大家看,m
2011-11-16 08:34:28 836
转载 Linux中断实现浅析
转自:http://bbs.chinaunix.net/thread-3566316-1-1.html本文描述内容针对2.6.31+x86平台,不包含硬件相关的细节。作者:独孤九贱;版权所有,转载请注明出处。有问题欢迎与我交流讨论。一、概述中断,本质上是一个电信号,早期的计算的并没有中断这一概念,这使得CPU与外围设备的交互变得困难,CPU需要不断的轮询,以探测外围设备
2011-11-16 08:25:09 1601
转载 uC/OS-II内核架构解析---uC/OS-II系统核心
转自:http://bbs.ednchina.com/BLOG_ARTICLE_1969777.HTM【专题】uC/OS-II内核架构解析(1)---嵌入式RTOS1. 嵌入式系统基本模型2. RTOS设计原则 采用各种算法和策略,始终保持系统行为的可预测性。即在任何情况下,在系统运行的任何时刻,OS的资源配置策略都能为争夺资源(包括C
2011-11-13 14:03:25 4633
转载 改进uC/OS II,减少内存使用量
转自:http://www.4ucode.com/Study/Topic/1476482在以uC/OS为操作系统的项目中,系统可能要处理各种不同的中断请求,如果某个中断处理程序需要调用uC/OS的各种Post函数向任务发出消息,那么uC/OS建议中断服务程序的写法是:1、保存全部CPU寄存器2、调用OSIntEnter或OSIntNesting直接加13、执行用户代码做中断服务
2011-11-13 13:50:41 1037
转载 uC/OS支持同优先级及优先级反转解决
转自:http://www.dzjs.net/html/qianrushixitong/2007/0710/2360.htmluCOS II 是一个源代码公开的嵌入式实时操作系统,以其稳定可靠、高效、可移植性好,并且为占先式调度等特点,被广大工程技术人员使用。uCOS II 作为一种占先式的实时操作系统,在不少方面有着可以与商业内核相比的功能。但是uCOS II 不支持同优先级任务的调度,而实际的
2011-11-13 09:54:59 1588
转载 uC/OS优先级反转及解决
转自:http://blog.csdn.net/zccst/article/details/42943391 uC/OS-II的运行机制 在嵌入式系统的应用中,实时性是一个重要的指标,而优先级翻转是影响系统实时性的重要问题。本文着重分析优先级翻转问题的产生和影响,以及在uC/OS-II中的解决方案。 uC/OS-II采用基于固定优先级的占先式调度方式,是一个实时、多任务的操
2011-11-13 09:53:56 1568
转载 进程间通信(二)
Linux环境进程间通信管道及有名管道郑彦兴 (mlinux@163.com)国防科大计算机学院简介: 在本系列序中作者概述了 linux 进程间通信的几种主要手段。其中管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 认清管道和有名管道的读写规则
2011-11-12 23:09:41 736
转载 进程间通信(一)
深刻理解Linux进程间通信(IPC)郑彦兴 (mlinux@163.com)国防科大计算机学院简介: 一个大型的应用系统,往往需要众多进程协作,进程(Linux进程概念见附1)间通信的重要性显而易见。本系列文章阐述了Linux环境下的几种主要进程间通信手段,并针对每个通信手段关键技术环节给出详细实例。为达到阐明问题的目的,本文还对某些通信手段的内部实现机制进行了分析。
2011-11-12 23:07:59 931
原创 中断的响应和服务
在IDT和中断响应队列初始化完毕之后,我们来看如何响应一个中断。 CPU从中断控制器获得中断向量,然后从IDT表中找出对应表项,实际上是一个中断门。根据中断门中的地址信息,我们找到了特定中断的服务入口地址。首先,我们需要问的是,这个入口地址是在哪里设置的呢?我们回到IDT表的初始化一节中,回顾interrupt数组的初始化,如下:/* * Build the entry s
2011-11-12 11:55:41 3142
原创 中断之中断请求队列的初始化
参考文章:http://bbs.chinaunix.net/thread-3566316-1-1.html参考文章:http://www.linuxidc.com/Linux/2011-02/32129.htm在“初始化中断向量表”的博文中,我们留下了一个问题,就是void __init native_init_IRQ(void){ int i; /* Ex
2011-11-11 17:28:10 3165
原创 中断之中断向量表IDT的初始化
中断的初始化是在哪里完成的呢?是在start_kernel()中:512 trap_init();535 /* init some links before init_ISA_irqs() */536 early_irq_init();537 init_IRQ(); //最终调用native_init_IRQ,由它来完成主要工作。中断向量表的初始化
2011-11-11 11:08:10 6001
转载 用户态向内核态切换
转自:http://blog.csdn.net/sdustliyang/article/details/6458502那么,程序什么时候使用用户栈,什么时候使用内核栈呢?对,系统调用。也就是执行printf、open、read、write执行C语言库函数时,其最终会用到对应的系统调用,如sys_open、sys_read等。这时候就切换到内核栈。1 Linux的堆栈切换我们
2011-11-11 10:37:00 2445 2
转载 进程管理之内核抢占(二)
转自:http://www.cnblogs.com/hustcat/archive/2009/08/31/1557507.html1、上下文一般来说,CPU在任何时刻都处于以下三种情况之一:(1)运行于用户空间,执行用户进程;(2)运行于内核空间,处于进程上下文;(3)运行于内核空间,处于中断上下文。应用程序通过系统调用陷入内核,此时处于进程上下文。现代几乎所有的C
2011-11-09 16:56:34 838
转载 进程管理之内核抢占(一)
转自:http://biancheng.dnbcw.info/linux/350569.htmlLinux内核抢占实现机制分析作者: crazytyt 和linux相关 简介:这是Linux内核抢占实现机制分析的详细页面,介绍了和linux,有关的知识、技巧、经验,和一些linux源码等。本文详解了Linux内核抢占实现机制。首先介绍了内核抢占和用户抢占的概念和区
2011-11-09 16:39:17 1019
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人