- 博客(12)
- 资源 (1)
- 收藏
- 关注
转载 Kernel启动流程源码解析 4 start_kernel 上
一 start_kernelstart_kernel函数是kernel启动过程执行的第一个c语言函数,其通过调用一系列初始化函数完成的内核的初始化工作,上篇分析local_irq_enable之前的代码。1.0 start_kernel定义在init/main.c中asmlinkage void __init start_kernel(void){ char * comman...
2019-01-21 11:14:31 455 2
转载 Kernel启动流程源码解析 2 head.S
__cpu_setup。定义kernel\arch\arm64\mm\proc.S中。#define MAIR(attr, mt) ((attr) << ((mt) * 8))/* * __cpu_setup * * Initialise the processor for turning the MMU on. Return in x0 the * ...
2019-01-21 11:10:02 333
转载 Kernel启动流程源码解析 1 head.S
bootloader在跳转到kernel前,需要确保如下设置:MMU = off, D-cache = off, I-cache = on or offx0 = physical address to the FDT blobkernel的入口在arch\arm64\kernel\head.S中。b stext // 跳转到stext stext。ENTRY(stext...
2019-01-21 11:08:55 462
转载 Linux中 probe函数何时调用的
所以的驱动教程上都说:只有设备和驱动的名字匹配,BUS就会调用驱动的probe函数,但是有时我们要看看probe函数里面到底做了什么,还有传递给probe函数的参数我们就不知道在哪定义(反正不是我们在驱动里定义的),如果不知道传递进的参数,去看probe函数总是感觉不求甚解的样子(你对系统不求甚解,系统也会对你的要求不求甚解的),心里对自己写出的程序没底,保不齐那天来个bug,就悲剧了。 ...
2019-01-21 09:47:38 2753 2
转载 Linux内核定时器与延迟工作
内核定时器软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行。实际上,时钟中断处理程序会触发TIMER_SOFTIRQ软中断,运行当前处理器上到期的所有定时器。设备驱动程序如要获得时间信息以及需要定时服务,都可以使用内核定时器。jiffies要说内核定时器,首先就得说说内...
2019-01-16 15:27:15 409
转载 Linux中的kill_async与fasync_helper函数使用
fasync是为了使驱动的读写和应用程序的读写分开,使得应用程序可以在驱动读写的时候去做别的事。应用程序通过fcntl给自己的SIGIO信号安装自己的响应函数,驱动通过kill_fasync(&async, SIGIO, POLL_IN); 发SIGIO信号给应用程序,应用程序就调用自己安装的响应函数去处理。fasync_helper作用就是初始化fasync,包括分配内存和设...
2019-01-16 14:08:53 179
转载 container of()函数简介
在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般人就会绝望了(这一堆都是什么呀? 函数还可以这样定义??? 怎么还有0呢??? 哎,算了,还是放弃吧。。。)。 这就是内核大佬们厉害的地方,随便两行代码就让我们怀疑人生,凡是都需要一个过程,慢慢来吧。 其实,原理很简单: 已知...
2019-01-16 11:51:50 111
转载 Linux驱动头文件说明
#include <linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件。#include <asm/***.h> 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件。#include <mach/***.h> 是在linux-2.6.29/arch/arm/mach-s3c241...
2019-01-16 09:25:14 94
转载 Linux中的File_operations结构体
struct module *owner 第一个 file_operations 成员根本不是一个操作; 它是一个指向拥有这个结构的模块的指针. 这个成员用来在它的操作还在被使用时阻止模块被卸载. 几乎所有时间中, 它被简单初始化为 THIS_MODULE, 一个在 <linux/module.h> 中定义的宏.这个宏比较复杂,在进行简单学习操作的时候,一般初始化为THIS_M...
2019-01-16 09:12:55 144
转载 linux中Oops信息的调试及栈回溯
Oops 信息来源及格式Oops 这个单词含义为“惊讶”,当内核出错时(比如访问非法地址)打印出来的信息被称为 Oops 信息。Oops 信息包含以下几部分内容。1 一段文本描述信息。比如类似“Unable to handle kernel NULL pointer dereference at virtual address 00000000”的信息,它说明了发生的是哪类错误。2 ...
2019-01-16 09:10:52 157
转载 Linux内核工具——ERR_PTR、PTR_ERR、IS_ERR函数
判断返回指针是否错误的内联函数 linux内核中判断返回指针是否错误的内联函数主要有:ERR_PTR、PTR_ERR、IS_ERR和IS_ERR_OR_NULL等。 其源代码见include/linux/err.h#include <linux/compiler.h>#include <linux/types.h>#include <asm/err...
2019-01-15 15:15:02 476
转载 Linux内核工具——kthread_run
上节中,我们成功地编译运行了一个linux模块。可惜的是,它只有两个函数,hello_init在模块加载时调用,hello_exit 在模块卸载时调用。这样下去,模块纵使有天大的本事,也只能压缩在这两个函数中。为了避免这种悲剧发生,本节就来学习一种让模块在加载后能一直运行下去的方法——内核线程。 要创建一个内核线程有许多种方法,我们这里要学的是最简单的一种。打开include/lin...
2019-01-15 15:08:42 1127
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人