程序构成 代码段.数据段.BSS段(Block Started by Symbol,又叫:未初始化数据段).堆(heap)和栈(stack).这些部分构成了Linux应用程序的重要组成部分. 内存布局 1.从低地址到高地址分别为:代码段(0x8048000).数据段.BSS段.堆.栈. 2.堆向高内存地址生长. 3.栈向低内存地址生长. 查看程序段地址 cat /proc/进程号/maps 数据存放 1.代码段:全局常量 2.数据段:全局变量(初始化的以及未初始化的).静态变量(全局的和局部的,…
链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据.链表的开销主要是访问的顺序性和组织链的空间损失. 传统链表与Linux内核链表的区别 Linux内核链表是双向循环链表,提供一套统一的链表和操作函数.内核链表的节点由数据和指针两部分组成,不同的是指针不指向下一个节点的数据部分,而是指向下一个节点的指针部分. 内核链表的结构 struct…
进程与程序 1.程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体. 2.进程:是一个执行中的程序,它是一个动态的实体. 进程四要素 1.有一段程序供其执行.这段程序不一定是某个进程所专有,可以与其他进程共用. 2.有进程专用的内核空间堆栈. 3.在内核中有一个task_struct数据结构,也就是通常所说的进程控制块(PCB).有了这个数据结构,进程才能成为内核调度的一个基本单位,接受内核的调度. 4.有独立的用户空间. 如果有独立的用户空间,那么是进程:如果没独立的用户空间,…
内存管理子系统 1.虚拟地址与物理地址的映射 2.物理内存的分配 Linux虚拟地址空间分布 设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址.虚拟地址简单的来说就是程序中使用的地址.所以存在虚拟地址到物理地址之间的映射关系. Linux系统支持的虚拟地址空间由硬件来决定.例如处理器是32位,那么访问到的虚拟地址空间就是4G.0-3G是用户空间,也就是应用程序空间.3-4G是内核空间,内核空间又被划分为4个部分,第一个部分是直接映射区(3-3.896G),第二个部分是vmall…
Linux系统架构 1.用户空间:应用程序.C函数库 2.内核空间:系统调用接口.内核.体系结构相关代码 Linux系统利用处理器不同的工作模式,使用其中的两个级别分别来运行Linux内核与应用程序,这样使操作系统本身得到了充分的保护.内核空间与用户空间是程序执行的两种不同的状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的切换. Linux内核架构 1.系统调用接口 2.进程管理模块 3.内存管理模块 4.虚拟文件系统 5.网络协议模块 6.设备驱动模块 7.体系结构相关 Linux内…
第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 <time.h> 1.1.5 返回值 成功:日历时间失败:-1 1.1.6 参数说明 t:不为空的情况下保存返回值   1.2 获取格林威治时间 1.2.1 函数名 gmtime 1.2.2 函数原形 struct tm *gmtime(const time_t *timep) 1.2.3 函数功…
裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的编号(中断号). 3.根据中断号,找到irq_desc结构 4.从irq_desc描述结构中取出事先注册好的函数来运行. 驱动程序需要做什么 1.实现中断处理程序 2.注册中断处理程序 Linux中断处理程序设计 1.中断注册 request_irp函数用于注册中断. int request_irq…
系统调用 函数实现体在内核空间,提供给应用程序来使用,就是一个系统调用. 工作流程 1.通过软中断(swi)从用户空间切换到内核空间.entry-common.S中的ENTRY(vector_swi)是用来处理软中断的.系统调用通常从r7寄存器中取出系统调用编号. 2.通过系统调用编号从系统调用表中找出调用的系统调用函数.也是是calls.S文件中找出系统调用编号对应的函数. 实现系统调用 1.打开.../kernel/printk.c,添加系统调用函数 void sys_iprint(){ p…
内核模块示例 #inlcude <linux/init.h> #inlcude <linux/module.h> static int hello_init(){ printk(KERN_WARNING”hello_init\n”); ; } static void hello_exit(){ printk(KERN_INFO”hello_exit\n”); } module_init(hello_init); module_exit(hello_exit); 特点: 内核模块代码…
什么是内核模块 Linux内核的整体结构非常庞大,其中包含的组件也非常多,如何使用这些组件.一种方式是把所有的组件都编译进内核文件,即zImage或bzImage,但这样会导致一个问题,占用内存过多.内核模块是一种能让内核文件本身并不包含某些组件,而是是在被需要使用的时候,动态地添加到到在运行的内核中的机制. 内核模块的特点: 1.模块本身并不被编译进内核文件 2.在内核运行期间动态的安装或卸载 内核模块的使用 1.安装内核模块 示例: insmod usb.ko 2,卸载内核模块 示例: rm…
为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make menuconfig配置方法 1.菜单项的分类 processor type and features   处理器类型 networking support            网络协议支持 device drivers                设备驱动支持 file systems     …
编程模型 Socket的实质就是一个接口,利用该接口,用户在使用不同的网络协议时,操作函数得以统一.而针对不同协议的差异性操作,则交给了Socket去自行解决. TCP编程模型 UDP编程模型…
时间类型 Coordinated Universal Time(UTC):世界标准时间,也就是格林威治时间(Greenwich Mean Time, GMT). Calendar Time:日历时间,是用一个标准时间点(1970年1月1日0点)到此时所经过的秒数来表示的时间. #include <stdio.h> #include <time.h> #include <sys/time.h> void main(){ //获取日历时间 time_t ctime; tim…
linux应用程序地址布局 在学习Linux应用程序开发时,经常会遇到如下概念:代码段.数据段.BSS段(Block Started by Symbol,又名:未初始化数据段).堆(heap)和栈(stack).而这些部分也是构成Linux应用程序的重要组成部分. 一.内存布局 1.从低地址到高地址分别为:代码段.数据段.BSS段.堆.栈 2.堆向高内存地址生长 3.栈向低内存地址生长 二.数据存放 1.代码段:代码,全局常量(const).字符串常量   2.数据段:全局变量(初始化以及未初始…
Core Dump定义 Core Dump又叫核心转存.当程序在运行过程中发生异常,Linux系统可以把程序出错时的内存内容存储在一个core文件中,这个过程叫Core Dump. Core Dump主要用来对付Segment fault错误.Linux应用程序在运行过程中,经常会遇到Segemt fault(段错误)这样的错误.产生这样错误的原因通常有: 数组访问越界 访问空指针 栈溢出 修改只读内存 Core Dump使能 在Linux系统中,默认是关闭core dump功能的,但是可以通过…
Linux应用程序在内存中的布局,由高地址到低地址依次为:栈.堆.BSS段.数据段.代码段.代码段的起始地址固定为0x8048000,无论哪一个应用程序它的代码段起始地址一定是0x8048000,这里的地址虚拟地址,映射到不同的物理地址中去. 查看程序各段的地址 ps    aux     这个命令用于查看进程的ID,比如我运行一个可执行程序addr 可以看到addr的进程ID是24048.然后用cat命令查看进程在内部的布局 cat    /proc/进程ID/maps,这里我们是cat   …
程序构成 在学习Linux应用程序开发时,经常会遇到如下概念: 代码段.数据段.BSS段(Block Started by Symbol,又名:未始化数据段) .堆(heap)和栈(stack).始化数据段) .堆(heap)和栈(stack).而这些部分也是构成Linux应用程序的重要组成部. 1.从低地址到高地址分别为:代码段.数据段.BSS段.堆.栈 2.堆向高内存地址生长3.栈向低内存地址 数据存放 1.代码段:代码,全局常量(const).字符串常量 2.数据段:全局变量(初始化以及未…
Linux内核制作步骤 1.清除原有配置 make distclean 2.配置内核 选择一个已有的配置文件简化配置 make menuconfig ARCH=arm 3.编译内核 ARCH指明处理器架构,CROSS_COMPILE指明交叉工具链.在编译uImage会显示找不到mkImage工具.该工具是用来给zImage加上uboot启动时检测的头部信息的.该工具在uboot的tools文件夹下,直接复制到系统根/bin/目录下就可以了. make uImage ARCH=arm CROSS_…
V4L2摄像编程模型 1.打开摄像头设备文件 2.获取驱动信息-VIDIOC_QUERYCAP 3.设置图像格式-VIDIOC_S_FMT 4.申请帧缓冲-VIDIOC_REQBUFS 5.获取帧缓冲的地址长度信息-VIDIOC_QUERYBUF 6.使用mmap把内核空间的帧缓冲映射到用户空间 7.帧缓冲入队列-VIDIOC_QBUF 8.开始采集图像-VIDIOC_STREAMON 9.取出帧缓冲(出队)-VIDIOC_DQBUF 10.访问帧缓冲 11.帧缓冲重新入队-VIDIOC_QBU…
AT24C08的驱动在Linux内核中已经提供,在/drivers/misc/eeprom/at24.c文件中.在对应的probe函数中有一个创建/sys/.../eeprom文件的函数,应用程序通过调用/sys/.../eeprom设备文件来对设备进行读写操作. 移植AT24C08驱动 1.修改内核注册eeprom设备 在kernel/linux-mini2440/arch/arm/mach-s3c2440.c中的machine_init下注册IIC设备. mach-mini2440.c st…
MTD设备概述 Flash在嵌入式系统中是必不可少的,它是bootloader.Linux内核和文件系统的最佳载体.在Linux内核中引入了MTD子系统为NOR Flash和Nand FLash设备提供了统一的接口,从而使得Flash驱动的设计大为简化. MTD使用体验 把系统烧写到Nand Flash后,通过命令cat /proc/mtd可以查看到Nand Flash的不同分区.每一个分区都是一个块设备,通过命令ls -l /dev/mtd* 可以查看到不同的分区块设备. 块设备驱动系统架构…
LCD裸机驱动回顾 1.LCD初始化 1.1.控制器初始化 1.2.端口初始化 1.3.指明了帧缓冲 2.LCD图形显示 2.1.将图形数据写入帧缓冲 Linux帧缓冲体验 把图片转换成开发板屏对应的宽高像素和颜色深度,然后把图片放到开发板文件系统中.通过cat image.bin > /dev/fb0命令把图片写入LCD帧缓冲,这样就可以在LCD屏上看到对应的图片.这个实验说明Linux下面一样使用了帧缓冲,并且帧缓冲变成了一个设备文件. Linux帧缓冲架构 应用程序通过把图像数据写入/de…
tty概念解析 在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备. 1.串口终端(/dev/ttyS*) 串口终端是使用计算机串口连接的终端设备.Linux把每个串口端口都看作是一个字符设备.这些串口设备所对应的设备名称是/dev/ttySAC0,/dev/ttySAC1... 2.控制台终端(/dev/console) 在Linux系统中,计算机的输出设备通常被称为控制台终端(console),这里特指printk信息输出到的设备./dev/co…
LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() 1.编译/安装驱动 make cp leddev.ko .../rootfs insmod leddev.ko 2.创建设备文件 mknod /dev/myled0 c 253 0 3.编译/运行应用程序 arm-linux-gcc -static ledapp.c -o ledapp cp ledapp .../rootfs ./ledadd 0 ./ledadd 1…
嵌入式软件层次 1.Bootloader 2.Linux内核 3.文件系统 编译U-Boot 1.解压uboot tar zxvf uboot.tar.gz 2.清除uboot make distclean 3.配置uboot make mini2440_config 4.编译uboot ARCH指定处理器架构,CROSS_COMPLIE指明交叉工具链 make ARCH=arm CROSS_COMPLIE=arm-linux- 5.下载uboot ./dnw u-boot.bin 300000…
[一跃进入C大门] 跳转方式 1.相对跳转:b或bl指令,通过计算两个地址之间的差值来给pc赋值相对跳转 2.绝对跳转:ldr指令,通过给pc直接赋值,完成绝对跳转 代码编写 1.在汇编代码中直接使用绝对跳转,跳转到C代码中,然后在C代码中通过点亮LED来验证 2.210在跳转到C程序时,需要注意复制代码时,要跳过校验信息.要不然跳转到内存时,前16个字节为头信息,整个起始地址向后偏移了16个字节,就找不到正确地址了 [C与汇编混合编程] 为什么需要C与汇编混合编程 1.汇编语言:执行效率高,编…
数据库系统构成 在计算机系统中,保存数据的方式一般有两种: 1.普通文件方式 2.数据库方式 相比于普通文件方式,使用数据库来管理大批量数据具有更高的效率与安全性. 数据库系统一般由三个部分构成 1.数据库 2.数据库管理系统 3.数据库访问应用 sqlite属于数据库管理系统.在数据库中,数据都是以表的形式存在.表与表之间,可能存在关系.sql(结构化查询语言),是一种特殊的编程语言,用于访问数据库中的数据. 移植sqlite到开发板 1.解压 tar zxvf sqlite-autoconf…
未加密传输的安全弊端 如果在网络传输中没有加密,就是以明文传输.传输的数据可以被抓包软件直接截获,并能读取里面的数据. 加密基本原理 1.对称加密 2.非对称加密 2.1.公钥私钥 公钥和私密要配对.公钥加密的数据用私钥来解密,私钥加密的数据用公钥来解密. 2.2.数字证书 当公钥被替换成别的公钥之后,替换前对应的私钥就不能解密了,只能用替换后对应的私钥解密.但是并不能判断公钥是否被替换.所以引入数据证书的概念.数字证书由权威机构发布,所以无法伪造.并且数字证书里面包含公钥和对应所有者信息,所以…
CGI程序(Common Gate Way Interface) 在服务器外部供服务器调用的程序,CGI程序与服务器配合后能让服务器完成更强大的功能. 1.浏览器通过HTML表单或超链接请求指向一个CGI应用程序的URL. 2.服务器收发到请求. 3.服务器执行指定所CGI应用程序. 4.CGI应用程序执行所需要的操作,通常是基于浏览者输入的内容. 5.CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页). 6.网络服务器把结果返回到浏览器中. 移植CGI库 1.解…
查看USB设备的生产商ID和设备ID 示例: lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 生产商ID是1d6b,设备ID是0002 创建USB总线型字符设备 usb_register_dev   //效果同cdev创建字符设备效果相同 创建的主设备号都是180,次设备号可以设置为100 头文件 <linux/usb.h> usb.c /*********************************…