内核机制学习笔记
文章平均质量分 83
linux内核移植开发,除了需要编写驱动外,驱动与内核的交互会用到很多内核框架机制,如platform device机制,内核运行时也有很多有意思的机制技术,如内核时钟系统。
学习了解这些内核机制对于我们系统把握整个内核很有帮助,这里就让我们一起去学习探索吧
kerneler_
做一个有技术追求的人
ps:目前公司太忙,暂没时间更新博客,,大家评论我尽量回复,望大家谅解
展开
-
kernel如何保证cache数据一致性
那么问题就来了,正因为嵌入式处理器软件管理cache,就需要我们代码主动去操作cache,但在内核开发中很少会直接进行cache操作,cache操作到底在哪里进行的,什么时候需要操作cache。首先想明白一点,为什么要进行cache操作,只能说cache是天使也是魔鬼。cache在提高了系统性能同时却导致了数据的不一致性。嵌入式处理器软件管理cache的初衷就是保证数据一致性。那什么地方需要保证数据一致性呢?对于由CPU完全操作的数据,数据是完全一致的。也就是该数据完全由CPU写读操作,没有对CPU不原创 2015-08-27 10:31:21 · 21636 阅读 · 4 评论 -
内核中断号必须要跟硬件中断号一致吗
首先说明,答案是否定的,内核中断号可以与硬件中断号不一致,但是这是个无聊的问题。。实用价值不大。但是却可以引起对内核软件中断号与硬件中断号关系的思考。两者的关系我觉得可以从中断的初始化和分发过程来一探究竟。这里就从ARM PPC MIPS 3款主流嵌入式处理器架构的内核代码框架中来分析下他们中断的初始化和分发过程。原创 2015-06-29 14:14:54 · 6223 阅读 · 1 评论 -
熟悉又陌生的udelay
内核开发中经常用到延时函数,最熟悉的是mdelay msleep。虽然经常会使用,但是具体实现却不了解,今天来研究下。这2个函数在实现上有着天壤之别。msleep实现是基于调度,延时期间调用schedule_timeout产生调度,待时间到期后继续运行,该函数实现在kernel/timer.c中。由于linux内核不是实时系统,因此涉及调度的msleep肯定不会精确。今天不细说msleep,有时间再来分析它,今天重点来学习mdelay。mdelay是使用最多的延时函数。它的实现是忙循环,利用了内核原创 2015-07-05 16:25:21 · 7752 阅读 · 1 评论 -
linux kernel软中断及其衍生品-定时器 tasklet的实现
软中断概念在嵌入式开发可以有两个不同的解释:其一,软中断在处理器设计中是处理器异常之一,程序软件使用指定指令(如arm的SWI指令)引发该异常从而陷入内核态执行,最典型的软件应用就是系统调用。其二,在kernel代码中实现了一套软中断机制,区别于硬件中断的硬件触发软件处理,而是软件触发软件处理。原创 2015-04-07 17:13:01 · 4256 阅读 · 0 评论 -
移植linux kernel,应该怎么做
对于移植kernel的思路我觉得还是很有必要总结下,这里总结不涉及具体代码,而只是说说保证kernel能进入console稳定运行这样一个最小系统,我们需要完成哪些部分的移植呢。根据这次移植我的思路,需要以下几个方面的移植:cpu core初始化,内存管理子系统(mmu),硬件时钟系统,早期调试打印机制,异常中断子系统,时间子系统(timer),串口驱动原创 2015-01-31 20:52:37 · 7640 阅读 · 7 评论 -
linux kernel 时钟系统的前世今生
针对kernel时钟系统初始化我有3个地方的思考:(1)根据上面分析,clocksource在kernel下默认是有default,也就是jiffies,从default_clocksource获取的cycle就是jiffies值,精度只有1。而clockevent没有default,所以在编写timer driver时clockevent实现是必须的,我感觉clocksource倒是可选的,如果没有定义,使用default clocksource,jiffies在timer中断中更新,倒是也可以用。原创 2015-04-03 15:12:14 · 7303 阅读 · 0 评论 -
linux kernel如何处理大端小端字节序
根据之前的理解,字节序可以认为是处理器主观的概念,就像人如何去看待事物一样,处理器分大端和小端,对于内存的读写,只要保证数据类型一致,就不存在字节序的问题。因此我感觉,字节序不同造成的最大差异在于对于寄存器的读写。因为外设寄存器都是小端的(根据kernel代码得出结论,下面还会在详细解释)根据我之前字节序思考的文章,对于寄存器读写差异,有2种方案:(1)从硬件上解决这个问题,对于32位cpu,将32根数据总线反接,但是这样对于寻址小于32位数据可能有问题,并且不能所有模块都反接(如内存),这还涉及到编原创 2015-02-13 10:53:18 · 6882 阅读 · 0 评论 -
linux kernel下输入输出console如何实现
kernel和user空间下都有一个console,关系到kernel下printk的方向和user下printf的方向,实现差别还是很大的。kernel下的console是输入输出设备driver中实现的简单的输出console,只实现write函数,并且是直接输出到设备。user空间下的console,实际就是tty的一个例子,所有操作函数都继承与tty,全功能,可以打开 读写 关闭,所以对于console的读写,都是由kernel的tty层来最终发送到设备。kernel的tty层之下还有ldi原创 2014-11-17 17:02:28 · 31151 阅读 · 7 评论 -
linux kernel的cmdline参数解析原理分析
依据我的思路(时间顺序,如何开始,如何结束),首先看kernel下2种参数的注册。第一种是kernel通用参数,如console=ttyS0,115200 root=/rdinit/init等。这里以console为例。第二种是kernel下各个driver中需要的参数,在写driver中,如果需要一些启动时可变参数。可以在driver最后加入module_param()来注册一个参数,kernel启动时由cmdline指定该参数的值。这里以drivers/usb/gadget/serial.c中原创 2014-11-15 09:43:30 · 48824 阅读 · 3 评论