1.malloc工作原理: malloc使用一个数据结构(链表)维护分配空间
链表的构成:分配的空间/上一个空间数据/下一个空间/空间大小等信息.
对malloc分配的空间不要越界访问.因为容易破坏后台维护结构.导致malloc/free/calloc/realloc不正常工作.
2.有关__stdcall __cdecl __fastcall
<1>.决定函数栈压栈的参数顺序. <2>.决定函数栈的清空方式 <3>.决定了函数的名字转换方式.
__cdecl
这是编译器默认的函数调用转换方式,它可以处理可变参数的函数调用。参数的入栈顺序是从右向左。在函数运行结束后,由调用函数负责清理入栈的参数。在编译时,在每个函数前面加上下划线(_),没有函数名大小写的转换。即_functionname
每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。
__fastcall
有一些函数调用的参数被放入ECX,EDX中,而其它参数从右向左入栈。被调用函数在它将要返回时负责清理入栈的参数。在内嵌汇编语言的时候,需要注意寄存器的使用,以免与编译器使用的产生冲突。函数名字的转换是:@functionname@number没有函数名大小写的转换,number表示函数参数的字节数。由于有一些参数不 需要入栈,所以这种转换方式会在一定程度上提高函数调用的速度。
__stdcall
函数参数从右向左入栈,被调用函数负责入栈参数的清理工作。函数名转换格式如下:_functionname@number
3.虚拟内存: 虚拟地址与物理地址映射的时候有一个基本单位: 4k 一个内存页. 如果虚拟地址没有映射到物理地址,试图用指针访问必定发生段错误
4.分配释放内存函数: int brk(void *end);//分配空间,释放空间
void *sbrk(int size);//返回空间地址
sbrk(int size)
sbrk与brk后台系统维护一个指针.
指针默认是null.
调用sbrk,判定指针是否是0,是:得到大块空闲空间的首地址初始化指针.
5.映射虚拟内存函数:
mmap(分配)/unmap(释放)
void *mmap(
void *start,//指定映射的虚拟地址 0由系统指定开始位置)
size_t length,//映射空间大小 pagesize倍数
int prot,//映射权限 PROT_NONE | PROT_READ PROT_WRITE PROT_EXEC
int flags,//映射方式
int fd,//文件描述符号
offset_t off);//文件中的映射开始位置(必须是pagesize的倍数)
映射方式:
内存映射:匿名映射。
文件映射:映射到某个文件 只有文件映射最后两个参数有效。
MAP_ANONYMOUS
MAP_SHARED MAP_PRIVATE(二选一)
6.编译工具与动态库:
<1> gcc
-o 输出文件名
-O -O0 -O1 -O2 -O3 编译优化
-g -g0 -g1 -g2 -g3 产生调试信息
-W all error
-Wall 显示所有警告
-Werror 把警告当错误
-w 关闭警告
-c 只编译不连接
-E 预编译
-S 汇编
-D 在命令行定义宏。
在代码中定义宏
在命令行定义宏
-x 指定编译的语言类型
c++
c
.S
none 自动判定
-std=C89
C99
编译过程:-E -c -S 自动调用连接器
连接器 ld
补充:
.c
.cpp
.CC
.h
.hpp
.o
.a
.so
.i 预编译文件
.s 汇编文件
<2>
1.编译过程(*.a achieve)
1.1.编译成目标文件
-static 可选
gcc -c -static 代码文件.c
1.2.归档成静态库
ar工具
ar -r || -t
ar -r 静态库文件 被归档的文件
nm工具(察看函数符号表)
nm 静态库或者动态库或者目标文件或者执行文件
1.3.使用静态库
gcc 代码 静态库
2.库的规范与约定
库命名规则:
lib库名.a.主版本号.副版本号.批号
lib库名.a
库使用规则
-l 库名
-L 库所在目录
<3>.动态库的编译
1.什么是动态库?(共享库)
动态库是可以执行,静态库不能执行
但动态库没有main,不能独立执行。
动态库不会连接成程序的一部分。
程序执行的时候,必须需要动态库文件。
2.工具
ldd 察看程序需要调用的动态库
ldd 只能察看可执行文件.
readelf -h 察看执行程序头.
nm 察看库中的函数符号
3.动态库的编译
3.1.编译
-c -fpic(可选)
3.2.连接
shared
4.使用动态库
gcc 代码 动态库文件名
gcc 代码 -l库名 -L动态库所在路径
标准命名规则:
lib库名.so
lib库名.a
-l 库名 -L 库所在路径
<5>使用libdl.so库
动态库加载的原理 动态库中函数的查找已经封装成库libdl.so
dlopen 打开一个动态库
dlsym 在打开动态库找一个函数
dlclose 关闭动态库
//dlerror 返回错误
7.make工具的使用:
(1). vi demo.mk
(2)编辑: demo:
gcc -c -fpic test1.c
gcc -c -fpic test2.c
gcc test1.o test2.o -shared -o libtest.so
gcc main.c -l test -o main -L.
(3).执行demo.mk文件:
make -f demo.mk demo
注意:须将libtest.so 库文件拷贝到/lib或usr/lib目录下
8.使用main方法参数获得环境变量:(直接获取可以用env)
int main(int argc,char*argv[],char**arge)
{
while(*arge)
{
printf("%s\n",*arge);
arge++;
}
}
9.IO基础
<1>.认识内核对象
不允许访问内核设备和内存,
但可以通过内核系统函数去访问.
对每个内核对象进行编号ID.
如果访问内核对象,只能通过ID.
编程模型:
申请得到一个ID
在内核系统函数中使用ID得到对应内核对象数据
<2>.怎么访问文件
使用函数,传递一个文件,系统打开文件,加载文件数据,
返回一个ID.
使用函数,传递ID,得到数据.
使用函数传递ID,告诉系统释放文件.
ID:文件描述符号.file description (fd)
每个程序执行的时候都有一个目录,存放打开的文件描述符号
<3>.每个程序默认打开三个文件设备:
0:标准输入
1:标准输出
2:错误输出
<4>.操作文件描述符号
ssize_t write(int fd,
void *buf,//要写入内核对象的数据
size_t size);//写入数据大小
返回:
>0 实际写入的数据
-1 写入错误
ssize_t read(int fd,
void *buf,//返回数据的空间
size_t size);//空间大小
返回:
>0:实际读取的数据
=0:碰到文件结束符号EOF (ctrl+d)
-1:读取错误
建议:
0:输入
1:输出
2:错误输出
<5>.linux系统下文件的类型:
目录文件d
普通文件f
字符设备文件c
块设备文件b
软连接文件l
管道文件p
socket文件s
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ExtJs学习笔记之学习小结LoginDemo
ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 点滴的积累---J2SE学习小结
点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...
- (转) Parameter estimation for text analysis 暨LDA学习小结
Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...
- dubbo学习小结
dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...
随机推荐
- C++的单例模式与线程安全单例模式(懒汉/饿汉)
1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实 ...
- 重装win7、vs15、sqlserver08、驱动经验教训
问自己:为什么要进行系统清洗 1.C盘已经接近爆满,vs2015无法安装. 2.C盘以前的残留软件.文件不知道如何化解,原vs2010卸载困难. 3.整个系统反应迟缓. 改进方案: 1系统C盘 2软件 ...
- sp_addlinkedserver '(null)' is an invalid product name
使用SSMS 2008客户端工具逆向生成了创建链接服务器的脚本时,在测试环境执行是报如下错误:'(null)' is an invalid product name. USE [master] GO ...
- 利用nagios搭建打印机监控服务器
实验背景:公司有很多台HP惠普打印机,管理起来比较麻烦.于是想着能否做个打印机监控服务器,能够快速响应打印机所出现的所有问题.之后上网查了相关资料搭建了一台,使用也没任何问题,于是便拿出来跟大家分享. ...
- 通过RTMP play分析FLV格式详解
最近做了一个rtmp中转服务程序,通过实践,熟悉rtmp play和push中各类格式,这里总结一下. 程序github地址: https://github.com/runner365/rtmp_re ...
- less简单入门
官网地址 http://lesscss.org/ less手册 www.lesscss.net/ bootstrap官网less介绍 http://www.bootcss.com/p/lesscss/ ...
- 解决Docker容器时区及时间不同步问题
今天在系统集成测试时由测试人员提交了一个测试bug,原因是提交业务数据时间与实际时间(北京时间)有偏差,导致统计异常.由于我们集成测试是向测试人员直接提供完整的Docker镜像作为测试环境,原因应该是 ...
- golang中的slice翻转存在以及map中的key判断
//slice翻转 func stringReverse(src []string){ if src == nil { panic(fmt.Errorf("the src can't be ...
- Hibernate第三次测试错题解析
此题目考查的是Hibernate查询缓存适用的场合,对于经常使用的查询语句, 如果启用了查询缓存,当第一次执行查询语句时,Hibernate会把查询结果存放在第二缓存中. 以后再次执行该查询语句时,只 ...
- Jenkins学习四:Jenkins 邮件配置
本文主要对Windows环境 jenkins 的邮件通知进行介绍 jenkins 内置的邮件功能 使用email-ext插件扩展的邮件功能 邮件通知功能主要包含两个部分:全局配置和项目配置. 一. 先 ...