动态链接
。
内存空间分布:在linux中,每个进程都有自己独立的4G内存空间。其中内核会用3G以上的1G虚拟内存地址,0-3G的虚拟内存空间可以被一个进程的用户态或内核态访问,但3-4G只能被进程的内核态访问。这里讲的空间是可以寻址的空间,不是说每一个进程都可以用满4G空间。3-4G中,896M是直接映射到物理地址的,128M按需映射896M以上的所谓高位内存。内核用的896M虚拟地址是直接映射的,意思是只要把虚拟地址减去一个偏移量(3G)就等于物理地址。各进程用的是同一个内核(内核区对于所有进程是共享的;系统中所有进程对应的虚拟地址空间的内核区都会映射到同一块物理内存上(系统内核只有一个))。同样,这里指的还是寻址,实际使用前还是要分配内存。而且896M只是个最大值。如果物理内存小,内核能使用(分配)的可用内存也小。
为什么地址不冲突:一个进程用到的虚拟地址是由内存区域表来管理的,实际用不了4G。而用到的内存区域,会通过页表映射到物理内存。所以每个进程都可以使用同样的虚拟内存地址而不冲突,因为它们的物理地址实际上是不同的。每个进程进程一个页表,页表的起始地址放在进程的pcb中,当某进程运行时 ...
程序员的自我修养-第四章-静态链接
.
链接方式:相似段合并,主要分为两步:
链接方式: ld a.o b.o -e main -o ab,
不知道为什么会一直报这个错 a.c:(.text+0x4f): undefined reference to `__stack_chk_fail’
解决方法,在编译时加上 -fno-stack-protector标志,注意不是在链接时加
123456789ttj@ttj ~/copy [1]> gcc -c a.c -fno-stack-protector -o a.oa.c: In function ‘main’:a.c:4:1: warning: implicit declaration of function ‘swap’ [-Wimplicit-function-declaration] 4 | swap(&a, &shared); | ^~~~ttj@ttj ~/copy> gcc -c b.c -fno-stack-protector -o b.ottj@ttj ~/copy> ld a.o b.o -e ...
常见排序算法
。
冒泡排序12345678910111213141516171819202122232425#include "bits/stdc++.h"using namespace std;/** * flag == 1 从小到大 * flag == 2 从大到小*/int bubbleSort(vector<int> &vec, int flag){//冒泡排序 int temp; for(int i = vec.size()-1; i > 0; i--){ for(int j = 0; j < i; j++){ if(vec[j] > vec[j+1] && flag == 1){ vec[j+1] = vec[j+1]^vec[j];//这样使用虽然可以提高速度,但是一定要保证变换的是两个量,否则会出错 vec[j] = vec[j+1]^vec[j]; ...
程序员的自我修养-第三章
.
linux 环境下,可以使用 file 命令查看 elf 文件类型
目标文件一个简单的目标文件
文件头描述了文件的文件熟悉:是否可执行,目标硬件,段表等。段表描述了文件中各个段在文件中的偏移位置及段的属性等。
.text 保存编译后的机器代码
.data 保存已初始化的全局变量和局部静态变量
.bss 保存未初始化的全局变量和局部静态变量(局部变量会保存到栈中),.bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以它在文件中也不占据空间。
之后使用如下文件进行分析
使用 objdump 工具可以查看 object 文件的结构。(linux 下还有个工具 readelf 可以解析 elf 文件格式)
1objdump -h SimpleSection.o
与书籍内容类似:
他的 ELF 结构:
代码段objdump 的 -s 参数可以把所有段的内容以十六进制打印出来
objdump 的 -d 参数可以把所有包含指令的段反汇编
objdump -s -d SimpleSection.o
对比反汇编的开始和结束f3, ...
程序员的自我修养-第二章
。
从源文件到目标文件的整个流程1gcc hello.c
预处理(Prepressing)
编译(Compilation)
汇编(Assembly)
链接(Linking)
预处理(预编译)12gcc –E hello.c –o hello.i 或者cpp hello.c > hello.i
主要用于删除/替换宏定义,处理 #include 指令,删除注释,添加行号,文件名标识便于调试,保留 #pragma 编译命令
编译123gcc –S hello.i –o hello.s 或者cc1 hello.c(cc1可以完成预编译和编译)或者gcc –S hello.c –o hello.s
完成词法分析,语法分析,语义分析,优化后生成汇编代码文件。
汇编12as hello.s –o hello.o 或者gcc –c hello.c –o hello.o
一条汇编语言对应一条机器指令,汇编器要完成的任务很简单,将汇编指令翻译为机器指令就行了。(计算标号地址算么)
链接12例子:$ld -static /usr/lib/crt1.o /usr/li ...
程序员的自我修养-第一章
信号量与互斥量的区别
根本区别,互斥量用于线程的互斥,信号量用于线程的同步
互斥量只能为0/1,信号量可以为非负整数
互斥量的一组加锁和解锁只能在同一线程内使用,信号量可以在一个线程内释放,另一个线程内得到。
二元信号量也是信号量,主要保证线程的同步,但因为是二元的,只用0,1两个状态,也只能同时允许一个线程访问。从这一点上看与互斥量类型,但二元信号量与互斥量并不是完全相同,二元信号量终究是信号量,主要保证同步,可以在不同线程申请,释放,互斥量在哪个线程申请就在哪释放。
野火的freertos书中,有这样一段话:
二值信号量和互斥信号量(以下使用互斥量表示互斥信号量)非常相似,但是有一些细 微差别:互斥量有优先级继承机制,二值信号量则没有这个机制。这使得二值信号量更偏 向应用于同步功能(任务与任务间的同步或任务和中断间同步),而互斥量更偏向应用于 临界资源的访问。
c++基础1
比c增加的特性bool, namespace, cin, cout, cerr(这三个不是关键字,是运算符重载,cout带缓冲,cerr不带缓冲)
引用类似指针,修改变量是不用指针那么麻烦还要去找地址了,声明时就必须进行初始化。之后使用原变量,新引用都可以正常修改该地址下的值。
1234int a = 10;int &b = a;cout<<a<<" "<<b<<endl;cout<<&a<<" "<<&b<<endl;
a,b的地址都一样,可以把b看作a的别名。
const 与 指针基础情况const放在 * 的左边 指针变量所指向的数据不能通过指针变量改变,但指针变量是可以改变的
123456789int main(){ int a = 10; int b = 20; const int* p = &a; //等价于 int const* p = &a; p = &b; //指针变 ...
freertos-任务创建
硬件初始化定义一个bsp_init初始化函数,把初始化外设的函数都放到那里面去,
1234static void BSP_INIT(void){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); LED_GPIO_Config(); //初始化led}
创建单任务——SRAM静态内存静态内存,即预先定义好的全局变量,这些变量保存值内部SRAM中。他们是运行前分配的,之前用ucos是就一直使用的是静态内存,
定义任务函数任务必须返回值,是死循环,要延时时,要使用freertos提供的延时函数,不能自己写一个for循环延时
123456789101112131415161718192021static void LED_Task(void* parameter){ while(1){ LED(ON); vTaskDelay(500); // 延时500个tick LED(OFF); vTaskDelay(500); // 延时500个tick & ...
freertos-移植
下载freertos源码FreeRTOS,准备一个stm32空工程。
解压后,FreeRTOS包含以下文件夹
demo:一些移植好的历程,包括stm32f103等,
license:略
source:源码,包括include(一些头文件),和portable(和编译器密切相关的文件,keil环境用RVDS)
将source下以.c结尾的文件移植到我们工程下面新建的src文件夹中,
将portable下MemMang文件夹和RVDS文件夹下cm3文件夹移植到我们工程下面新建的prot文件夹中,
将include文件夹移植到我们工程文件夹下。
拷贝freeRTOSConfig.s(demo工程下)到我们工程下
添加源码到工程组文件夹
指定头文件路径,主要是include文件夹,port文件夹和FreeRTOSConfig.h文件,
FreeRTOSConfig.h文件主要内容断言, freertos定义了一些断言接口 12#define vAssertCalled(char,int) printf("Error:%s,%d\ ...
test
。。。。。
本博客使用hexo框架搭配butterfly主题建立
首次建立博客主要参考了以下几篇文章:
GitHub+Hexo 搭建个人网站详细教程 - 知乎 (zhihu.com)
Butterfly 安裝文檔(一) 快速開始 | Butterfly
Markdown写作规范
建立过程中,遇到的最大的一个问题是typora的默认图片保存路径与hexo路径不符,导致图片无法显示,参考了这篇文章解决。
(8条消息) 解决:hexo+github本地和线上图片不显示问题_Donaghy的博客-CSDN博客
测试一下图片