摘要:
1 ELF文件结构 图中显示了ELF可重定位文件的构成,ELF文件头的开始16个字节描述了文件中字的大小和字节序(大端模式还是小端模式)。文件头还包含了ELF头的大小,文件类型(可重定位,可执行和共享),机器类型,节头表的位置和大小。节头表中的每项对应于文件中的一个节,用于描述节的位置和大小。 ELF文件头: ELF头对应的代码定义为:#define EI_NIDENT 16typedef struct elf32_hdr{ unsigned char e_ident[EI_NIDENT]; //开始的16个字节 Elf32_Half e_type; //文件类... 阅读全文
摘要:
1 UCOSII定义的关键数据结构 OS_EXTINT8UOSIntNesting; OSIntNesting用于判断当前系统是否正处于中断处理例程中。 OS_EXTINT8UOSPrioCur; OSPrioCur表示当前进程的优先级。 OS_EXTINT8UOSPrioHighRdy; OSPrioHighRdy表示最高优先级任务的优先级。 OS_EXTOS_PRIOOSRdyGrp; OSRdyGrp主要来标记可运行任务优先级除去低位3位或4位后的groupbit位。例如任务的优先级为65(假设超过了系统最大的优先级超过了63,那么OS_PRIO应该有16位),由于超... 阅读全文
摘要:
今天安装win764位的操作系统到vmware虚拟机,以为一切事如此的简单,因为自己以前经常拿vmware来装系统,结果确出现下面莫名其妙的错误: 提示说没有CD-ROM,可是我明明在vmware的CD-ROM里面存放了win7关盘映像的路径,而且在vmware的右下角显示驱动器连上了。到网上找了下有没有这个错误的解决办法,可惜基本没有,有也是不是在vmware中出的错误。 重启了几次还是报同样的错误。不过可以看到下面的画面: 这个图让我坚信CD-ROM应该已经运行了,要不然怎么会出现这个画面呢。点A是出现上面开始的画面,提示NoCD-ROMdrivetouse:GCDROM... 阅读全文
摘要:
我用的是神州三号开发板子,板子的USB模块原理图为: 配置端口G的11号引脚为usb的使能引脚,按理来说应该是开漏输出的(看了很多的修改代码都是这个模式),不过就是不能使能usb,只能配置成推挽的才行,不知道为什么,不知道有没有人知道这个,求解答?GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //是普通的推挽输出,而不是开漏输出GPIO_I... 阅读全文
摘要:
转自:http://blog.chinaunix.net/uid-20696246-id-1892246.html LVM是逻辑卷管理(Logical Volume Manager)的简称,它是建立在物理存储设备之上的一个抽象层,允许你生成逻辑存储卷,与直接使用物理存储在管理上相比,提供了更好灵活性。 LVM将存储虚拟化,使用逻辑卷,你不会受限于物理磁盘的大小,另外,与硬件相关的存储设置被其隐藏,你可以不用停止应用或卸载文件系统来调整卷大小或数据迁移.这样可以减少操作成本.LVM与直接使用物理存储相比,有以下优点:1. 灵活的容量.当使用逻辑卷时,文件系统可以扩展到多个磁盘上,你可以聚合多.. 阅读全文
摘要:
一、为什么要使用模块 由于linux使用的是整体结构,不是模块化的结构,整体结构实现的操作系统可扩展性差。linux为了扩展系统,使用了模块的技术,模块能够从系统中动态装入和卸载,这样使得linux也具有很好的可扩展性。二、linux中哪些代码作为模块实现,哪些直接编译进内核? 当然我们是尽量把代码编译成模块,这样就可以根据需要进行链接,内核的代码量也会少很多。几乎所有的高层组件—文件系统、设备驱动程序、可执行格式、网络层等等—都可以作为模块进行编译。 然而有些代码确必须直接编译进内核。这些代码通常是对数据结构或者函数进行修改。如内核中已经定义好了的数据结构,如果要改变这个数据结构... 阅读全文
摘要:
一、为什么需要异常表? 处于内核态的程序有下面四种情况会产生缺页异常: 1、内核试图访问属于进程地址空间的页,但是,该页对应的页框不存在或者内核试图去访问一个只读的页,分别对应“请求调页”和“写时复制”两种情况。 2、内核寻址到属于内核地址空间的页,但是相应的页表项没有被初始化,这个对应“非连续内存区访问”。 3、内核代码包含编程错误,函数执行产生异常,这是一个内核漏洞。 4、系统调用服务例程试图读写一个内存区,而该内存区的地址是通过系统调用参数传递过来的,但确不属于进程的地址空间。 前面两种情况缺页异常处理程序很容易识别出来,但是后面两种情况却比较难区分。为了识别出后面的两种情况... 阅读全文
摘要:
为什么要使用bootmem分配器,内存管理不是有buddy系统和slab分配器吗?由于在系统初始化的时候需要执行一些内存管理,内存分配的任务,这个时候buddy系统,slab分配器等并没有被初始化好,此时就引入了一种内存管理器bootmem分配器在系统初始化的时候进行内存管理与分配,当buddy系统和slab分配器初始化好后,在mem_init()中对bootmem分配器进行释放,内存管理与分配由buddy系统,slab分配器等进行接管。 bootmem分配器使用一个bitmap来标记物理页是否被占用,分配的时候按照第一适应的原则,从bitmap中进行查找,如果这位为1,表示已经被占用... 阅读全文
摘要:
一、总体思路 使用端口GPIOA来连接电机,所以给GPIOA编程就可以控制电机。使用系统时钟SysTick来周期性的给电机发送脉冲。用四个按钮来控制需要发送脉冲的个数,每个按钮被按下就设置给电机发送脉冲的个数,如果上一次给电机发送的脉冲没有发送完成,这次按钮发送的脉冲将不被响应。二、GPIOA端口的设置 由于需要控制两个电机,所以将GPIOA端口的1,2,3号引脚与电机0相连(分别控制电机的使能,旋转方向和脉冲),GPIOA的4,5,6号引脚与电机1相连。具体对端口的初始化代码为:GPIO_InitTypeDef GPIO_InitStruct; //开启电机0外设时钟DJ_Enab... 阅读全文
摘要:
一、linux中的每cpu变量 看linux内核代码的时候,会发现大量的per_cpu(name, cpu),get_cpu_var(name)等出现cpu字眼的语句。从语句的意思可以看出是要使用与当前cpu相关的一个变量,不过查看这个变量的定义,总是有这样一个宏:DEFINE_PER_CPU(type, name),将这个宏展开成下面的语句: __attribute__((__section... 阅读全文