- 博客(201)
- 收藏
- 关注
原创 ARM处理器工作模式学习
ARM处理共有七种工作模式:1. 用户模式(usr,User Mode),这是ARM正常的程序执行状态;2. 快速中断模式(fiq,Fast IRQ),当触发快速中断时进入该模式;3. 中断模式(irq),当产生外部中断时进入该模式;4. 管理模式(svc),这是操作系统使用的保护模式;5. 数据访问终止模式(abt, Abort Mode),当数据或指令预取终止时进入该模式;
2014-04-20 14:55:35
605
原创 ELF学习
ELF是Executable and Linkable Format的缩写,它是一种对可执行文件、目标文件和库文件使用的文件格式。从源代码到形成最终的目标文件,这个过程是由编译器帮助完成的;编译器还"偷偷"增加了很多额外的代码,来完成参数入栈、保存函数返回地址等等很多工作,这样使得最终的程序得以正常的运行。对于库文件和最终的可执行文件,其ELF格式可能会略有不同,不过也都差不多。
2014-04-19 14:23:36
597
原创 关于条件变量的学习
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"田间变量的条件成立"而挂起;另一个线程使"条件成立"。条件变量通常是和互斥锁一起使用。如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁;如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。条件变量通常用于线程间的同
2014-04-17 18:15:35
445
原创 ARM/linux异常abort学习
ARM定义了有七种异常,当有异常发生时,ARM会根据异常的类型自动执行异常向量表中的指令。这几种异常具体如下:reset SVC +0x00undefine UND +0x04SWI SVC +0x08prefetch ABT +0x0cdata abort ABT +0x10IRQ IRQ +0x18FIQ
2014-04-15 18:26:26
1943
原创 关于信号量的学习和理解
在下面这篇博文中学习了race condition,http://blog.csdn.net/boyxulin1986/article/details/11704257也即如果是要被多个thread共享的共享资源,那么必须要有信号量来保护共享资源,以免多个thread同时访问导致的程序出错。至于是使用互斥锁还是读写锁还是什么锁,根据需要而定即可。但是锁用多了就有可能发生死锁。
2014-04-13 15:32:31
474
原创 c语言学习小结
语言本身只不过是一个工具,写出高质量的软件不光是要了解语言本身,更要对软件工程、数据结构、操作系统等有所了解。1. 要避免潜在的隐式类型转换。在做算术运算时变量的数据类型要一致,如果既有有符号型变量也有无符号型变量那么有符号型负数会隐式转换为大正数;2. 函数和变量要保证定义和声明的一致性,这样可以消除编译器编译代码时发出的警告同时能够提高软件的可移植性;3. Char *
2014-04-12 15:19:35
744
原创 linux IPC机制之msg q学习
回顾一下,linux系统的IPC机制有:pipe/FIFO/signal/temp file/semaphore/shared memeory以及message queue等。本文要讲的是其中的一种IPC机制:message queue。message queue就是两个进程之间创建的一个消息队列用于发送和接受消息。发送者和接收者通过message queue通信时,无需同时运行。
2014-04-08 18:12:10
587
原创 程序设计中常用的几种图
使用图表可以简单直观简洁的表达一件事。在程序设计中,更是有一幅图能够替代千言万语的作用。这里就简单介绍一些程序设计中经常需要画的几类图。1. 模块图对一个大的程序或软件按照功能进行划分,这样可以从宏观上很直观的看到程序是由哪些模块组成的。2. 状态图表达的是程序或程序内的模块的一种状态转换关系。通过该图可以清楚的看到程序的生命周期。3. 程序流程图使用流程图
2014-04-08 18:09:06
3392
原创 关于debug level的学习
debug level就是在代码中增加的一些日志信息,其目的是为了debug。既然是代码中增加的日志信息,那为何还要debug level呢?直接使用printf输出不行吗?因为如果将所有的日志信息都打印出来,那必须会极大的降低程序的执行效率。log level该如何定义?像linux printk就定义了8个级别的log level:#define KERN_EMERG ""
2014-03-23 15:06:48
3835
原创 how to tracking?
如何track这个task or project的进度?1. 如果task涉及的人比较多,需要将每个人要做的事详细的列出来,可以以excel表格的形式;2. 对于task的整个状况,要做到实时更新并对那些快速完成的同事表达感谢之意;3. 在deadline快到时,再次提醒那些尚未完成的同事;4. 在到deadline时,要再次询问那些尚未完成的同事;5. 如果task已经del
2014-03-23 14:36:05
430
原创 项目进度的meeting minutes的格式
项目确定下来之后,就会有schedule。有了schedule,就需要周期性(比如一周或两周)的去review schedule的进度。这个review的结果就叫做meeting minutes,也即会议记录。meeting minutes的格式通常是:1. 会议名称2. 会议时间3. 会议地点4. 参会人员5. 项目当前的进度(progress)6. 行动项目
2014-03-22 19:49:34
7070
原创 同样的source code,为什么strip symbol跟not strip symbol编译出来的目标文件的大小会差很大?
接上一篇的学习,http://blog.csdn.net/boyxulin1986/article/details/21788873为什么最终编译出来的目标文件的大小会差很多?1. 使用strip命令可以将debug symbol从目标文件(.o/.so/.ko或者是可执行文件)中去除掉。使用同一份源文件,编译两份目标文件出来:一份是使用strip去除debug符号的目标文件s
2014-03-22 17:29:40
1094
原创 linux size命令学习
接上一篇对linux C程序内存布局的学习,http://blog.csdn.net/boyxulin1986/article/details/21785675本篇学习size命令。size命令用来列出目标文件包括.o/.so/.ko以及可执行文件中的各个段包括text section/data section以及bss section的大小及总的大小。这个命令有时候对分析问题
2014-03-22 12:21:29
1136
原创 linux内存布局学习
linux系统中的进程总是以为自己是唯一的,那进程是如何被映射到内存中的呢?接上一篇的学习,那代码段、数据段、堆、栈它们在内存中是如何分布的呢?http://blog.csdn.net/boyxulin1986/article/details/21548625以前总是觉得这些东西太高深,可望而不可及;从现在开始,让我们慢慢揭开这神秘的面纱。典型的linux C程序内存布局,从低
2014-03-22 11:24:14
661
原创 linux符号学习
有时候很想知道某个具体的符号是哪种类型的符号,未初始化的全局数据?已经初始化的全局数据?还是代码段?使用nm命令可以列出符号、符号类型以及符号的绝对地址之间的对应关系。nm可以列出main(可能是一个目标文件、或者是共享库文件或者是一个可执行文件等)中的符号对应关系。sh-# nm -s main查看nm命令的man手册,可以知道一些我们常见的符号的符号类型的含义:"B"
2014-03-19 18:19:00
405
原创 频繁的读磁盘导致的系统效率急剧下降的问题分析
背景:程序的执行需要依赖于预存在ROM中一个字节的值;程序在运行时在某种情况下会频繁的去读取这个值;这直接导致程序运行效率急剧下降,简单的讲就是程序响应太慢。static void _get_value(int * pvalue){ /* read the data from rom */ readvaluefromROM(pvalue); ret
2014-03-09 15:49:08
1000
原创 为什么不能直接了当的写代码?
case1:#define FEATURE_NOT_ENABLEint main(int argc, char* argv[]){#ifndef FEATURE_NOT_ENABLE do_feature_enable(); #else do_feature_disable();#endif return 0;}case2:i
2014-03-09 14:09:01
617
原创 软件开发中常用的retry机制
背景:曾遇到过执行某一函数,却无法完成预期的功能。后来经过检查,发现需要在出错状况下多尝试几次就会提高成功率。void _check_result(void){ if (_is_function_success()) { do_next_step(); } else { printf("\nexe
2014-03-08 16:33:24
3347
原创 关于库函数头文件的使用问题
背景:#ifdef FEATURE_ONE#include #endifint main(int argc, char *argv[]){#ifdef FEATURE_ONE system("do something");#endif#ifdef FEATURE_TWO system("do something");#endif r
2014-03-08 13:22:12
726
原创 关于bool型数据的使用
背景:#define CONDITION_OFF (0)#define CONDITION_ON (1)原先的程序中对于某一个功能,只定义了0/1两种情况。bool get_condition(void){ return _get_condition();}void set_condition(bool b_cond){ _set_condit
2014-03-02 17:04:15
1057
原创 指针使用不当引起的系统crash
看到一段程序:分配一块内存,使用完释放内存空间时却没有从这块内存的首地址开始去free,从而导致程序挂掉了。测试案例:int main(int argc, char* argv[]){ char* ps_mem = null; ps_mem = malloc(1024*sizeof(char)); if (ps_mem) {
2014-03-02 14:44:52
1004
原创 关于可重入函数与线程安全相关知识学习
在下面这篇博文中,已经了解了线程安全的基本概念了,http://blog.csdn.net/boyxulin1986/article/details/19345603下面这个函数是非线程安全的。在多线程环境中,如果有多个线程同时对同一全局数据进行写操作,则会导致写操作出错。example1:int set_flag(int flag){ g_flag = fl
2014-02-22 12:34:15
785
1
原创 关于线程安全的学习
背景:最近在学习一套库函数,因为涉及到数据的读写操作,所以库函数提供了lock与unlock函数用于对写操作进行保护。需要保护的原因是函数库没有自己的线程,它们运行在库函数调用者的线程中;所以如果没有保护机制,如果出现多个线程同时去做写数据操作就会导致共享数据出错;这类函数也称之为非线程安全的函数。什么是线程安全的?1. 如果代码会被多个线程同时调用,并且每次运行结果和单线
2014-02-17 18:13:10
454
原创 linux如何在目标文件中查找符号
有一天查看代码时发现客户以不正确的方式来使用我们提供的函数,跟客户沟通后客户告知我们那个封装出来的函数已经没有再继续使用了。那我们应该要如何确认呢?1. 因为客户提供给我们的是object file,所以我们可以通过直接将那个函数删除再编译代码的方式来进行验证:如果能够正常编译通过,则说明这个函数确实没有再使用了;如果编译失败,则说明客户提供的目标文件中仍然有调用这个函数。
2014-02-16 12:42:51
505
原创 软件版本号的命名规则及格式学习
背景:working rule:1---->n个中间客户---->1个终极客户因为这种原因,所以在软件开发过程中会有很多种不同的版本;再由于对软件版本的命名没有预先规定一个统一的规范,从而导致对软件的管理出现很混乱的状况。所以我们必须要按照通用的软件命名规则对软件的版本号进行命名。GNU风格的版本号命名格式:主版本号.子版本号[.修订版本号[.编译版本号]]Ma
2014-02-13 18:35:46
1077
原创 关于函数接口可重用性的问题
问题:程序中部分函数中使用的是ASCII字符串,另外一部分是使用UTF-16字符串;对于原本的需求而言,通过在ASCII字符串与UTF-16字符串之间相互来回转换是没有问题的;但是由于新的需求,发现在UTF-16与ASCII之间的转换可能会导致数据内容的丢失。UTF-16字符集是ASCII兼容的,所以ASCII转换成UTF-16字符串不会有问题;ASCII字符是有限的,它不能兼
2014-01-27 12:29:52
406
原创 关于同步函数的学习与思考
下面这篇博文中已经有对同步函数与异步函数做了基本的学习,http://blog.csdn.net/boyxulin1986/article/details/17413239考虑到理解这个概念对学习可能产生的帮助,所以这一块打算继续学一学。需求:有两个线程A与B,如果A/B同时做一件事就会导致程序出错;现在的需求是在线程A中要调用线程B的函数,如果提供的是异步调用的函数,则就
2014-01-27 12:28:38
371
原创 关于fsync的问题及学习
1. 问题:因为需要写一个非常重要的文件,需要避免因系统突然断电造成的文件内容丢失问题的发生。而在调用了fopen/fwrite以及sync之后,会导致系统运行过程中用户操作卡一下。原因是sync会将buffer中所有已修改数据写入磁盘中,如果数据量大比如会影响到系统性能。所以考虑使用fsync来sync这一个文件。2. 问题:使用fsync就必须先获取文件描述符,这样
2014-01-17 19:24:36
476
原创 关于查内存泄漏工具mtrace的学习
mtrace是glibc库提供的一种检查内存泄漏的方法,所以特别重要的是你的程序是基于glibc之上的程序。mtrace的原理是通过记录glibc中每一对malloc-free的执行,来判断是否存在内存泄漏问题。所以如果你的程序不是基于glibc函数库的程序,那即使存在内存泄漏,mtrace也无法帮助查找系统中的内存泄漏问题。所以像C++语言中的通过new/delete运算
2014-01-09 20:13:48
688
原创 关于可变参数函数的学习
可变参数函数,顾名思义就是函数的参数个数是不确定的,可以变化的。可变参数函数见得比较多的就是字符串格式化输入输出函数了,如标准输入函数scanf、标准输出函数printf等。#include int scanf(const char *format, ...);int printf(const char *format, ...);可以实现可变参数函数的原因是头文件stda
2014-01-08 20:07:49
364
原创 库函数与系统调用学习
1. glibcglibc是GNU发布的libc库,glibc是linux系统最底层的API,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。2. 库函数库函数一般是指编译器提供的可在C源程序中调用的函数,分为两类:一个是C语言标准规定的库函数;一个是编译器特定的库函数。c语言的库
2014-01-07 18:43:51
421
原创 关于shell script案例学习
测试脚本程序如下:sh-3.2# cat ./test.shif [ -f /etc/passwd ]; then#echo 111-------->@1fiecho 222-------->@2sh-3.2#运行此脚本程序,sh-3.2# ./test.sh./test.sh: line 3: syntax error near unexpected toke
2014-01-07 18:42:14
444
原创 linux系统下的帐号管理学习
linux是多用户操作系统,每一个用户在系统上都有一个唯一的id,这个id就是UID。sh-3.2# iduid=0(root) gid=0(root)sh-3.2#id是一个数字,用户很难去记得一个数字到底对应的是哪个用户。所以可以给每个用户分配一个用户名,这个用户名是用户敏感的。用户名和UID的对应关系可以通过查看/etc/passwd知道,sh-3.2# cat
2014-01-06 12:26:25
382
原创 linux uptime命令学习
linux uptime命令用来显示当前系统的运行状况。sh-3.2# uptime 03:31:43 up 1:38, 2 users, load average: 51.02, 51.06, 51.00sh-3.2#uptime命令显示的信息的含义依次是:系统当前时间,系统运行的时间,系统上当前登录的用户个数,系统过去一分钟、五分钟和十五分钟的平均负载。用
2014-01-06 12:25:31
475
原创 linux uptime命令学习
linux uptime命令用来显示当前系统的运行状况。sh-3.2# uptime 03:31:43 up 1:38, 2 users, load average: 51.02, 51.06, 51.00sh-3.2#uptime命令显示的信息的含义依次是:系统当前时间,系统运行的时间,系统上当前登录的用户个数,系统过去一分钟、五分钟和十五分钟的平均负载。用
2014-01-06 12:24:22
262
原创 linux socket学习
linux socket可以用来作为进程间通信的一种方法,特别是在网络通信中应用于C/S模式。跟socket应用相关的系统调用有:#include #include int socket(int domain, int type, int protocol);其中参数domain用来指定一个具体的域,比如AF_LOCAL、AF_INET、AF_INET6、AF_NETL
2014-01-05 16:45:09
430
原创 linux动态链接库的应用学习
linux系统下分为两种类型的函数库:1. 静态库静态库的链接工作是在程序编译阶段完成的。每个需要调用该静态库的程序中都有一份该库的拷贝,所以静态库在程序中的绝对位置在编译阶段就确定下来了;由于多个程序中同时有多份静态库的拷贝,所以增大了程序的大小。2. 动态链接库动态链接库在程序编译阶段不会被拷贝到程序中。它是程序在运行阶段需要调用库时才去将函数库链接到可执行程序
2014-01-04 17:36:05
635
原创 linux内核模块学习
模块是具有独立功能的程序,它能被单独编译,但不能独立运行。它可以在系统运行时动态的被链接到内核中作为内核的一部分在内核空间运行,所以内核模块提高了内核的可扩展性。查看当前系统中已经加载了哪些模块的方法是:1. 使用lsmod命令进行查看,sh-3.2# lsmod2. 直接查看/proc文件系统中的信息,sh-3.2# cat /proc/modules以上两种方法
2014-01-03 18:18:18
435
原创 linux获取线程id的方法学习
最近一直在想:如何确认两段代码是不是在同一个线程中执行的呢?通过查看资料,发现一种比较简单的方法就是在代码中使用printf将当前线程的id打印出来。而这也分成两种情况:1. 如果是pthread,则使用,#include pthread_t pthread_self(void);2. 如果不是pthread,即是由内核创建的线程,则使用,#include pi
2014-01-03 12:30:34
1596
原创 linux signal相关函数学习
pause系统调用用来暂停程序的执行,直到信号的出现。这个信号可以是用来结束进程的信号或者是进程要捕捉的信号。#include int pause(void);sleep函数用来暂停当前CPU的执行,#include unsigned int sleep(unsigned int seconds);signal系统调用用来捕捉一个指定的信号(几个不可捕捉的信号除外),
2013-12-30 20:31:45
323
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人