- 博客(38)
- 资源 (2)
- 收藏
- 关注
原创 分析system_call中断处理过程
用gdb追踪系统mkdir执行系统调用的过程,并分析system_call的中断处理过程。首先应当将有关mkdir代码载入menu中,重新装载menu:之后打开test.c文件,在其中加入调用mkdir函数的定义。执行make rootfs,从而打开menu镜像,我们发现mkdir就装载进menu的命令中了:然后我们用gdb在sys_
2015-04-07 09:21:49 811
转载 float与double的范围和精度
float与double的范围和精度1. 范围 float和double的范围是由指数的位数来决定的。 float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 23bits(尾数位) double: 1bit(符号位) 11bits(指数位) 52bits(尾数位) 于是,flo
2015-04-04 13:35:25 506
转载 C语言中 float double在内存中的存储
本文转载于:http://wenku.baidu.com/link?url=ARfMiXVHCwCZJcqfA1gfeVkMOj9RkLlR9fIexbgs9gDdV8rIS48A1_xe1y6YgXnSlpof5pKKJbjScy1StbVdiUWARuAYUIYiyHeTIIhVaz3 C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,floa
2015-04-04 00:28:05 931
原创 Linux系统调用程序分析
当用户态进程调用一个系统调用时,CPU切换为内核态,并开始执行一个内核函数;在Linux中是通过执行int $0x80来执行系统调用,这条汇编指令产生向量为128的编程异常。内核实现了很多不同的系统调用,进程需要指明系统调用号作为参数进行调用,使用eax寄存器。
2015-03-25 20:40:22 743
转载 系统调用号列表
(1)系统调用号的定义在 /usr/include/asm/unistd.h 文件中 (2)2.6.16的定义如下所示: #define __NR_restart_syscall 0 #define __NR_exit 1 #define __NR_fork 2 #define __NR_read 3 #define __NR_write 4 #define __NR_
2015-03-24 09:18:30 1283
转载 用户态和内核态的概念区别
究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子:1)例子C代码1. void testfork(){ 2. if(0 = = fork()){ 3. printf(“create new process su
2015-03-24 09:11:21 435
原创 start_kernel分析
start_kernel是linux内核的入口函数,定义在init/main.c里面。start_kernel里面包含了一系列的初始化代码。asmlinkage void __init start_kernel(void){ char * command_line; extern const struct kernel_param __start___param[],
2015-03-17 23:22:06 973
转载 Linux内核中的init_task进程和idle进程
当Power on PC时,BIOS的代码开始执行,然后是Linux初始化的代码,这其中大约很长一段时间Linux都没有进程这一概念,但是这不影响CPU执行它的二进制代码。如果不是多任务以及进程调度的需要,Linux内核可以一直这样走下去。但是因为多任务的需求,Linux必须能支持任务这一特性,任务即进程,或者更简单地说由task_struct对象实例所代表的一段代码的集合,用以完成特定的任务
2015-03-17 23:12:05 618
转载 Linux启动过程概述(X86)
x86 CPU启动的第一个动作CS:EIP=FFFF:0000H(换算为物理地址为000FFFF0H,因为16位CPU有20根地址线),即BIOS程序的位置。http://wenku.baidu.com/view/4e5c49eb172ded630b1cb699.htmlBIOS例行程序检测完硬件并完成相应的初始化之后就会寻找可引导介质,找到后把引导程序加载到指定内存区域后,就把控制权
2015-03-17 23:04:49 890
转载 构造一个简单的Linux系统MenuOS,使用gdb调试内核
使用自己的Linux系统环境搭建MenuOS的过程# 下载内核源代码编译内核cd ~/LinuxKernel/wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xzxz -d linux-3.18.6.tar.xztar -xvf linux-3.18.6.tarcd
2015-03-17 23:01:41 713
原创 一个简单的时间片轮转多道程序内核操作系统工作流程
一.操作系统工作概述存储程序计算机工作模型,计算机系统最最基础性的逻辑结构;函数调用堆栈,高级语言得以运行的基础;中断,多道程序操作系统的基点。二.代码分析在上一篇博文《搭建OS kernel环境方法》的基础上进行时间片轮转多道程序的小os.主要对mypcb.h, mymain.c 和myinterrupt.c这三个文件
2015-03-15 17:03:55 937
转载 搭建OS kernel环境方法
It is a platform to write your own OS kernel,its based on Linux Kernel 3.9.4 source code.Set up this platformsudo apt-get install qemu # install QEMUsudo ln -s /usr/bin/qemu-system-i386 /usr
2015-03-14 11:20:50 1914
转载 使用core dump调试方法
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)在程序运行的过程中,有的时候我们会遇到Segment fault(段错误)这样的错误。这种看起来比较困难,因为没有任何的栈、trace信息输出。该种类
2015-03-14 11:07:44 819
转载 C语言嵌入汇编
概述:linux内核源码中,有很多C语言中嵌入了汇编语句,如何理解这些汇编语句,对理解内核有很重要的作用。 具有输入和输出参数的嵌入式汇编语句的基本格式为: asm("汇编语句" :输出寄存器 :输入寄存器
2015-03-12 21:10:48 1685
转载 VxWorks认识
VxWorks操作系统 VxWorks时实时多任务的嵌入式操作系统,它主要包括任务调度、I/O功能、文件系统、中断管理、内存管理、网络功能、内存管理、BSP(系统启动模块)等。它的多任务的实现是由中断驱动的,即在每个系统时钟中断中,实现任务的调度。VxWorks中的任务有优先级的概念。与其它嵌入式操作系统相比,它有如下优点:1. 任务之间的切换快,任务间通信手段多样;2.
2015-03-09 10:09:25 4690
原创 反汇编代码分析
C代码:int g(int x){ return x + 3;} int f(int x){ return g(x);} int main(void){ return f(8) + 1;}对应的汇编:g:pushl%ebp ;12.esp-4,[esp的指向放入ebp]movl %esp, %ebp ;
2015-03-08 13:33:43 635
转载 从Tornado到Workbench新一代嵌入式软件集成开发环境
从Tornado到Workbench——风河公司的新一代嵌入式软件集成开发环境康宇峰 风河公司应用工程师1.嵌入式系统开发所面临的问题 嵌入式软件开发有别于桌面软件系统开发的一个显著的特点是它一般需要一个交叉编译和调试环境,即编辑和编译软件在主机上进行(如在PC机的Windows操作系统下),编译好的软件需要下载到目标机上运行(如在一个PPC的目标机上的VxWor
2015-03-06 09:34:23 5378
原创 软件开发流程
计划:*估计这个任务需要多少时间开发:*分析需求*生产设计文档*设计复审*代码规范*具体设计*具体编码*代码复审*测试记录用时测试报告计算工作量事后总结提出过程改进计划
2015-03-03 09:30:23 784
转载 Linux的NAT即时生效问题
引:超长的前言Linux的NAT不能及时生效,因为它是基于ip_conntrack的,如果在NAT的iptables规则添加之前,此流的数据包已经绑定了一个ip_conntrack,那么该NAT规则就不会生效,直到此ip_conntrack过期,如果一直有数据在鲁莽地尝试传输,那么就会陷入僵持状态。 在Linux系统中,ip_conntrack创建成功是按照一个流的头包是否成功
2015-02-18 17:36:47 1045
转载 linux 下gprof 和 oprofile 分析程序性能工具
有些时候,我们特别关注程序的性能,特别是底层软件,比如驱动程序,OS等。为了更好的优化程序性能,我们必须找到性能瓶颈点,“好钢用在刀刃上”才能取 得好的效果,否则可能白做工作。为了找到关键路径,我们可以使用profilng技术,在linux平台上,我们可以使用gprof和oprofile工 具。gprof是GNU工具之一,它在编译的时候在每个函数的出入口加入了profiling的代码,运行
2015-02-18 17:12:02 926
转载 临界区,互斥量,信号量,事件的区别
四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 3、信号量:为控制一个具有有限数量用户资源而设计。 4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 临界区(Critical Section)保证在某一
2015-02-18 15:34:38 473
转载 网络性能测试iperf
iperf 是一个 TCP/IP 和 UDP/IP 的性能测量工具,能够提供网络吞吐率信息,以及震动、丢包率、最大段和最大传输单元大小等统计信息;从而能够帮助我们测试网络性能,定位网络瓶颈。iperf是开源的,源代码可以从http://sourceforge.net/projects/iperf/下载。1. iperf能够做什么提起iperf,想必大家都知道它是用
2015-02-14 12:57:42 1014
转载 32位和64位系统中数据类型区别
c语言中基本数据类型的长度:32位下:char :1个字节(不变)*(指针变量): 4个字节(32位机的寻址空间是4个字节。同理64位编译器)(变化)short int : 2个字节(不变)int: 4个字节(不变)unsigned int : 4个字节(不变)float: 4个字节(不变)double: 8个字节(不变)
2015-02-10 08:45:02 1768
原创 数组指针malloc空间问题
int (*p)[10]这是数组指针,指针的类型为(*)[10],即指针指向的类型为10个元素的整形数组。错误:p = (int*) malloc(10*sizeof(int));这里说明p的类型为一个整型 int *。显然类型不匹配!正确:int (*p)[10];p = (int (*)[10]) malloc(10*sizeof(int));扩
2015-02-06 19:27:08 1973 1
原创 尽量使用strncpy,snprintf,少用strcpy,sprintf
strncpy,snprintf函数的好处是指定了要拷贝/存储的空间大小,而strcpy,sprintf并没有指定。后者导致的结果是,如果dest的空间不够大,会出现内存溢出的情况,覆盖原有内存的数据,这种情况在linux内核的开发情况更为明显。因此,多采用strncpy,snprintf函数。
2015-02-04 22:16:21 691
转载 linux内核中memcpy和memmove函数的区别和实现
linux内核中memcpy和memmove函数的区别和实现Kernel version:2.6.32CPU architecture:ARMAuthor:ce123(http://blog.csdn.net/ce123)嵌入式开发交流群:280352802,欢迎您的加入!memcp
2015-02-04 21:55:20 798
原创 memcpy使用注意事项
memcpy函数原型为:void *memcpy(void *dest, const void *src, size_t n)memcpy用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。在c中,很多时候都要用到这个函数,这是一个高效的函数。在使用的时候有几点需要注意:1、如果复制的字节数n超出了dest的空间容量,或者n超出src的容量,这个函数是不会进行
2015-02-04 21:54:02 7520
原创 Linux延迟函数
从Linux应用层和内核两方面来区分下延迟函数:1. 应用层 1> sleep usleep 微秒级 头文件为;3> nanosleep 相比标准UNIX 的sleep 调用具有更高高精度的版本。和普通的sleep 调用计算整秒数不同,nanosleep 接受一个指向一个struct timespec 对象的指针作为参数,它可以表示毫微秒(nanoseco
2015-02-03 17:47:37 958
原创 嵌入式协议栈开发问题【软定时器实现】
嵌入式开发中,硬件定时器资源通常非常有限,而协议栈中需要的定时功能会比较多,下面简单介绍下自己的想法:背景:利用MCU的一个定时器,模拟出多个软件定时器。1> 全局结构体用于存储软件定时的参数,如当前时间,定时时间,触发时间,函数指针等;2> 软定时器设置入口函数,传入要定时的时间与回调函数;3> 软定时器设置入口函数中,对各个配置的触发时间进行优先级排序,最先触发的优先级
2015-02-03 15:23:37 695
原创 嵌入式协议栈开发问题【malloc函数实现】
1. malloc函数实现1> 首先定义个全局的数组,并将数据进行分块,大块和小块,目的的解决碎片问题。2> 根据申请的空间大小不同,选取不同的数据块作为内存。3> 定义一个全局标量,用于记录那个块已用,哪个块为空闲。4> 针对申请的每块内存空间,都有独立的结构体记录重要参数:如空间大小,指向的空间指针等。暂时就想到这些,不知道哪位哪位有更好的想法,互相学习讨论。
2015-02-03 15:02:26 663
原创 日期和时间函数
函数说明asctime()将时间日期以字符串格式表示ctime()将时间日期以字符串格式表示gettimeofday()获取当前时间(由秒和微秒组成)gmtime()获取当前时间和日期localtime()获取当前时间和日期并转换为本地时间mktime()将时间转换成经过的秒数set
2015-02-02 10:01:07 588
转载 程序员必须知道的10大基础实用算法及其讲解
算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序使用分治法(Divide and conquer)策
2015-01-31 23:49:20 612
转载 递归与迭代的区别
递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.使用递归要注意的有两点:1)递归就是在过程或函数里面调用自身;2)在使用递归时,必须有一个明确的递归结束条件
2015-01-31 23:34:03 689
原创 fopen、open和popen区别
open:直接操作物理设备,比如磁盘、设备文件 一般设备/设备文件都通过open来操作 fopen:则通过缓冲区来操作,读写都在缓冲区上 popen:会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令 依照popen参数中的type值建立管道连接到子进程的输入/输出设备中,通过返回的指针对子进程 的输入、输出设备进行操作。
2015-01-28 10:11:32 10935
转载 对于Freescale MFG编程工具控制文件ucl.xml的分析
为了将映像文件烧进NANDFlash中,我必须要分析ucl.xml文件,并能自己照着画一个符合项目要求的。唉。分析的时候需要参考MFG的工具提供的Document:《Manufacturing Tool UCL usermanual.doc》找到这一条,开始分析了: 首先有一段注释意思是:该条目用于将Android编程到eMMC4.4存储设备上。如果使用默认设置
2015-01-27 21:57:23 670
转载 Register和volatile区别
原文:http://blog.csdn.net/edmond999/article/details/8924664register: 在函数内部定义变量时,默认是auto类型,即分配给变量内存。如果定义一个变量用register关键字,那么编译器尽可能把变量存放在CPU内部寄存器中,这样就不必通过内存寻址来访问变量,提高访问效率 volatile:
2015-01-27 21:31:42 901
转载 数组名和数组名取地址的区别
转自:http://blog.csdn.net/daniel_ice/article/details/6857019以下代码会打印出什么样的日志呢?[cpp] view plaincopy#include int a[2] = {1,2}; int main(){ printf("a = %p\
2015-01-25 14:28:47 561
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人