
Linux内核之中断/异常/系统调用
文章平均质量分 64
SunnyBeiKe
喜爱计算机,励志考研深造!
展开
-
中断之中断向量表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 · 6152 阅读 · 0 评论 -
硬件时钟处理过程
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 · 1098 阅读 · 0 评论 -
广播模式
/* * 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 · 2607 阅读 · 0 评论 -
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 · 2616 阅读 · 0 评论 -
timer 子系统的初始化过程
概览:系统刚上电时,需要注册 IRQ0 时钟中断,完成时钟源设备,时钟事件设备,tick device 等初始化操作并选择合适的工作模式。由于刚启动时没有特别重要的任务要做,因此默认是进入低精度 + 周期 tick 的工作模式,之后会根据硬件的配置(如硬件上是否支持 HPET 等高精度 timer)和软件的配置(如是否通过命令行参数或者内核配置使能了高精度 timer 等特性)进行切换。在一个原创 2011-11-29 21:59:01 · 5660 阅读 · 0 评论 -
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 · 2130 阅读 · 0 评论 -
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 · 2355 阅读 · 0 评论 -
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 · 895 阅读 · 0 评论 -
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 · 1058 阅读 · 0 评论 -
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 · 4829 阅读 · 0 评论 -
动态时钟
/** * 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 · 3097 阅读 · 0 评论 -
以sethostname()系统调用为例学习系统调用
在分析了中断和异常之后,对于系统调用的过程应该是很容易理解的,这篇博文中除了介绍系统调用,还会涉及到一个比较重要的知识点——异常修正。int sethostname(const char* name, size_t size)参数name是要设置的主机名;len是name的长度;调用后返回0表示成功,返回-1表示失败。失败时用户程序中的全局变量errno和iu含有具体的出错代码。原创 2011-11-30 16:58:28 · 6671 阅读 · 0 评论 -
内核时钟机制
原创 2011-11-28 20:17:14 · 828 阅读 · 0 评论 -
时钟
http://www.ibm.com/developerworks/cn/linux/l-cn-timerm/?S_TACT=105AGX52&S_CMP=reg-ccidhttp://blog.youkuaiyun.com/dog250/article/details/5303566http://www.ibm.com/developerworks/cn/linux/l-cn-clocks/先搞原创 2011-11-26 23:35:06 · 777 阅读 · 0 评论 -
Linux中断实现浅析
转自:http://bbs.chinaunix.net/thread-3566316-1-1.html本文描述内容针对2.6.31+x86平台,不包含硬件相关的细节。作者:独孤九贱;版权所有,转载请注明出处。有问题欢迎与我交流讨论。一、概述中断,本质上是一个电信号,早期的计算的并没有中断这一概念,这使得CPU与外围设备的交互变得困难,CPU需要不断的轮询,以探测外围设备转载 2011-11-16 08:25:09 · 1680 阅读 · 0 评论 -
中断的响应和服务
在IDT和中断响应队列初始化完毕之后,我们来看如何响应一个中断。 CPU从中断控制器获得中断向量,然后从IDT表中找出对应表项,实际上是一个中断门。根据中断门中的地址信息,我们找到了特定中断的服务入口地址。首先,我们需要问的是,这个入口地址是在哪里设置的呢?我们回到IDT表的初始化一节中,回顾interrupt数组的初始化,如下:/* * Build the entry s原创 2011-11-12 11:55:41 · 3210 阅读 · 0 评论 -
电平触发和边缘触发
转自:http://hancejohn.blog.163.com/blog/static/3458190920100111036828/ 记得以前上大学时,老师讲到下降沿触发时,怎么也分不清下降沿触发与低电平触发有什么区别,乍看,它们似乎是一样的,比如键盘扫描程序扫描键盘是否按下:某事件设为低电平触发【采用周期时间扫描方式查询触发条件是否成立】,初始化时为高电平即事件未触发,当电平突然转载 2011-11-17 20:58:11 · 8425 阅读 · 1 评论 -
中断之中断请求队列的初始化
参考文章: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 · 3273 阅读 · 0 评论 -
关于handle_level_irq、handle_edge_irq和中断嵌套问题
在中断的响应和服务的博文中,我们提到了handle_level_irq,但是忽略了另一个和他对应的函数handle_edge_irq。现在我们需要单独地对他们分析一下,并借此来分析有关Linux中断嵌套的问题!在说这两个函数之前,我们有必要先了解电平触发和边缘触发,及他们之间的区别。可以参考博文http://blog.youkuaiyun.com/sunnybeike/article/details/69原创 2011-11-17 23:06:55 · 6347 阅读 · 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 · 2901 阅读 · 0 评论 -
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 · 2272 阅读 · 0 评论 -
异常(以页面异常和除零错误为例)
在了解了中断的工作原理之后,你会发现,异常的处理是如此简单!与中断相比,异常的处理无非多了对出错码的处理: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 · 2687 阅读 · 0 评论 -
时钟中断
内核在启动时通过RTC获取一个起始时间,然后就可以利用TSC、HPET等机制维护自己的时间。1.时钟源内核把每一个可用于计时的时钟抽象为时钟源(clocksource)结构:/** * struct clocksource - hardware abstraction for a free running counter * Provides mostly state-fr原创 2011-11-23 15:43:12 · 6200 阅读 · 0 评论 -
时钟中断处理
参考文章:http://www.ibm.com/developerworks/cn/linux/l-cn-timerm/?S_TACT=105AGX52&S_CMP=reg-ccid http://blog.youkuaiyun.com/dog250/article/details/5303566 http://www.ibm.com原创 2011-11-25 21:07:44 · 921 阅读 · 0 评论 -
High-Resolution Timers
通常软时钟是建立在周期性的时钟中断的基础之上的,为了获取精度较高的软时钟中断,不得不提高时钟中断频率,但是过高的中断频率会造成CPU运算周期的浪费。High-Resolution机制,通过可编程的硬件定时器,把它的到期时间设置为软定时器队列中最早到期的时间,当时钟到期时,再把剩余的软定时器队列的最早到期时间编程到硬件定时器中,这样既能提高软时钟的精度,也不至于影响系统的性能。High-Reso原创 2011-11-25 13:51:46 · 3821 阅读 · 0 评论 -
内核中一个重要的函数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 · 8107 阅读 · 0 评论