07 2013 档案

摘要:先引用一篇博文,再总结一下相关问题。所谓上下文切换,实质就是寄存器堆的切换过程。这其中一部分需要硬件来切换,一部分需要软件来处理。当在用户空间发生中断时,首先由 x86 CPU 从硬件角度进行处理,然后才是 linux 内核的处理。当中断处理完毕,返回到用户空间时,最后的步骤也是交给 CPU 硬件来处理的。1、 X86 CPU 对中断的硬件支持CPU 从中断控制器取得中断向量根据中断向量从 IDT 中找到对应的中断门根据中断门,找到中断处理程序在进入中断处理程序前,需要将堆栈切换到内核堆栈。也就是将 TSS 中的 SS0、ESP0装入SS、ESP然后将原来的用户空间堆栈(SS, ESP)、EF 阅读全文
posted @ 2013-07-23 18:00 woainilsr 阅读(447) 评论(0) 推荐(0)
摘要:一、基本概念中断分为同步中断和异步中断。同步中断是由CPU控制单元产生的,“同步”是指只有在一条指令执行完毕后,CPU才会发出中断,而不是发生在代码指令执行期间,比如系统调用。而异步中断是由其他硬件设备依照CPU时钟信号产生的,即意味着中断能够在指令之间发生,例如键盘中断。按照Intel的微处理器手册,同步中断和异步中断也分别称为异常(或者软件中断)和中断。中断大家都比较熟悉,是由硬件设备产生的。异常的产生源有两种:一种是由程序的错误产生的,内核通过发送一个Unix程序员都熟悉的信号来处理异常;第二种时内核必须处理的异常条件产生的,此时内核执行恢复异常需要的所有步骤,例如缺页,或对内核服务的一 阅读全文
posted @ 2013-07-23 17:58 woainilsr 阅读(3264) 评论(2) 推荐(0)
摘要:进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停留在一种浅层次的理论层面上,没有深入去研究。处理器总处于以下状态中的一种:1、内核态,运行于进程上下文,内核代表进程运行于内核空间;2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;3、用户态,运行于用户空间。用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可 阅读全文
posted @ 2013-07-23 16:11 woainilsr 阅读(330) 评论(0) 推荐(0)
摘要:volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。 例如: volatile int i=10; int j = i; ... int k = i; volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。 ... 阅读全文
posted @ 2013-07-20 23:49 woainilsr 阅读(305) 评论(0) 推荐(0)
摘要:1、gcc-Wallhello.c-ohello//编译源文件,显示警告信息2、./a.out//运行程序3、gcc-Wallcalc.c/usr/lib/libm.a-ocalc//绝对路径包含库4、gcc-Wallcalc.c-lm-ocalc//使用参数包含库5、Gcc默认搜索库文件的目录:/usr/local/lib/;/usr/lib/6、Gcc默认搜索头文件的目录:/usr/local/include/;/usr/include/7、Gcc-I与-L参数:前者将路径加到搜索包含头文件的搜索路径列表;后者将路径加到搜索包含库文件的搜索路径列表。8、C_INCLUDE_PATH添加c语 阅读全文
posted @ 2013-07-20 23:29 woainilsr 阅读(505) 评论(0) 推荐(0)
摘要:C程序员经常被问及的一道面试题是:什么是大端/小端,怎么样判断是大端/小端?大端小端问题对于嵌入式程序员绝对不会陌生(否则,别告诉我你是搞嵌入式的),它与CPU体系结构有关。比如常见的X86处理器是小端模式;ARM处理器默认是小端模式,当然也可以通过配置,改为大端模式;Moto的68000、DEC的SPARC是大端模式。 1.什么是大小端? 定义:一个内存对象由多个字节组成;同时,内存存放... 阅读全文
posted @ 2013-07-20 23:20 woainilsr 阅读(704) 评论(0) 推荐(0)
摘要:我于2007年来到北京,在北京工作这些年,先后在NEC、风行、百度几家公司担任软件工程师的职务。NEC是一家具有百年历史的传统日企,在知春路的分公司叫日电电子,我们部门主要从事机顶盒、数字电视上嵌入式软件的研发。风行是一家成立于2005年的在线视频公司,主要做P2P视频点播的业务,而我主要从事P2P后台服务器的开发。百度是一家在纳斯达克上市的互联网公司,我主要在客户端部门的百度影音项目组从事P2... 阅读全文
posted @ 2013-07-20 23:11 woainilsr 阅读(433) 评论(0) 推荐(0)
摘要:如何在涉世之初少走弯路,有一个好的开端,开始一番成功的事业?以下是一些先行者积累的10条有益的涉世忠告。好好地遵循、把握这些忠告和建议吧,比起所学的课堂课程来,它毫不逊色! 1. 买个闹钟,以便按时叫醒你。 贪睡和不守时,都将成为你工作和事业上的绊脚石,任何时候都一样。不仅要学会准时,更要学会提前。就如你坐车去某地,沿途的风景很美,你忍不住下车看一看,后来虽然你还是赶到了某地,却不是准时到达。... 阅读全文
posted @ 2013-07-20 23:06 woainilsr 阅读(312) 评论(0) 推荐(0)
摘要:1.Linux网络栈下两层实现 1.1简介 VLAN是网络栈的一个附加功能,且位于下两层。首先来学习Linux中网络栈下两层的实现,再去看如何把VLAN这个功能附加上去。下两层涉及到具体的硬件设备,日趋完善的Linux内核已经做到了很好的代码隔离,对网络设备驱动也是如此,如下图所示: 这里要注意的是,Linux下的网络设备net_dev并不一定都对应实际的硬件设备,只要注册一个s... 阅读全文
posted @ 2013-07-17 22:35 woainilsr 阅读(12005) 评论(0) 推荐(1)
摘要:GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C++、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。GCC入门基础表3.6 Gcc所支持后缀名解释后 缀 名所对应的语言后 缀 名所对应的语言.cC原始程序.s/.S汇编语言原始程序.C/ 阅读全文
posted @ 2013-07-12 15:36 woainilsr 阅读(12345) 评论(0) 推荐(0)
摘要:一、为VMware虚拟机添加硬盘1. 首先在VMware虚拟机的VM->Setting子菜单中为虚拟机添加一块15G大小的SCSI类型的硬盘(注意:如果原来为IDE硬盘,SCSI类型的硬盘可能添加不成功,则可以添加IDE类型的硬盘)。2. 下面是为VMware虚拟机添加额外硬盘完整的命令:[root@localhost GemOcean]# fdiskUsage: fdisk [-l] [-b SSZ] [-u] deviceE.g.: fdisk /dev/hda (for the first IDE disk)or: fdisk /dev/sdc (for the third SCS 阅读全文
posted @ 2013-07-11 11:06 woainilsr 阅读(1323) 评论(0) 推荐(0)
摘要:Linux有自己一套完整的启动体系,抓住了Linux启动的脉络,Linux的启动过程将不再神秘。阅读之前建议先看一下附图。本文中假设inittab中设置的init tree为:/etc/rc.d/rc0.d/etc/rc.d/rc1.d/etc/rc.d/rc2.d/etc/rc.d/rc3.d/etc/rc.d/rc4.d/etc/rc.d/rc5.d/etc/rc.d/rc6.d/etc/rc.d/init.d1. 关于Linux的启动init是所有进程之父init读取/etc/inittab,执行rc.sysinit脚本(注意文件名是不一定的,有些unix甚至会将语句直接写在initta 阅读全文
posted @ 2013-07-11 10:59 woainilsr 阅读(2652) 评论(0) 推荐(0)
摘要:概述 ——什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解 HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完 成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义 阅读全文
posted @ 2013-07-10 22:39 woainilsr 阅读(4977) 评论(0) 推荐(1)
摘要:在Linux中利用源码包安装软件最重要的就是要仔细阅读安装包当中的README INSTALL两个说明文件,这两个文件会清楚的告诉你如何可以正确的完成这个软件的安装! 我们都知道源码包安装分为这么几个阶段, 1、 Tar:解压这个源码软件包。 2、 Cd:进入到这个源码包。 3、 ./configure:“configure”会在你的系统上测试存在的特性(或者bug!)然后来建立Makef... 阅读全文
posted @ 2013-07-10 22:32 woainilsr 阅读(520) 评论(0) 推荐(0)
摘要:★概要: 这片文档从程序员的角度讨论了linux的ELF二进制格式。介绍了一些ELF执行 文件在运行控制的技术。展示了如何使用动态连接器和如何动态装载ELF。 我们也演示了如何在LINUX使用GNU C/C++编译器和一些其他工具来创建共享的 C/C++库。 ★1前言 最初,UNIX系统实验室(USL)开发和发布了Executable an... 阅读全文
posted @ 2013-07-10 22:24 woainilsr 阅读(770) 评论(0) 推荐(0)
摘要:Linux支持动态连接库,不仅节省了磁盘、内存空间,而且可以提高程序运行效率[1]。不过引入动态连接库也可能会带来很多问题,例如动态连接库的调试[4]、升级更新[5]和潜在的安全威胁[6][7]。这里主要讨论符号的动态链接过程,即程序在执行过程中,对其中包含的一些未确定地址的符号进行重定位的过程[3][8]。 本篇主要参考资料[3]和[8],前者侧重实践,后者侧重原理,把两者结合起来就方便理解程序的动态链接过程了。另外,动态连接库的创建、使用以及调用动态连接库的部分参考了资料[1][2]。 下面先来看看几个基本概念,接着就介绍动态连接库的创建、隐式和显示调用,最后介绍符号的动... 阅读全文
posted @ 2013-07-10 22:18 woainilsr 阅读(5608) 评论(0) 推荐(0)
摘要:我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。 在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。第1步:编辑得到举例的程序--hello.h、hello.c和main.c;hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"Hello 阅读全文
posted @ 2013-07-10 22:04 woainilsr 阅读(1004) 评论(0) 推荐(2)
摘要:今天要用到静态库和动态库,于是写了几个例子来巩固一下基础。hello1.c ———————————————————— #include void print1(int i) { int j; for(j=0;jvoid print2(char *arr) { char c; int i=0; while((c=arr[i++])!='\0') { printf("%d****%c\n",i,c); } }hello.c ____________________________________________________ void print1(int); 阅读全文
posted @ 2013-07-10 21:47 woainilsr 阅读(31099) 评论(2) 推荐(1)
摘要:中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里的函数太多,不知道要不要一个一个讲下去,要知道讲DHCP的实现理论的话一篇博文也就可以大致的讲完,但实现的源码却要关心很多的问题,比如说,理论上说从IP地址池取到一个空闲的IP,就这么一句,在源码的体现也是一大段。算啦,讲多少算多少吧,进入主题! struct dhcpMessage报文里uint8_t options[308]字段,在整个DHCP过程中是报文的一个很重要的字段,博文的系列(二)有讲解该字段的数据组织方式,CLV(Code + Len + Value),现在来讲解下怎么把选项信息添加进该字段,以及怎么从该字段取到相 阅读全文
posted @ 2013-07-09 22:45 woainilsr 阅读(10520) 评论(1) 推荐(0)
摘要:Server端对于租赁出去的IP的管理是基于结构体dhcpOfferedAddr的,该结构体的定义是在leases.c文件里:(结构体的成员介绍说明见详解之数据结构) 1: struct dhcpOfferedAddr { 2: uint8_t chaddr[16]; 3: uint32_t yiaddr; /* network order... 阅读全文
posted @ 2013-07-09 22:39 woainilsr 阅读(1740) 评论(0) 推荐(0)
摘要:Server端对于租赁出去的IP的管理是基于结构体dhcpOfferedAddr的,该结构体的定义是在leases.c文件里:(结构体的成员介绍说明见详解之数据结构) [cpp] view plaincopy struct dhcpOfferedAddr { uint8_t chaddr[16]; uint32_t yiaddr; /* netw... 阅读全文
posted @ 2013-07-09 22:29 woainilsr 阅读(1887) 评论(0) 推荐(0)
摘要:上节讲解了read_config函数,读取配置信息到server_config的相应成员变量里,但read_config函数只负责把配置信息重文件里读出来,具体怎么把信息填写到指定的地址内,是调用keywords数组里元素的handler成员指向的函数完成。这节就是讲解完成具体的写入操作中比较复杂的函数。 1) int read_opt(const char *line, void *arg) ... 阅读全文
posted @ 2013-07-09 22:25 woainilsr 阅读(1785) 评论(0) 推荐(0)
摘要:上节介绍了存储管理配置信息的结构体struct server_config_t,该结构体贯穿整个server端程序的运行。 在dhcpd.c里的用该结构体定义个一个全局的变量: struct server_config_t server_config; 在server启动做的第一件事就是初始化这个全局变量server_config: 现在就进入read_config函数,一睹其真容! ... 阅读全文
posted @ 2013-07-09 22:23 woainilsr 阅读(1456) 评论(0) 推荐(0)
摘要:定义的数据结构对于C程序的重要性,不言而喻。面向对象设计的程序是一个个对象的集合,而面向过程语言设计的程序则是数据结构与算法的集合。 下面来分析的是dhcp server中的定义结构体: 1)、在packet.h文件里定义了DHCP报文的格式: struct dhcpMessage报文的字段虽然都有注释,但还是有必要讲下options字段。 options在大多文档中的说法是可选字... 阅读全文
posted @ 2013-07-09 22:14 woainilsr 阅读(2324) 评论(1) 推荐(0)
摘要:最近负责接入模块,包括dhcp、ipoe和pppoe等等。所以需要对dhcp和ppp这几个app的源代码进行一些分析。网上有比较好的文章,参考并补充自己的分析。 这篇udhcp详解是基于busybox-1.20里的…/busybox-1.20/networking/udhcp/目录下的源码进行讲解与分析,主要是对udhcp server端源码进行的讲解,client端相对于server端相对简单一些,源代码上面表现的实现思想大体相似。 该系列的讲解分析是在源代码的基础上,所以并没有打算以单独章节来讲解DHCP协议工作交互流程,也就是已经了解掌握了DHCP协议,用C来实现而已。 阅读全文
posted @ 2013-07-09 22:02 woainilsr 阅读(1727) 评论(0) 推荐(0)
摘要:udhcp目录下有十几个源文件,一个源文件相对应一个模块,完成一系列相关的功能,例如在static_leases.c主要针对static_lease链表增删查找等操作。dhcpd.c——整个dhcp server运行的主线,server开始运行是从udhcpd_main函数开|始,相当于我们程序的main入口。在dhcpd_main将各个功能模块组合起|来实现我们的dhcp server。|arpping.c——这个文件里只有一个函数arpping,server在给客户机分配IP地址|从IP地址池里找到a Free IP后,会调用arpping函数看网络上是否|主机使用该地址。|common. 阅读全文
posted @ 2013-07-09 21:55 woainilsr 阅读(2251) 评论(0) 推荐(1)
摘要:getsockname和getpeername#include int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);返回:0—OK,-1—出错。getsockname函数返回与套接口关联的本地协议地址。getpeername函数返回与套接口关联的远程协议地址。addrlen是值-结果参数。使用场合:在不调用bind的TCP客户,当connect成功 阅读全文
posted @ 2013-07-09 15:57 woainilsr 阅读(622) 评论(0) 推荐(0)