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_…
嵌入式系统构成: 主要由bootloader.kernel.以及根文件系统三部分组成. 内核制作步骤: 制作嵌入式平台使用的linux内核制作方法与pc平台上的linux内核基本一致 1.清除原有配置与中间文件 x86:make distclean arm:make distclean 2.配置内核 x86:make menuconfig arm: make menuconfig ARCH=arm 3编译内核4 x86:make bzImage arm:make uImage ARCH=arm…
链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据.链表的开销主要是访问的顺序性和组织链的空间损失. 传统链表与Linux内核链表的区别 Linux内核链表是双向循环链表,提供一套统一的链表和操作函数.内核链表的节点由数据和指针两部分组成,不同的是指针不指向下一个节点的数据部分,而是指向下一个节点的指针部分. 内核链表的结构 struct…
Linux系统架构 1.用户空间:应用程序.C函数库 2.内核空间:系统调用接口.内核.体系结构相关代码 Linux系统利用处理器不同的工作模式,使用其中的两个级别分别来运行Linux内核与应用程序,这样使操作系统本身得到了充分的保护.内核空间与用户空间是程序执行的两种不同的状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的切换. Linux内核架构 1.系统调用接口 2.进程管理模块 3.内存管理模块 4.虚拟文件系统 5.网络协议模块 6.设备驱动模块 7.体系结构相关 Linux内…
进程与程序 1.程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体. 2.进程:是一个执行中的程序,它是一个动态的实体. 进程四要素 1.有一段程序供其执行.这段程序不一定是某个进程所专有,可以与其他进程共用. 2.有进程专用的内核空间堆栈. 3.在内核中有一个task_struct数据结构,也就是通常所说的进程控制块(PCB).有了这个数据结构,进程才能成为内核调度的一个基本单位,接受内核的调度. 4.有独立的用户空间. 如果有独立的用户空间,那么是进程:如果没独立的用户空间,…
什么是内核模块 Linux内核的整体结构非常庞大,其中包含的组件也非常多,如何使用这些组件.一种方式是把所有的组件都编译进内核文件,即zImage或bzImage,但这样会导致一个问题,占用内存过多.内核模块是一种能让内核文件本身并不包含某些组件,而是是在被需要使用的时候,动态地添加到到在运行的内核中的机制. 内核模块的特点: 1.模块本身并不被编译进内核文件 2.在内核运行期间动态的安装或卸载 内核模块的使用 1.安装内核模块 示例: insmod usb.ko 2,卸载内核模块 示例: rm…
嵌入式系统自启动 MTD技术通过把Nand FLash划分成bootloader分区,Linux kernel分区和file system分区来达到自启动的效果. 配置和编译内核 1.配置Linux内核支持MTD分区 make meunconfig ARCH=arm device drivers-><*>memory techology device(MTD) support->[*]MTD partitioning support->exit->save 2.找到内核…
MTD设备概述 Flash在嵌入式系统中是必不可少的,它是bootloader.Linux内核和文件系统的最佳载体.在Linux内核中引入了MTD子系统为NOR Flash和Nand FLash设备提供了统一的接口,从而使得Flash驱动的设计大为简化. MTD使用体验 把系统烧写到Nand Flash后,通过命令cat /proc/mtd可以查看到Nand Flash的不同分区.每一个分区都是一个块设备,通过命令ls -l /dev/mtd* 可以查看到不同的分区块设备. 块设备驱动系统架构…
嵌入式软件层次 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…
USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.USB client driver:为USB外部设备提供驱动程序 USB设备模型 device(设备)->config(配置)->interface(接口)->endpoint(端点),构成了USB设备的四个层次.一个usb driver(驱动)对应的是一个interface(接口).一个接口…
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…
LCD裸机驱动回顾 1.LCD初始化 1.1.控制器初始化 1.2.端口初始化 1.3.指明了帧缓冲 2.LCD图形显示 2.1.将图形数据写入帧缓冲 Linux帧缓冲体验 把图片转换成开发板屏对应的宽高像素和颜色深度,然后把图片放到开发板文件系统中.通过cat image.bin > /dev/fb0命令把图片写入LCD帧缓冲,这样就可以在LCD屏上看到对应的图片.这个实验说明Linux下面一样使用了帧缓冲,并且帧缓冲变成了一个设备文件. Linux帧缓冲架构 应用程序通过把图像数据写入/de…
本文转载自:http://blog.csdn.net/coding__madman/article/details/51291316 1. Linux体系结构 从整体上来分,linux可以分为User Space和Kernel Space构成,即用户空间和内核空间 用户空间:应用程序 C库 系统配置文件等 内核空间:在内存中,用户一般不能直接接触到(系统调用接口,体系结构相关的一些代码等等) 这样划分的的好处: 其实内核空间与用户空间是程序执行的两种不同的状态,通过系统调用和硬件中断能够完成从用…
今天来总结一下mini2440的内核制作过程. 一. 将内核文件拷贝至目标目录,解压. 二.清除中间文件 命令:make distclean 三.配置内核文件 将开发板厂商制作好的内核文件拷贝至内核文件目录,并命名为.config,退出保存. 这里有个特别坑的,就是老师给的内核文件在配置时保留了他自己PC的信息,所以我开始编译内核一直无法成功. 就是这个挨千刀的错误.解决办法嘛,其实也蛮简单,修改一下编译选项.            命令:make menuconfig ARCH=arm,然后找…
为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make menuconfig配置方法 1.菜单项的分类 processor type and features   处理器类型 networking support            网络协议支持 device drivers                设备驱动支持 file systems     …
1.解压boa嵌入式web服务 tar zxvf boa-0.94.13.tar.gz 2.进入src目录生成配置文件 ./configure 3.修改生成的Makefile CC=arm-linux-gcc CPP=arm-linux-gcc –E 4.修改源文件 4.1. vim util.c +100 time_offset = 0; 4.2. vim bao.c +211 去掉DIE();相关部分 4.编译 make 5.拷贝到根文件系统 cp boa .../rootfs/sbin 6…
内存管理子系统 1.虚拟地址与物理地址的映射 2.物理内存的分配 Linux虚拟地址空间分布 设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址.虚拟地址简单的来说就是程序中使用的地址.所以存在虚拟地址到物理地址之间的映射关系. Linux系统支持的虚拟地址空间由硬件来决定.例如处理器是32位,那么访问到的虚拟地址空间就是4G.0-3G是用户空间,也就是应用程序空间.3-4G是内核空间,内核空间又被划分为4个部分,第一个部分是直接映射区(3-3.896G),第二个部分是vmall…
内核模块示例 #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); 特点: 内核模块代码…
第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…
程序构成 代码段.数据段.BSS段(Block Started by Symbol,又叫:未初始化数据段).堆(heap)和栈(stack).这些部分构成了Linux应用程序的重要组成部分. 内存布局 1.从低地址到高地址分别为:代码段(0x8048000).数据段.BSS段.堆.栈. 2.堆向高内存地址生长. 3.栈向低内存地址生长. 查看程序段地址 cat /proc/进程号/maps 数据存放 1.代码段:全局常量 2.数据段:全局变量(初始化的以及未初始化的).静态变量(全局的和局部的,…
数据库系统构成 在计算机系统中,保存数据的方式一般有两种: 1.普通文件方式 2.数据库方式 相比于普通文件方式,使用数据库来管理大批量数据具有更高的效率与安全性. 数据库系统一般由三个部分构成 1.数据库 2.数据库管理系统 3.数据库访问应用 sqlite属于数据库管理系统.在数据库中,数据都是以表的形式存在.表与表之间,可能存在关系.sql(结构化查询语言),是一种特殊的编程语言,用于访问数据库中的数据. 移植sqlite到开发板 1.解压 tar zxvf sqlite-autoconf…
编程模型 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…
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…
查看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 /*********************************…
tty概念解析 在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备. 1.串口终端(/dev/ttyS*) 串口终端是使用计算机串口连接的终端设备.Linux把每个串口端口都看作是一个字符设备.这些串口设备所对应的设备名称是/dev/ttySAC0,/dev/ttySAC1... 2.控制台终端(/dev/console) 在Linux系统中,计算机的输出设备通常被称为控制台终端(console),这里特指printk信息输出到的设备./dev/co…
Bootloader作用 1.初始化软硬件 2.启动操作系统 内核分类 1.zImage 不加信息头的内核 2.uImage 加信息头后的内核,用bootm命令来启动 bootm作用 1.检测信息头:压缩.操作系统.幻数 2.根据OS信息调用相应的处理函数:获取内核地址.知道CPU型号.设置启动参数 代码编写 1.获取启动地址 2.设置启动参数 2.1设置核心启动参数 2.2设置内存参数 2.3设置命令行参数 2.4设置参数结束行标志 3.启动操作系统 /********************…
软件系统架构 1.主机端软件架构 USB设备驱动->USB核心->USB主控制器驱动->USB主控制器 2.设备端软件架构 Gadget驱动->Gadget API->UDC驱动->USB控制器 MassStrorage驱动体验(host 接口) 可以让主机挂载大容量存储器 1.主控器驱动配置 make menuconfig ARCH=arm device drivers->usb support->[*]support for host-side usb-…