- 博客(115)
- 收藏
- 关注
原创 char *p = “abcd“; 和 char a[] = “abcd“的区别?
答案:指针p和字符数组都是在栈区,其中,“abcd"字面值在常量区,上面的区别是字符数组a会把常量区的"abcd"拷贝到栈中。那么字符数组a可以修改其中的元素,但指向字符的指针不能修改其指向的字符"abcd”。请问:char *p = “abcd”;和 char a[] = "abcd"的区别?指针p存储在什么区?
2024-12-13 11:09:22
389
原创 进程调度相关
中断处理过程(时钟中断、IO中断、系统调用和异常)中直接调用schedule(),或者返回用户态时,通过检查need_scheduled的标志来调用schedule()。内核线程可以直接调用schedule()进行进行进程切换,也可以在中断处理过程中进行调度,也就是既支持。
2024-09-12 13:46:46
257
原创 ELF文件格式、可执行程序装载、动态链接
当同时使用 -static 和 -l 时,gcc 会尝试找到指定库的静态版本(.a 文件)而不是动态版本(.so 文件)。-static 和 -l 参数可以同时使用,但它们的组合会产生一些特殊的效果。如果只能找到动态库,gcc 会报错,因为 -static 要求所有链接都是静态的。如果是动态链接某个动态库的可执行程序话,会先加在连接器。静态链接意味着所有的库函数都会被直接包含在最终的可执行文件中。的时候,此时elf_entry指向的是动态连接器ld。如果找到了静态库,它会被完全包含在最终的可执行文件中。
2024-09-10 16:45:35
333
原创 函数调用堆栈分析(32位系统,linux AT&T汇编指令)
call: 将当前cs:eip的值(此时cs:eip执行call这条指令的。(TIPS: 早期编译器变量声明都要在函数开头,就是为了方便计算空间大小)ret: 从栈顶弹出原来保存在这里的cs:eip的值,放入cs:eip中。)压入栈顶,cs:eip指向被调用函数的入口地址。ebp: 基址指针(base pointer)enter //建立被调用者函数的堆栈框架。leave //拆除被调用者函数的堆栈框架。cs: eip总是指向下一条指令地址。其实就是在准备存储局部变量的空间。完,构建好函数框架之后,
2024-09-02 17:32:22
425
原创 PE——节表结构
联合体节表数据结构① Name:8个字节,内容可自定义,需要注意的是该名称并不遵守必须以"\0"结尾的规律,如果不是以"\0"结尾,系统会截取8个字节的长度进行处理.我们在读取的时候需要小心!可以使用char[9]然后拷贝8个字节② Misc:该节在没有对齐前的真实尺寸...
2022-03-11 15:27:53
393
原创 使用按位与运算(&)巧妙实现求模运算(%)
static int indexFor(int h, int length) { return h & (length-1);}我们在进行hash相关的计算操作时,经常会涉及到求模运算,如上面的算哈希映射位置的代码。前提:length是一个2的幂次方整数,这样,length-1 的二进制就是一个形如“0000111…”的数,比如,如果length=4,length-1=3,其二进制表示为“0011”,如果length=8,length-1=7,其二进制表示为“0111”,以此类推。将h
2022-03-10 15:44:17
572
原创 PE——PE基础结构分析
PE结构总体结构IMAGE_NT_HEADERS包含了标准PE头IMAGE_FILE_HEADER和可选PE头IMAGE_OPTIONAL_HEADER。//DOS头typedef struct _IMAGE_DOS_HEADER { WORD e_magic; WORD e_cblp; WORD e_cp; WORD e_crlc; WORD e_cparhdr; WORD e_minalloc; WORD e_maxalloc; WORD e_ss; WORD e_sp;
2022-03-08 16:38:23
438
原创 ubuntu20.04+windows10_1909显卡直通(GPU Passthrough)
休息的时候看到了Nvidia放开了个人显卡在虚拟机里使用的操作权限,就花了点时间研究了下,最终的目的是能在win虚拟机里流畅地打游戏~这里记录下踩过的坑。cpu支不支持虚拟化和你开没开虚拟化是俩玩意。网上的教程里都是让你敲命令检查cpu支不支持虚拟化,我一敲,支持,就没再管,可是后来VFIO开不开,研究半天才发现是CPU虚拟化没开,重新进bios开下就可以了。网上的很多教程在开了VFIO相关模块重启后,使用了lsmod去查vfio模块开没开,但是在ubuntu20.04系统里已经将VFIO模块内置在
2022-02-22 19:29:25
3830
2
原创 const char * 、char const *、 char * const 三者的区别
const char * ptr 等价于 char const * ptr定义一个指向const char的指针。不能通过ptr来修改所指向的内容,指针指向的内容不可变,但指针本身可以再赋值char * const ptr定义一个指向char的指针常数。即const指针,不能修改ptr指针,但是可以修改该指针指向的内容。...
2022-02-08 17:09:52
490
转载 汇编——数据定义伪指令助记符DB DD DQ DT以及全称
DB 定义的变量为字节型 Define ByteDW 定义的变量为字类型(双字节)Define WordDD 定义的变量为双字型(4字节)Define Double WordDQ 定义的变量为4字型(8字节)Define Quadra WordDT 定义的变量为10字节型 Define Ten Byte...
2022-02-07 16:38:44
4777
原创 汇编——32位汇编基础框架
代码.586.model flat,stdcalloption casemap:noneincludelib ucrt.libincludelib legacy_stdio_definitions.libincludelib User32.libincludelib Kernel32.libMessageBoxA PROTO hwnd:DWORD,lpText:BYTE,lpCaption:BYTE,uTyoe:DWORDExitProcess PROTO uType:DWORD.
2022-02-07 15:37:08
3959
原创 汇编——16位汇编&调试&一些练习代码
编译:ml 1.asm调试:debug 1.exe调试命令:r 查看当前位置代码;p 单步步过;t 单步步入;u 查看附近代码d 0b3b 查看0b3b位置内存;g 运行程序16位汇编代码基本结构assume cs:code,ds:datadata segmentbuffer db 'xxxx$'data endscode segmentrkmain proc mov ax,data mov ds,ax mov dx,offset buffer mov ah,09H .
2022-02-07 10:58:31
1168
原创 汇编——段寄存器
CS段只有16位,8086CPU有20根地址线,地址该如何存储呢?答:地址除以16(十进制),此时地址以0结尾(十六进制)作为段地址。IP:指令指针寄存器,存储了指令的偏移地址CS:代码段DS:数据段ES:拓展段(和DS使用功能差不多)SS:栈段...
2022-01-30 12:38:40
501
转载 #program once 和 #ifndef
#program once 和 #ifndef在写小demo的时候,注意到vs中会自动生成#program once;看别人写的代码的时候见到比较多的反而是#ifndef—#define—#endif;从字面上看两种方式会产生相同的效果:避免同一个文件重复包含多次,但知道两种方式的本质还是有必要的。#program once:“同一个文件”指存储在相同位置的文件,即物理位置下相同;当编译器意识到文件存储位置向同事便会跳过“副本文件”,仅仅编译一次该物理位置的文件;但如果发生拷贝情况,便会出现重复包含的情
2022-01-29 14:00:36
5349
2
原创 汇编——电路基础(计算机组成基础)
寄存器 = 一组锁存器地址线——决定取址范围控制线——CPU对外部器件的控制能力。例如决定是读是写(一般低电平是读)数据线——用来传输数据指令的概念 = 硬编码CPU的雏形
2022-01-29 13:57:56
954
原创 Visual Studio快捷键
编译&运行&调试Ctrl + F7 编译F5 运行Shift + F5 停止调试Ctrl + F5 运行(不调试)F9 下断点F10 单步步过F11 单步步入监视窗口 err,hr 显示错误码和错误说明。(或 工具——错误查找,手动输入错误码查找)编码创建函数声明/定义。(函数名右键——快速操作和重构——创建声明/定义)F12 跳转到定义Ctrl + F12 跳转到声明Alt + 方向键上下 整行移动一行代码...
2022-01-29 12:38:07
1715
原创 C语言与汇编——宏定义,头文件重复包含,内存申请和释放
.c文件 -> 替换 -> 编译 -> 链接 -> exe文件typedef 只能给变量类型起别名。而#define可以给任何东西起别名。头文件重复包含问题#pragma once也能避免同一个头文件被包含(include)多次一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。内存申请和释放..
2022-01-19 17:49:22
829
原创 汇编基础——算术移位,逻辑移位,循环移位,带进位的循环移位
算术左移和逻辑左移一样都是右边补0逻辑右移只要将二进制数整体右移,左边补0即可。算术右移二进制数整体右移后,左边要补上符号位。算术左移和算术右移主要用来进行有符号数的倍增,减半;逻辑左移和逻辑右移主要用来进行无符号数的倍增。减半。...
2022-01-18 10:21:08
3382
2
原创 C——数组指针
为什么px 与*px的地址值是一样的?#include "stdafx.h"int main(int argc, char* argv[]){ int arr[16] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }; int(*px)[2]; //宽度:4 printf("%d\n", sizeof(px)); //赋值 px = (int(*)[2])arr; printf("%d\n", px); px++; .
2022-01-16 17:35:11
220
转载 strcpy及memcpy的内存重叠处理
strcpy和memcpy同是一个类型的函数,但实质上却是不同的,他们的原型分别为:char *strcpy(char *dest, const char *src);void *memcpy(void *dest, const void *src, size_t count);当我们使用这两个函数时都会出现同样一个问题,内存重叠。那么我们就来分析一下内存重叠是如何产的。现在假设有char *d = dest; char *s = src;要复制count = 5个字符,如下图所示:1、第一种
2022-01-06 10:16:09
1616
原创 C语言与汇编——switch语句反汇编;do...while语句反汇编;while语句反汇编;for语句反汇编
编译器会根据switch的分支个数来调整生成的汇编代码。例如:在vc6.0编译器中,当分支个数小于4时,switch语句和if语句翻译成的汇编代码没有区别;当分支个数大于等于4时,switch语句的汇编代码变成了jg [edx*4+第一个分支代码的内存地址],其中,edx为switch (x)语句中x与最小情况的差值。此时各分支的内存地址排列称为大表。switch语句的常量表达式顺序不影响生成的汇编代码。switch语句的常量表达式大小不影响生成的汇编代码。关键点:连续。...
2021-12-24 11:32:26
999
原创 C语言类型长度(int,long,long long)
不同系统下的C语言类型长度绝大部分64位的Unix,linux都是使用的LP64模型;32位Linux系统是ILP32模型;64位的Windows使用的是LLP64(long long and point 64)模型。
2021-12-21 16:38:49
1180
原创 c语言与汇编——参数/返回值/局部变量本质,数组反汇编
1、返回值是如何传递的?根据返回值类型,选择 正确大小的寄存器存储函数结果。2、参数传递的本质3、局部变量的内存分配4、数组的本质5、数组越界,基于缓冲区溢出的HelloWorldarr[6] = (int)HelloWord;这里相当于把HelloWord()函数的地址写到了堆栈中ebp+4的位置(本来应该存储的是CALL指令下一条指令的地址),导致Func()执行完ret时,eip变成了HelloWord()函数的地址。6、多维数组...
2021-12-21 16:20:47
257
原创 为什么中断上下文中不能睡眠
中断发生以后,CPU跳到内核设置好的中断处理代码中去,由这部分内核代码来处理中断。这个处理过程中的上下文就是中断上下文。为什么可能导致睡眠的函数都不能在中断上下文中使用呢? 首先睡眠的含义是将进程置于“睡眠”状态,在这个状态的进程不能被调度执行。然后,在一定的时机,这个进程可能会被重新置为“运行”状态,从而可能被调度 执行。 可见,“睡眠”与“运行”是针对进程而言的,代表进程的task_struct结构记录着进程的状态。内核中的“调度器”通过task_struct对进 程进行调度。但是,中断上下文却不是
2021-12-14 15:09:04
1288
原创 C语言与汇编——C语言基础与循环
1、变量的声明?什么是赋值?声明变量就是告诉计算机,我要用一块内存,你给我留着,宽度和存储格式由数据类型决定.计算机什么时候把这块内存给你,取决于变量的作用范围。如果是全局变量,在程序编译完就已经分配了空间,如果是局部变量,只有所在的程序被调用的时候,才会分配空间.全局变量如果不赋初始值,默认是0,但局部变量在使用前一定要赋初值(否则可能是垃圾值).2、类型转换MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.小转大:高位补符号位大转小:截去高位数据3、什么是表达式?表
2021-12-08 11:12:37
396
原创 c语言与汇编-内联汇编和调用约定
c语言与汇编-内联汇编和调用约定裸函数声明裸函数与普通函数的区别在于在函数前多声明了__declspec (naked)作用要讲裸函数的作用,就不得不提到裸函数与普通函数的区别裸函数与普通函数区别前面反汇编C语言的笔记里,我们可以得知一个普通空函数的反汇编代码并不少,保护现场、恢复现场等等都有,那么这些反汇编代码是如何产生的呢?答案是编译器会为我们产生这些反汇编代码相比之下,只要普通函数加上裸函数前缀转化为裸函数,编译器就会知道这个函数无需额外生成上面所说的保护现场、恢复现场等反汇编代码,
2021-11-22 16:22:46
451
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人