嵌入式Linux学习笔记之第一阶段---基础篇
嵌入式Linux学习分五个阶段
第一阶段:
01嵌入式环境搭建初期
02C语言语法概述
03C语言内存操作
04c语言函数
05linux基础
06gun基础
第二阶段:
01-linux之io系统编程
02-linux进程间通信
03-linux多线程
04-linux网络编程基础
第三阶段:
01-ARM开发板基础知识
02-ARM汇编语言
03-ARM硬件开发基础
04-ARM Bootloader开发
05-ARM硬件接口开发
第四阶段:
01-移植搭建
02-uboot、UART、DDR2、board_init、根文件系统、linux内核分析
03-字符设备驱动、linux驱动中断剖析、input子系统学习
04-内核、IIC设备驱动学习
第五阶段:
项目开发实战
以下是第一阶段的学习笔记:
1、实验室一个老铁的笔记:https://www.cnblogs.com/kb19970405/p/11075257.html
2、我自己做的笔记:
一、C语言基础篇 1、内存分布思想 内存的属性:①大小;②在哪里 %p看地址 代码段 只读数据段R 全局的数据空间RW(初始化和未初始化的) 运行时的堆空间(malloc) 栈空间(局部变量) 内核空间(应用程序不许访问) 2、内存分布之只读空间 代码段 只读数据段(字符串常量) 3、内存分布之数据段 未初始化的全局数据---》bss 初始化全局数据--------》data 函数中static int a------》bss 4、内存分布之堆空间 运行时,可以自由,自我管理的分配和释放的空间,生命周期由程序员决定 malloc() free() 5、函数 标签---------函数名(地址) 函数三要素:函数名(地址);输入参数;返回值----------》告知编译器 指针表示函数:int (*p)(int,int, char); 6、连续空间传递:字符空间和非字符空间 (地址) 数组 结构体----结构体变量 7、连续空间只读性 void fun(char *p)(给空间可被修改);---------------void fun(const char *p);(只读) 8、函数输入的字符空间----------内存里面存放了0x00作为结束符 char *p 空间:空间首地址+结束标志 int strlen(const char *p); 9、函数输入的非字符空间--------数量 unsigned char *p void fun(unsigned char *p,int len); void* :数据空间的标识符 void *memcpy(void *dest, const void *src, size_t n); int fun(void *buf, int len); { unsidgned char *tmp=(unsigned char*)buf;//强制类型转换 } 10、函数返回值:基本数据类型、指针类型 (静态区、只读区、堆区) 拷贝 int *fun(void);------------->void fun(int **p);更新地址 11、返回连续空间类型-----指针类型 int *fun(); int *p=fun(); 返回地址:合法性(不是局部变量(特别是函数中定义的局部变量(除非加static静态或者用malloc(堆)申请)作为返回))-------重点 *12、static的作用: 修饰局部变量:局部静态化,局部变量在静态数据段存在,生存周期非常长 修饰全局变量:防止重命名,限制变量名只在本文件内起作用 修饰全局函数:防止重命名,限制函数名只在本文件内起作用 13、const: C:只读,建议性 C++:常量 14、volatile: 防止C语言编译器的优化 它修饰的变量,该变量的修改可能通过第三方来修改 *15、地址0x67a9存储整型变量0xaa66----------》*((int*)0x67a9)=0xaa66 二、Linux操作系统基础篇 1、Linux组成结构: 硬件--》内核--》shell和一些工具--》用户 |--》文件系统 2、文件类型: 普通文件 - 目录文件 d 链接文件 l 块设备 b 字符设备 c Scoket s 管道文件 p 3、命令行别名 alias 列出已经建立的别名列表 alias alias-name(you want)= 'value'(原本) 建立别名 unalias alias-name 取消别名 4、通配符:①*0个或多个;②?单个;③[xx]某个范围内的任意一个字符 5、输入输出重定向 >:将一个命令的输出放入文件而非屏幕 >>:不会把原文件覆盖,在原文件末尾追加 <:从标准输入设备键盘输入 6、管道符:| 将一个进程的输出作为另一个进程的输入 7、%:作业控制,提示符等 $ :取某一列的值,取变量值等 8、创建文件:touch filename 不存在就新创,存在则修改 创建目录:mkdir [-p] directory_name -p 目录不存在则创建 删除文件:rm ~~ -i(询问是否删除) -f 强制删除 删除目录:rmdir ~~ -r(删除非空目录) -i(询问) 9、拷贝目录: cp -r ~原~ ~目~ 10、文件目录权限 chmod 修改文件目录的访问权限 字母(u\g\o\a = r\w\x) 数字八进制表示 chown 更改某个文件或目录的属主和属组,可用于授权 chgrp 改动文件或目录所属的组 11、文件目录查找 find locate 12、grep 查找包含某些字符串的结果,对文件或输出结果进行过滤,大小写敏感 -i 忽略大小写 -v反向匹配 13、wc 统计文件或输出结果 -i 统计多少行 -w统计多少个单词 -c统计多少个字符 14、du 显示磁盘使用摘要信息 df 显示整个文件系统的空间使用磁盘情况 15、编译过程: -c 只编译不连接,生成目标文件.o -S 只编译不汇编,生成汇编代码 -E 只预编译 -g 包含调试信息 -o file 指定目标输出文件 -I dir 搜索头文件路径 16、静态链接库和动态链接库 .a[libname.a] .so[libname.so.[主版本号.次版本号发行号.]] -static 静态链接 -shared 生成动态库文件,进行动态编译 -L dir 库文件搜索中添加路径 -f PIC 生成使用相对位置无关的目标代码 17、编译静态链接库 1、先生成目标文件.o 2、ar crv [*.a] [*.o] 18、调用静态链接库 gcc -o [file] [file.c] -L. [file.a] 19、编译动态链接库 1、生成位置无关的目标代码 gcc -fPIC -c [*.c] 2、gcc -shared -o [*.so] [*.o] 20、调用动态链接库 gcc -o [fle] [file.c] -L. [file.so] 21、gdb:调试工具 *22、makefile 的编写 targets(目标) :prerequistes(依赖) command(命令) *23、Autotools autoscan----aclocal----autoconf---- [autoheader]----automake
其它阶段会后续更新!!!加油(捂脸)