随笔分类 - Linux编程
摘要:My application sometimes randomly receives a SIGKILL signal, gdb wouldsay something like:Program terminated with signal SIGKILL, Killed.The program no longer exists.(gdb)And i have no clue why? When does the system send a SIGKILL? There isno 3rd application send anything to mine....There are situati
阅读全文
摘要:malloc()和free()的基本概念以及基本用法:1、函数原型及说明:void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。2、函数的用法:程序代码: // Code... char *Ptr = NULL; Ptr = (char *)malloc(100 * sizeof(char)); //需要强制类型转换,malloc
阅读全文
摘要:本文以ARC600平台的某一实现为例,对U-BOOT的内存布局和启动方式进行简要的分析。【内存布局】<IGNORE_JS_OP>2009-02-10 08:50 上传下载附件 (16.31 KB) 在ARC600平台,U-BOOT的内存布局图1所示。该布局由board/arc600/u-boot.lds文件定义,在链接的时候生成相应的二进制映像。首先,定义起始地址为0x40800000,接下来是中断向量表,大小为256字节,按每个中断向量占用4个字节的跳转地址算,最多可以有64个中断向量;第二部分是一些基础性的代码段,它为下一步加载 boot或者kernel做准备,其大小为0x17
阅读全文
摘要:1、准备测试文件 [root@lihao work]$cat test_old test old [root@lihao work]$cat test_new test new 2、使用diff创建补丁test.patch [root@lihao work]$ diff -uN test_old test_new> test.patch 【注:因为单个文件,所以不需要-r选项。选项顺序没有关系,即可以是-uN,也可以是-Nu。】 [root@lihao work]$ ls test_old test_new test.patch 3、pa...
阅读全文
摘要:这是作者在学习X86汇编过程中的学习笔记,难免有错误和疏漏之处,欢迎指正。作者将随时修改错误并将新的版本发布在自己的Blog站点上。严格说来,本篇文档更侧重于C语言和C编译器方面的知识,如果涉及到具体汇编语言的内容,可以参考相关文档。1. 编译环境 OS: Solaris 9 X86 Compiler: gcc 3.3.2 Linker: Solaris Link Editors 5.x Debug Tool: mdb Editor: vi 注:关于编译环境的安装和设置,可以参考文章:Solaris 上的开发环境安装及设置。 mdb是Solaris提供的kernel debug工具,这里用它.
阅读全文
摘要:对于兼容ANSI的终端,如xterm、rxvt、konsole等,可以彩色显示终端文本中的底色或前景颜色,本文将详细讨论如何实现随意修改和定制这些终端的颜色。 每个Linux用户几乎天天都会面对Bash,刚接触Linux的人总是感觉Bash过于沉闷单调,但是实际上每个用户都可以根据需要定制出自己喜欢的Shell,使它变得丰富多彩。例如,彩色提示符就可以使终端更酷,并且与众不同。 由于Linux中使用最广泛的Shell就是Bash,因此我们在这里主要讨论Bash,希望在其它不同Shell中定制色彩的可以参考Man。 配置Shell 设置颜色可以在Linux用户个人的Shell配置文件~/.bas
阅读全文
摘要:1。gcc包含的c/c++编译器gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,(没有看太明白前面这半句是什么意思:))一般c程序就用gcc编译,c++程序就用g++编译2。gcc的基本用法gcc test.c这样将编译出一个名为a.out的程序gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字3。为什么会出现undefined reference to 'xxxxx'错误?首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有
阅读全文
摘要:.6 的linux kernel最多可以使用32中softirq,见代码:softirq.c/*表示softirq最多可以有32种类型,实际上linux只使用了六种,见文件interrupt.h*/static struct softirq_action softirq_vec[32] __cacheline_aligned_in_smp;复制代码linux中实际使用的六种:interrupt.henum{ HI_SOFTIRQ=0, /*用于高优先级的tasklet*/ TIMER_SOFTIRQ, /*用于定时器的下半部*/ NET_TX_SOFTIRQ,/*用于网络层发...
阅读全文
摘要:1.中断处理函数可以被其他中断线上的中断处理函数所中断2.如果中断线是共享的,那么当该中断线上有中断发生时,cpu将响应该中断,并依次调用该中断线上的所有已注册的中断处理函数,每个中断处理函数将进行判断,是否是自己对应的硬件设备发生的中断,不是则返还IRQ_NONE,否则返回IRQ_HANDLE,并响应该中断。3.在内核中执行do_IRQ()响应中断,首先判断该线上是否有中断处理程序,然后在该线上运行所有的中断处理程序。4.总的来说中断是属于大家的,所有在同一个中断号内的需要处理的例程(同一中断号内的处理例程可能有多个)都将调用这个中断处理程序,然而在释放中断处理程序的最后一个参数中的dev_
阅读全文
摘要:1> 所有系统信息是输出到ring buffer中去的.dmesg所显示的内容也是从ring buffer中读取的2> LINUX系统启动后,由/etc/init.d/sysklogd先后启动klogd,syslogd两个守护进程。 2.1> klogd会通过syslog()系统调用或者读取proc文件系统(/proc/kmsg)来从系统缓冲区(ring buffer)中得到由内核printk()发出的信息2.2>Klogd的输出结果会传送给syslogd进行处理,syslogd会根据/etc/syslog.conf的配置把log信息输出到/var/log/下的不同文件
阅读全文
摘要:我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。第1步:编辑得到举例的程序--hello.h、hello.c和main.c;hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"Hello
阅读全文
摘要:通过软件中断0x80,系统会跳转到一个预设的内核空间地址,它指向了系统调用处理程序(不要和系统调用服务例程相混淆),即在arch/i386/kernel/entry.S文件中使用汇编语言编写的system_call函数。很显然,所有的系统调用都会同一跳转到这个地址进而执行system_call函数,那么system_call函数又该如何派发它们到各自的服务例程呢? 软中断指令int0x80执行时,系统调用号会被放进eax寄存器,同时,sys_call_table每一项占用4个字节。这样,system_call函数可以读取eax寄存器获得当前系统调用的系统调用号,将其乘以4天生偏移地址,然后..
阅读全文
摘要:时间片是一个数值,它表明进程在被抢占之前可以持续运行的时间。调度程序总是选择时间片未用尽而且优先级最高的进程运行。进程不一定一次就用完所有的时间片,可以分几次通过多次调度用完。进程时间片用尽后在本论调度中不会再被运行,直到等待其他所有进程的时间片耗尽,在那个时候,所以进程的时间片将被重新计算。一个CPU有一个可执行队列,一个可执行队列有两个优先级数组。活动优先级数组和过期优先级数组。进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。一个CPU有多个等待队列,根据不同的事件类型进行划分,当一个进程由于等待某一个事件而进入睡眠时,即被加入到该事件的等待
阅读全文
摘要:版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://feizf.blogbus.com/logs/16835565.htmlLinux内核 2.4和2.6的进程内核堆栈和task描述符存储不太一样,这儿总结一下。在内核2.4中堆栈是这么定义的:union task_union { struct task_struct task;unsigned long stack[INIT_TASK_SIZE/sizeof(long)]; };而INIT_TASK_SIZE只能是8K。内核为每个进程分配一个task_struct结构时,实际上分配两个连续的物理页面(8192字节),
阅读全文
摘要:termios结构体中,该结构体一般包括如下的成员:tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_t c_cc[NCCS];其具体意义如下c_iflag:输入模式标志,控制终端输入方式,具体参数如下所示。c_iflag参数表键值说明IGNBRK 忽略BREAK键输入BRKINT如果设置了IGNBRK,BREAK键的输入将被忽略,如果设置了BRKINT ,将产生SIGINT中断IGNPAR忽略奇偶校验错误PARMRK标识奇偶校验错误INPCK允许输入奇偶校验ISTRIP去除字符的第8个比特IN
阅读全文
摘要:mmap:memory map,就是内存映射简单的说就是将文件映射到用户的地址空间中。这么做有什么好处呢?1.传统文件访问方式是, 首先用open系统调用打开文件, 然后使用read, write等调用进行顺序或者随即的I/O. 这种方式是非常低效的, 每一次I/O操作都需要一次系统调用. 而通过mmap可以将文件映射到进程空间中,把对文件的操作变为对内存的访问,提高了效率。2.另外, 如果若干个进程访问同一个文件, 每个进程都要在自己的地址空间维护一个副本, 浪费了内存空间。而通过mmap由于只是简单的映射关系,所以非常方便于同一副本的共享。
阅读全文
摘要:为什么在内核中碰到很多 #defines ... do{ ... } while(0)?有以下几点原因:1.当宏里面有if时,可以起到封闭代码作用,防止与外面的 if 混淆 比如定义宏,#define FREE1(p) if (p) free (p) 而在代码部分这样调用宏: if (expression) FREE1(p) else printf(“expression was false.\n”) ; 展开后,else会和宏中的if配对了,这就错了。但是宏写成如下的形式就永远不会错了 #define FREE4(P) do {if(p) free(p)}; while(0)...
阅读全文
摘要:在GCC手册中对__builtin_expect()的描述是这样的:long __builtin_expect (long exp, long c) You may use __builtin_expect to provide the compiler with branch predictioninformation. In general, you should prefer to use actual profile feedback for this(‘-fprofile-arcs’), as programmers are notoriously bad at predicting
阅读全文
摘要:前段买了本《C专家编程》确实不错,特别是对内存思考这一章节,(O(∩_∩)O~目前我也只看到这一章节),其中讲到了总线错误和段错误:bus error(core dumped) 总线错误(信息已经转储)segmetation fault(core dumped)段错误(信息已经转储)这种错误相信只要你在unix用c,c++这两种错误是常见又是很头疼的错误,目前我也遇到段错误的程序,至今未找到错误原因。来看看作者怎么解说的:产生原因: 当硬件告诉操作系统一个有问题的内存引用时,操作系统通过发送信号给有问题的进程进行交流。(信号是一种事件通知或一个软件中断)。普通进程一般对“总线错误”或“段错误”
阅读全文
摘要:软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者。本文重点在于介绍这三者之间的关系。(函数细节将不会在本文中出现,可以参考文献,点这里)(1)上半部和下半部的区别上半部指的是中断处理程序,下半部则指的是一些虽然与中断有相关性但是可以延后执行的任务。举个例子:在网络传输中,网卡接收到数据包这个事件不一定需要马上被处理,适合用下半部去实现;但是用户敲击键盘这样的事件就必须马上被响应,应该用中断实现。两者的主要区别
阅读全文