![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
嵌入式linux
文章平均质量分 83
finleyzhang
Everything you can do I can do better
展开
-
嵌入式web服务器BOA源码解析
在这里插入代码片@TOCBOA是一个单进程的web服务器,支持CGI交互,浏览器每次发送一个POAT请求,BOA会对应fork一个CGI进程,数据发送完成后,CGI进程退出,尽管存在这样的进程创建和销毁的开销,但BOA仍然是一款轻量级的web服务器,适用于需要较为简单的web页面访问。下面对BOA的主要部分进行代码分析,包含GET和POST两种方法。GET和POST对客户端请求数据的解析过程都...原创 2020-02-09 21:59:37 · 1983 阅读 · 0 评论 -
分析uboot是如何启动内核的
1.uboot启动内核的代码缩减如下:s = getenv ("bootcmd");debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "");if (bootdelay >= 0 && s && !abortboot (bootdelay)){ run_command (s, 0);}2.假设boo转载 2014-04-28 10:13:07 · 513 阅读 · 0 评论 -
uboot和内核分区的修改
uboot和内核中如何修改分区的大小原创 2014-06-03 19:24:40 · 2419 阅读 · 0 评论 -
有符号及无符号位域值的测试
********************************************************************* * Author : Samso * Date : 04/02/2014 * Test platform: * Linux ubuntu 3.2.0-58-generic-pae *转载 2014-08-04 18:57:24 · 556 阅读 · 0 评论 -
linux中的热插拔和mdev机制
mdev是busybox自带的一个简化版的udev,作用是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件,在文件系统中的/dev目录下的设备节点都是由mdev创建的mdev扫描/sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为"dev"的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点用法:转载 2014-09-28 15:45:00 · 515 阅读 · 0 评论 -
嵌入式Linux之我行——ARM MMU工作原理剖析
一、MMU的产生 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多转载 2014-10-09 09:58:59 · 510 阅读 · 0 评论 -
软中断/tasklet/工作队列
软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者。本文重点在于介绍这三者之间的关系。(函数细节将不会在本文中出现,可以参考文献,点这里) (1)上半部和下半部的区别上半部指的是中断处理程序,下半部则指转载 2014-10-09 18:46:09 · 407 阅读 · 0 评论 -
linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。 Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G.Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为"内核空间".而将较转载 2014-10-30 19:19:26 · 520 阅读 · 0 评论 -
linux下 fork(),vfork(),clone()的用法及区别
fork,vfork,clone都是linux的系统调用,用来创建子进程的(确切说vfork创造出来的是线程)。先介绍下进程必须的4要点:a.要有一段程序供该进程运行,就像一场戏剧要有一个剧本一样。该程序是可以被多个进程共享的,多场戏剧用一个剧本一样。b.有起码的私有财产,就是进程专用的系统堆栈空间。c.有“户口”,既操作系统所说的进程控制块,在linux中具体实现是task_st原创 2014-11-18 16:07:34 · 466 阅读 · 0 评论 -
Linux用户态和内核态内存管理技术
通常程序访问的地址都是虚拟地址,用32位操作系统来讲,访问的地址空间为4G,linux将4G分为两部分。如图1所示,其中0~3G为用户空间,3~4G为内核空间。通过MMU这两部分空间都可以访问到实际的物理内存。进程在用户态只能访问0~3G,只有进入内核态才能访问3G~4G *进程通过系统调用进入内核态 *每个进程虚拟空间的3G~4G部分是相同的 *进程从用原创 2014-12-10 16:09:01 · 2821 阅读 · 0 评论 -
线程通信之条件变量
pthread_cond_wait()用法:ptread_mutex_lock(&mut);pthread_cond_wait(&cond, &mut);pthread_mutex_unlock(&mut);pthread_cond_signal(&cond);的用法和pthread_cond_wait是一样的。我们先来看看pthread_cond_wait()函数。转载 2015-04-09 21:37:09 · 652 阅读 · 0 评论 -
poll机制的实现流程
所有的系统调用,基于都可以在它的名字前加上“sys_”前缀,这就是它在内核中对应的函数。比如系统调用open、read、write、poll,与之对应的内核函数为:sys_open、sys_read、sys_write、sys_poll。一、内核框架:对于系统调用poll或select,它们对应的内核函数都是sys_poll。分析sys_poll,即可理解poll机制。1. s原创 2014-03-26 11:13:05 · 561 阅读 · 0 评论 -
wait_event_interruptible() 和 wake_up()的使用
1. 关于 wait_event_interruptible() 和 wake_up()的使用 读一下wait_event_interruptible()的源码,不难发现这个函数先将 当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(), 而schedule()会将位于TASK_INTERRUPTIBLE状态的当前进程从runqueue转载 2014-03-26 08:20:19 · 938 阅读 · 0 评论 -
attribute 用法 section 部分
1. gcc的__attribute__编译属性要了解Linux Kernel代码的分段信息,需要了解一下gcc的__attribute__的编绎属性,__attribute__主要用于改变所声明或定义的函数或 数据的特性,它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除 返回值外,不会通过其它(如全局变量原创 2013-11-28 14:57:45 · 526 阅读 · 0 评论 -
VMware虚拟机配置Ubuntu桥接方式(Bridged)使虚拟机和宿主机能互相ping通
1、设置Bridged上网方式Vmware菜单栏VM->settings->Network Adapter或者Ctrl+D2、查看Bridged状态Vmware菜单栏Edit->Virtual Network Editor要设置成以上bridged模式,先关闭虚拟机,不关闭设置会提示只有虚拟机在power off状态才能设置,选择VMnet0,点击左下角的Restore转载 2013-12-12 21:19:56 · 882 阅读 · 0 评论 -
内核中module_init()是被如何调用
static int __init initialization_function(void){/*初始化代码*/}module_init(initialization_function);初始化函数应当声明成静态的,因为它们不会在特定文件之外可见。上述定义中的__init标志可能看起来有点陌生,它对内核来讲是一个暗示,表明该函数只是在初始化时使用。模块加载器在模块加载后会丢掉这个转载 2013-12-19 15:01:36 · 4498 阅读 · 1 评论 -
BSP 概念解析
Drew在这里按照自己的理解来解释一下BSP( Board Support Package),仅供参考: BSP是板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,例如VxWorks的BSP和Linux的BSP相对于某一CPU来说尽原创 2014-01-06 14:52:08 · 645 阅读 · 0 评论 -
linux内核目录结构
/ 根目录│├boot/ 启动文件。所有与系统启动有关的文件都保存在这里│ └grub/ Grub引导器相关的文件│├dev/ 设备文件├proc/ 内核与进程镜像│├mnt/ 临时挂载├media/ 挂载媒体设备│├root/ root用户的$HOME目录├home/│ ├user/ 普通用户的$HOME目录│ └…/│├bin/转载 2014-02-28 13:49:33 · 604 阅读 · 0 评论 -
LINUX内核和驱动中常见的 C语法---》标记化 初始化
在标准C中(C89)结构标准初始化是用{}来实始化,在C99的版本,采用了采用可读性更强的标记化 初始化,这在LINUX内核和驱动很为常见。这是ISO C99的用法 C Primer Plus第五版中相关章节: 已知一个结构,定义如下 struct book { char title[MAXTITL]; char author[MAXAUTL];转载 2014-03-12 10:25:47 · 667 阅读 · 0 评论 -
*lds ----linux下的通用链接脚本
ELF(Executable and Linkable Format)格式,linux平台下十分常见的可执行、可连接文件。输出section的丢弃:例子,.foo { *(.foo) },如果没有任何一个输入文件包含.foo section,那么连接器将不会创建.foo输出section。但是如果在这些输出section描述内包含了非输入section描述命令(如符号赋值语句),那么连转载 2014-03-12 10:27:12 · 1079 阅读 · 0 评论 -
static inline内嵌函数的理解
内联函数有些类似于宏。内联函数的代码会被直接嵌入在它被调用的地方,调用几次就嵌入几次,没有使用call指令。这样省去了函数调用时的一些额外开销,比如保存和恢复函数返回地址等,可以加快速度。不过调用次数多的话,会使可执行文件变大,这样会降低速度。相比起宏来说,内核开发者一般更喜欢使用内联函数。因为内联函数没有长度限制,格式限制。编译器还可以检查函数调用方式,以防止其被误用。static inli原创 2014-03-13 15:56:58 · 760 阅读 · 0 评论 -
list_for_each_entry
在Linux内核源码中,经常要对链表进行操作,其中一个很重要的宏是list_for_each_entry:意思大体如下: 假设下面几个结点,则第一个member代表head,list_for_each_entry的作用就是循环遍历每一个pos中的member子项。list_for_each_entry应用: 它实际上是一个 for 循转载 2014-04-01 14:54:04 · 639 阅读 · 0 评论 -
container_of
container_of的函数实现:[cpp] view plaincopy#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) /** * container_of - cast a member of a structure out to the co转载 2014-04-01 14:55:15 · 486 阅读 · 0 评论 -
CPSR_c是什么
众所周知,ARM每种工作模式除R0~R15共16个寄存器外,还有第17个寄存器CPSR,叫做 当前程序状态寄存器,CPSR中一些位被用于标识各种状态,一些位被用于标识当前出于什么工作模式其中cpsr_c代表的是这32位中的低8位,也就是控制位当你看到有些程序里这样写msr cpsr_c 0xd2 //msr转载 2013-11-04 10:15:06 · 520 阅读 · 0 评论