- 博客(49)
- 资源 (2)
- 收藏
- 关注
原创 中断处理(1)
一、中断处理的机制和注意事项 首先要注意:从本质上讲,中断处理程序和其它代码并发运行,这就会不可避免的引起一些并发问题。由于中断执行是异步的,而且是在非抢占式内核中打断当前运行内核代码的唯一方法,所以中断是可以和其它内核代码并发执行的。因此如果中断操作和被中断的内核代码访问同样的内核数据,就会发生竞争。Linux中的中断处理程序是不需要重入的。当一个给定的中断处理程序正在
2013-12-21 13:15:16
2222
原创 struct file_operations
ssize_t (*read) (struct file *file, char __user * buf, size_t count, loff_t *pos); 功能:从内核空间读取数据到用户空间 参数: file: 存放open打开文件时生成的file指针
2013-12-21 13:12:15
1386
原创 字符设备常用函数
一、数据拷贝#includestatic unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) 功能:从内核空间拷贝数据到用户空间 参数: to: 要复制到用户空间的地址
2013-12-21 13:10:47
1015
原创 阻塞型IO(等待队列)
如何在驱动程序中实现一个阻塞型IO,等待队列就是最常用的方法。 对于一个阻塞操作来说,我们的驱动程序应该阻塞该进程,将其置入休眠状态直到请求可继续。一、休眠的简单介绍 当一个进程被置为睡眠,它被标识为处于一个特殊的状态并且从调度器的运行队列中去除。直到发生某些情况下改变了这个状态, 进程将才会在任意 CPU 上调度,,即运行该进程。 休眠中的进程
2013-12-21 13:10:09
2120
原创 字符设备驱动
一、设备分类按设备访问方式(特点):1、字符设备:鼠标,键盘,串口,帧缓存 特点:以字节为单位访问,通常只支持顺序访问,无缓冲存2、块设备:磁盘,光驱,flash 特点:以固定大小为单位访问,支持随机访问,有缓存,不直接和VFS交互3、网络设备: 特点:无设备节点,通过套接字访问设备设备号
2013-12-21 13:09:09
1059
原创 内核模块
一、模块程序结构: 1、模块许可声明 MODULE_LICENSE("GPL") 如果没有模块许可声明,加载内核时,会发出抱怨。另外,很多内核函数只有遵循了GPL许可协议才能被调用。另外还有Dual BSD许可等。 2、加载函数 缺省使用 int init_module(void)
2013-12-21 13:06:32
1080
原创 busybox分析
busybox其中集成了所有的shell命令,在命令行执行各种命令其实就是执行busybox应用程序。Linux启动时,一般首先执行sbin/init程序,init的主要任务就是:读取配置文件->解析配置文件->执行配置文件。在busybox源码中的init/init.c中就是init程序的源码,执行流程如下:1、init_main -> parse_ini
2013-12-21 12:08:31
1791
原创 Linux启动过程分析(head.s)
/********判断内核是否支持硬件并启动MMU************/ bl __lookup_processor_type //查找CPU类型,判断是否支持这个CPU movs r10, r5 beq __
2013-12-21 12:07:37
2102
原创 Liuux之Makefile分析
顶层Makefile:一、编译前需要配置内核默认配置文件在arch/体系架构/config/目录下。如arch/arm/config/make xxx_defconfig 使用默认配置 这时默认配置文件中的内容会被写到顶层目录下的.config文件中,.config文件才是后面配置内核时要使用的文件make menuconfig 菜单项配置, 读取.
2013-12-21 12:06:55
1118
原创 UBOOT之board.c分析(四)
/************使能中断**********************/enable_interrupts ();enable_interrupts 函数在lib_arm/interrupts.c中定义:/* enable IRQ interrupts */void enable_interrupts (void){unsigned long temp;
2013-12-21 12:05:43
1298
原创 UBOOT之board.c分析(三)
/***************初始化输入输出***********************/gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr"); //获取环境变量ip地址stdio_init ();/* get the devices list going. */ //标准输入输出的初始化
2013-12-21 12:04:58
2613
原创 UBOOT之board.c分析(二)
/******初始化malloc空间,将其清零*******/mem_malloc_init (_armboot_start - CONFIG_SYS_MALLOC_LEN,CONFIG_SYS_MALLOC_LEN);/******打印nand信息*******/#if defined(CONFIG_CMD_NAND)puts ("NAND: ");
2013-12-21 12:04:01
2190
原创 UBOOT之board.c分析(一)
############board.c在文件夹lib_arm中##################gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t)); 为全局变量gd_t结构体指定起始地址,变量gd在include/asm-arm/global_data.h中定义: #define
2013-12-21 12:02:11
4780
原创 UBOOT之main.c分析
main.c这个文件在common/main.c中定义/*******设置环境变量ver**************/#ifdef CONFIG_VERSION_VARIABLE{extern char version_string[ ];setenv ("ver", version_string); //设置环境变量ver的值}#endi
2013-12-21 11:59:55
4868
原创 UBOOT之start.s分析
/********************设置处理器模式****************************************/reset:/* * set the cpu to SVC32 mode */mrs r0, cpsrbic r0, r0, #0x1forr r0, r0, #0xd3msr cpsr,r0
2013-12-21 11:57:41
2842
原创 ARM异常中断
一、ARM中异常中断的类型:异常中断名称含义复位(Reset)当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面几种情况:1、系统加电时2、系统复位时3、跳转到复位中断向量处执行,称为软复位未定义的指令当ARM处理器或者是系统中协处理
2013-12-21 11:43:50
5090
原创 ARM汇编语言编码
(1)数据处理指令的编码格式cond: 指令的条件码I: 用于区别operand2是立即数(I=1)还是寄存器(I=0)opcode:指令操作码S: 操作是否影响cpsr,S=0不影响,S=1影响Rn: 包含第一个操作数的寄存器编码Rd: 目标寄存器编码operand2:第二操作数,有三种方式
2013-12-21 11:39:48
3209
1
原创 ARM汇编语言
ARM的条件码域大部分ARM指令都可以条件执行,也就是根据CPSR中的条件标志位决定是否执行该指令。当条件满足时执行,当条件不满足时该指令被当做一条NOP指令。(一)跳转指令B 跳转指令BL 保存返回地址的跳转指令BX 带状态切换的跳转指令BLX 保存返回地址和状态切换的跳转指令B、BL和BLX(1)后
2013-12-21 11:20:52
3554
原创 ARM处理器模式及寄存器
一、ARM处理器模式:ARM微处理器支持7种运行模式,分别为:用户模式(usr): ARM处理器正常的程序执行状态。快速中断模式(fiq):用于高速数据传输或通道处理。外部中断模式(irq):用于通用的中断处理。管理模式(svc): 操作系统使用的保护模式。软中断和复位数据访问中止模式(abt)
2013-12-21 11:12:38
3665
原创 线程属性
线程的属性由pthread_attr_t结构类型表示。 在使用pthread_attr_t之前,需要调用pthread_attr_init对其初始化。pthread_attr_init为pthread_attr_t结构里面的各个属性设置默认值。程序可以修改这些值,定制线程的各个属性。在使用完pthread_attr_t后,需要调用pthread_attr_destroy,完成一些清理工作。
2013-12-21 11:07:21
1046
原创 ARM存储管理系统MMU
一、虚拟地址和物理地址的区别 CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分。如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,CPU在访问内存时发出的地址将直接传送到地址总线上,使具有相同地址的物理存储器被读写。这称为物理地址(Physical Address,以下简称PA),如下图所示:
2013-10-30 18:09:40
8238
转载 ARM的快速上下文切换(FCSE)
一、FCSE的原理 通常情况下,如果两个进程占用的虚拟地址空间由重叠,系统在这两个进程之间进行切换时,必须进行虚拟地址到物理地址的重映射。而虚拟地址到物理地址的重映射涉及到重建MMU中的页表,而且cache 及TLB中的内容都必须使无效(通过设置协处理器寄存器的相关位)。这些操作将带类巨大的系统开销,一方面重建MMU和使无效cache及TLB的内容需要很大的开销,另一方面重建cach
2013-10-27 14:05:20
3313
原创 ARM的cache和写缓冲器(write buffer)
一、cache简介 通常CPU与外部主存之间的访问速度差距很大,因为外部主存的低速率读写而降低了CPU的执行效率,所以引入了高速缓冲存储器cache,cache存储器是一种容量小,速度快的存储器。其实cache说到底就是一块速度非常快的内存。 而cache经常与写缓冲器(write buffer)一起使用,使用writer buffer的目的是,将处理器和cac
2013-10-27 14:02:47
15697
2
原创 ARM协处理器CP15寄存器详解
用于系统存储管理的协处理器CP15MCR{cond} coproc,opcode1,Rd,CRn,CRm,opcode2MRC {cond} coproc,opcode1,Rd,CRn,CRm,opcode2coproc 指令操作的协处理器名.标准名为pn,n,为0~15 opcode1 协处理器的特定操作码. 对于CP15寄存器
2013-10-27 13:56:46
22056
4
原创 ARM内联汇编
首先,让我们来共同了解一下 GCC 内联汇编的一般格式:asm(代码列表: 输出运算符列表: 输入运算符列表: 被更改资源列表);在代码列表中,每个汇编语句都要用" "括起来。例:asm("add %0,%1,%2\n\t""mov r1,%1\n\t":"+r"(sum):"r"(a),"r"(b)
2013-10-27 13:53:45
3469
原创 Cortex-A相对经典ARM处理器的扩展
(一)Cortex-A多了一种工作模式:monitor1. usr 用户模式: 非特权模式,大部分应用程序运行在这个模式下2. fiq 快中断模式: 高优先级的中断3. irq 普通中断模式: 低优先级的中断4. svc 超级用户模式(管理模式): 软中断和复位5. abort 中止模式:
2013-10-27 13:53:14
2342
转载 ARM链接脚本
1. 概论 每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的段放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情.连接器有个默认的内置连接脚本, 可用ld –verbose查看. 连接选项-r和-N可以影响默认的连接脚本(如何影响?)
2013-10-27 13:49:57
2069
原创 ARM伪指令和伪操作
(一)GNU汇编书写格式注释符:@和#语句分离符: ;立即数前缀: #或$段内标号的地址值在汇编时确定段外标号的地址值在连接时确定局部标号:主要在局部范围内使用而且局部标号可以重复出现。它由两部分组成,开头是一个直接的数字局部标号,如99,后面加 ‘ : ’,如 66:在跳转时,根据所加后缀不一样,跳转方向不一样。1. f代码地
2013-10-27 13:48:07
5279
原创 线程属性
线程的属性由pthread_attr_t结构类型表示。 在使用pthread_attr_t之前,需要调用pthread_attr_init对其初始化。pthread_attr_init为pthread_attr_t结构里面的各个属性设置默认值。程序可以修改这些值,定制线程的各个属性。在使用完pthread_attr_t后,需要调用pthread_attr_destroy,完成一些清理工作。
2013-10-27 13:46:13
818
原创 线程的互斥
一、互斥量: 保证同一时间只有一个线程访问数据,在线程访问数据前先对数据加锁,这样数据只能为该线程所用,其他试图对数据加锁的线程将被阻塞直到当前线程释放对该数据的锁。 如果释放互斥锁时,有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变成运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去再次等待它重新变为可用
2013-10-27 13:44:43
923
原创 线程
一、线程概念 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(use
2013-10-27 13:42:33
1781
原创 高级IO
几种IO模型优缺点:阻塞型:当资源临时不可获得时,调用者进程阻塞等待。节省系统资源,运行效率低。非阻塞型(轮询):当资源不可获得时,系统调用出错返回,影响浪费系统资源,运行效率高。多路IO复用型:既节省系统资源,服务效率又高异步IO: 信号驱动IO:在不干扰主进程运行的情况下实现异步访问IO;
2013-10-27 13:35:23
1002
原创 标准IO
一、关于标准IO缓冲区标准IO提供缓冲的目的是尽可能减少使用read和write调用的此数,他对每个IO流自动地进行缓冲管理。标准IO提供三种类型的缓冲:1、全缓冲:这种情况下,当标准IO缓冲区填满后才进行实际IO操作。在一个流上执行第一次IO时,相关标准IO函数通常调用malloc获得所需的缓冲区。全缓冲的缓冲区大小一般为8192(具体要看设置)2、行缓冲:当输入和输出中遇到
2013-10-27 13:31:37
1119
原创 IP地址详解
一、IP地址概念 IP地址就是给每个连在Internet网的主机分配一个在全世界范围内唯一的标示符。IP地址(英语:Internet Protocol Address)是一种在Internet上的给主机编址的方式,也称为网际协议地址。常见的IP地址,分为IPv4与IPv6两大类。 在 TCP/IP协议中,IP地址是以二进制数字形式出现的,共32bit
2013-10-27 13:29:59
2276
原创 网络编程函数
一、网络字节序 网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。 主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序 这个叫做主机序。 由于每一
2013-10-27 13:28:14
1012
原创 广播和组播
一、广播1、受限广播 限制广播地址(255.255.255.255)。对本机来说,这个地址指本网段内(同一广播域)的所有主机(可能由于实现而不同)。这个地址不能被路由器转发。可以进行广域网传输,但一般会被阻止。2、子网广播当主机号全为1时为广播地址,它代表了网络全部的主机。网络号是网段中的第一个地址,广播地址是网段中的最后一个地址,这两个地址是不能配置在计算
2013-10-27 13:26:19
2236
转载 僵尸进程
1. 产生原因: 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。通过ps命令查看其带有defunct的标志。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。
2013-10-27 13:25:00
779
转载 进程状态及转换关系
一个进程在其生存期内,可处于一组不同的状态下,称为进程状态,如图所示。进程状态保存在进程任务结构的state字段中。当进程正在等待 系统中的资源而处于等待状态时,则称其处于睡眠等待状态。在Linux系统中,睡眠等待状态分为可中断的和不可中断的等待状态。 进程状态及转换关系(1) 运行状态(TASK_RUNNING):当进程正在被CPU执行,或已经准备就绪随时可由调度程序
2013-10-27 13:24:02
2609
原创 环境表
environ环境指针指向环境表,是一个全局变量,称为环境指针,其指向的数组称为环境数组。使用时需用extern声明例程:#include #include #include extern char **environ;int main(){int index;for (index = 0; NULL != environ[ind
2013-10-27 13:19:47
871
原创 exec函数族
用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其 main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。有六种不同的exec函数可供使用,它们常常被统称为exec函数。这些exec函数都是UNIX进程控制函
2013-10-27 13:17:09
1097
Android技术内幕:系统卷.pdf 详细书签
2013-11-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人