自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

私のBookShelf

主博客https://yingmanwumen.top的部分迁移

  • 博客(176)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 diff命令实现

diff命令实现diff是类UNIX系统下的一个重要的系统工具,用于比较两个文本文件的差异。它有三种输出格式先给大家看看两个用于比对的文件原文file1:aebaghbggfile2:bcdgegjh格式一,普通格式:$ diff file1 file21,6d0< a< e< b< a< g< h7a2,3> c> d8a5> e9a7,8> j> h格式

2021-09-20 21:43:24 1159

翻译 【acwj】05,Statements 实现“Statements”

搬运自https://github.com/DoctorWkt/acwj,一个介绍如何使用C语言编写一个可自举的类C语言编译器的说明。进行了粗略的翻译。【acwj】05,Statements 实现“Statements”It ‘s time to add some “proper” statements to the grammar of our language. I want to be able to write lines of code like this:是时候在我们的语言语法中添加一.

2021-09-01 12:58:54 308

翻译 【acwj】04,An Actual Compiler 一个真正的编译器

搬运自https://github.com/DoctorWkt/acwj,一个介绍如何使用C语言编写一个可自举的类C语言编译器的说明。进行了粗略的翻译。【acwj】04,An Actual Compiler 一个真正的编译器It’s about time that I met my promise of actually writing a compiler. So in this part of the journey we are going to replace the interpreter.

2021-08-31 17:16:15 851

原创 【汇编】正确使用IDIV指令

【汇编】正确使用IDIV指令div为无符号除法,idiv为有符号除法idiv进行的是128 / 64位除法,即被除数为128位、除数为64位。64位操作系统中寄存器大小当然只有64位,因此,idiv使用rdx:rax作为被除数即rdx中的值作为高64位、rax中的值作为低64位因此,在使用idiv进行计算时,rdx中不得为随机值,否则会发生浮点异常。可以在使用idiv前做如下处理:以10/2为例使用A&T汇编进行展示方法一:将rdx置为0movq $10, %r

2021-08-31 11:37:45 9783

翻译 【acwj】03, Operator Precedence 运算符优先级

搬运自https://github.com/DoctorWkt/acwj,一个介绍如何使用C语言编写一个可自举的类C语言编译器的说明。进行了粗略的翻译。【acwj】03, Operator Precedence 运算符优先级We saw in the previous part of our compiler writing journey that a parser doesn’t necessarily enforce the semantics of our language. It only.

2021-08-30 19:46:54 441

翻译 【acwj】02, Introduction to Parsing 解析器介绍

搬运自https://github.com/DoctorWkt/acwj,一个介绍如何使用C语言编写一个可自举的类C语言编译器的说明。进行了粗略的翻译。【acwj】02, Introduction to Parsing 解析器介绍In this part of our compiler writing journey, I’m going to introduce the basics of a parser. As I mentioned in the first part, the job of.

2021-08-30 16:30:20 318

翻译 【acwj】01, Introduction to Lexical Scanning 词法扫描介绍

搬运自https://github.com/DoctorWkt/acwj,一个介绍如何使用C语言编写一个可自举的类C语言编译器的说明。进行了粗略的翻译。【acwj】01, Introduction to Lexical Scanning 词法扫描介绍We start our compiler writing journey with a simple lexical scanner. As I mentioned in the previous part, the job of the scanne.

2021-08-29 21:12:35 330

翻译 【acwj】00, Introduction 介绍

搬运自https://github.com/DoctorWkt/acwj,一个介绍如何使用C语言编写一个可自举的类C语言编译器的说明。进行了粗略的翻译。【acwj】00, Introduction 介绍I’ve decided to go on a compiler writing journey. In the past I’ve written some assemblers, and I’ve written a simple compiler for a typeless language..

2021-08-29 19:49:31 506

原创 静态分析 第三课 Data Flow Analysis(1)

Data Flow Analysis – ApplicationsOverview of DFAPreliminaries of DFAReaching Definitions AnalysisLive Variables AnalysisAvailable Expressions AnalysisOverviewHow Data Flows on CFG?How application-specific Data <- AbstractionFlows through the

2021-07-19 17:49:03 516

原创 使用ptrace统计指令数【没有什么用的程序】

使用ptrace统计指令数【没有什么用的程序】最近在学习动态分析的时候注意到了ptrace这个系统调用这个系统调用的功能很强大,它不仅能观察对应的进程的执行,甚至能更改对应进程的内存和寄存器的值大名鼎鼎的GDB就是基于ptrace实现的著名的strace也是基于ptrace实现的使用man可以查看ptrace的描述它的原型:long ptrace(enum __ptrace_request request, pid_t pid, void *adddr, void *data);第一个参数

2021-07-16 17:15:25 361

原创 静态分析 第二课 IR、3AC and CFG

静态分析 第二课 IR、3AC and CFGIntermediate Representation——中间表示特性:简便的、有利于静态程序分析源程序->IRCompilers and Static AnalyzersAST vs IRIR: Three-Address Code(3AC)3AC in Real Static Analyzer: SootStatic SIgnal ssignment(SSA)Basic Blocks(BB)Control Flow Graphs(

2021-07-11 10:14:12 647 3

原创 CS162_HW2: Shell

CS162_HW2: Shell作业要求:实现cd、pwd指令运行Program Execution解析路径输入输出重定向Optional:管道信号处理和停止控制前台、后台切换Get Started作业提供了Shell的骨架代码,包括一个分词工具tokenizer.c和shell的初始化、一个最简单的exit内建命令tokenizer.c的用法:/* A struct that represents a list of words. */struct tokens;/

2021-07-10 18:20:28 1165

原创 静态分析 第一课 静态分析介绍

静态分析 第一课 静态分析介绍本人是北邮19级学生,最近需要使用soot进行java静态分析,但是没有任何静态分析的基础,在北邮人论坛里学长给我推荐了B站南京大学的一个软件分析的网课,感触颇深这是本人的个人笔记,记得不是很全,主要是为了自己能看得懂下面这个是南京大学学长的笔记,我认为很有参考价值https://blog.csdn.net/zhang971105/article/details/109046458PL和静态分析为什么学习静态分析什么是静态分析静态分析特征和例子PLPro

2021-07-04 22:30:53 602

原创 Soot(一)——安装与基本使用

Soot(一)——安装与基本使用系统:Ubuntu 20.04使用的Java版本:JDK11与JDK8均可使用,如果解析JAVA源码时出现问题,需要将版本降到JDK7本系列的目的:总结自己学习的东西,以便日后温习查询之用该工具目前暂时没有中文版本,而soot是Android静态分析的基础,本文填补了这个空白方便学弟学妹学习时少走弯路,中英文对照更好理解安装参考资料:https://github.com/soot-oss/soot/wiki/Introduction:-Soot-as-a-

2021-07-01 15:22:57 2173

原创 Ubuntu下管理Java版本

Ubuntu下管理Java版本有些时候需要在Java各个版本之间进行切换有一个叫jEvn的程序可以做到这一点,但是不论是apt还是snap都无法找到这个程序,官网又打不开另一个可以替代的方法是,在Ubuntu下,使用update-alternatives --config java命令进行java版本的切换...

2021-07-01 08:54:52 346

原创 达夫设备——swtich、while的结合

达夫设备达夫设备是switch语句和while语句结合在一起的一种很精妙的应用,它的主要作用是避开了大量的条件检验,减少了CPU的分支预测带来的性能损耗,主要用在复制大量的数据上虽然在编译技术和CPU技术高速发展的现在,达夫设备的作用已经微乎其微了,但是它仍然给我们提供了一些很好的思路首先,要移动一定数量的数据,最容易想到、也是最简单的方法是:while (n--) { *to++ = *from++;}这段代码中,条件检验的数量和进行数据复制的次数是一样的,都是n次这么做的缺点是,大量的

2021-06-29 01:35:46 301

原创 Latex使用中文

Latex使用中文使用CJKsudo apt install cjk-latexsudo apt install texlive-xetex使用xetex进行编译编译的时候记得设置字体%! Tex program = xelatex\documentclass{article}\usepackage{xeCJK}\setCJKmainfont{Microsoft YaHei}\begin{document} 中文 \LaTeX 示例。\end{document}其他方式

2021-06-14 16:00:56 140

原创 C语言使用GNU扩展实现简单智能指针

C语言使用GNU扩展实现智能指针GNU/C有一个__attribute__扩展叫cleanup:https://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Variable-Attributes.html#Variable-Attributes它的作用是:当某个变量出了它的作用域的时候,自动执行绑定的某个函数这个出作用域,可以是跑出大括号,也可以是其他行为它可以有很多用途,取决于程序员的想象力,但是最直白的、最容易想到的,还是实现一个像C++里一样的智能指针这里有一

2021-06-08 10:18:13 355

原创 GLIBC源码——putchar

GLIBC源码——putcharGLIBC源码——从我认为最简单的putchar开始putchar放在putchar.c中,而putchar.c放在libio文件夹里加上注释,一共只有36行#include "libioP.h"#include "stdio.h"#undef putcharintputchar (int c){ int result; _IO_acquire_lock (stdout); result = _IO_putc_unlocked (c, std

2021-06-07 12:00:56 1297 1

原创 libc_hidden_def、libc_hidden_weak、libc_hidden_proto

libc_hidden_def、libc_hidden_weak、libc_hidden_proto在阅读glibc源码的时候,遇见了几个没见过的宏,几乎所有的函数都会使用这几个宏:libc_hidden_def、libc_hidden_weak、libc_hidden_proto因为我比较好奇,所以特地去找了一下有关这些宏的定义(主要也是想多学一点)Linux下学习源码,最方便的地方就是它的各种命令使用find ./ | grep -r "define libc_hidden_def",发现在in

2021-06-07 03:49:09 1835

原创 mtrace的使用

mtrace的使用mtrace是Linux下自带的内存泄露检测工具使用方法:在代码中包含#include <mcheck.h>头文件在开始检测的地方写上mtrace()在检测结束的地方协商muntrace()在GCC编译的时候加上-no-pie参数和-g参数在环境变量中设置MALLOC_TRACE,例如export MALLOC_TRACE=./mtrace.log运行程序,程序运行结束后,会生成一个log文件使用mtrace ./a.out ./log查看为什么使用-

2021-06-06 22:09:50 428

原创 strong_alias、weak_alias

strong_alias、weak_alias在阅读glibc源码的时候,遇见了几个没见过的宏因为我比较好奇,所以特地去找了一下有关这些宏的定义(主要也是想多学一点)在include/libc-symbols.h中,有我想要了解的两个宏:strong_alias、weak_aliasd的定义#ifndef __ASSEMBLER__/* GCC understands weak symbols and aliases; use its interface where possible, in

2021-06-03 21:31:55 1270 2

原创 动态链接库、GOT、PLT

动态链接库什么是动态链接库以下均为本人自己的理解,不一定正确,但是大致应当是差不多的在很久之前,没有库的概念,每一次写代码都是在从头造轮子后来,人们发现某一些功能是大部分程序里面都要用到的、共通的,且和具体程序没有该关系,例如向控制台打印一个字符等。于是,为了减少写代码的成本,人们把这些实现共通功能的代码汇聚起来,每一次需要使用的时候就用include或者import之类的方法去引用它。再后来,这类代码的量越来越大。这导致了两个问题:1,每一次编译的消耗越来越多;2,实际上并不会用到所有的代码,多

2021-06-03 10:36:38 498

原创 进程间通信——管道

进程间通信——管道最早的UNIX IPC方式使用是最简单的,局限也是最大的管道是半双工的两端进程必须是父子关系或者有共同祖先使用方式:一个进程使用系统调用pipe(int fd[2])创建管道,fd[0]为读端、fd[1]为管道的写端接下来,调用fork调用创建一个新的子进程。父子进程共享文件描述符,因此,fd也可以被子进程使用。这种使用会带来问题:同时进行读写,最终谁读到数据由进程调度决定。因此,为了达到数据通信的目的,在子进程写的时候,关闭父进程的写描述符、关闭子进程的读描述符,形成

2021-05-29 10:05:12 75

原创 477. 汉明距离总和

两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。计算一个数组中,任意两个数之间汉明距离的总和。示例:输入: 4, 14, 2输出: 6解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)所以答案为:HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.注意:数组中元素的范围为从 0到 10

2021-05-28 14:10:43 54

原创 移动安全入门(一)——Android的反编译工具以及使用

移动安全入门(一)——Android的反编译工具以及使用我倾向于使用命令行工具来做这些工作找到的Android下的反编译工具主要有:apktool,将apk文件解析并反编译为smalidex2jar,将dex文件反编译为jar包jd-gui,解析jar包,反编译为Java源码,但是是图形化界面jadx,将dex、apk等文件反编译为Java源代码apktool安装:在https://github.com/iBotPeaches/Apktool的README界面下面的Download链接下

2021-05-25 19:11:10 131

原创 Rust初体验

Rust初体验最近听闻Linux内核要加入Rust的支持,而且据说Rust这门语言既可以用于系统级别的开发又有现代高级语言的特质,并且没有C++那么臃肿,还可以实现内存安全,神乎其神的,所以特地安装了一个Rust学了一下在Rust官网可以获取全套教程,包括安装等在这篇文章里可以得到关于Rust的一些特性的介绍下面主要介绍我对Rust的感受和体会首先,印象深刻的是它的包管理工具Cargo,用起来很方便,美中不足是按tab键不知道为什么不能自动补全cargo的功能很丰富,可以使用cargo new创

2021-05-23 13:39:48 178 1

原创 C语言多线程运行时间计算

C语言多线程运行时间计算单线程下的运行时间可以使用clock()进行计算clock()计算的是the CPU time used so far,即占用的CPU时间而多线程和单线程不同的是,多线程会占用更多的CPU时间(多个线程同时运行),因此,多线程下使用clock()会造成结果过大使用clock_gettime来获取多线程下每个线程的运行时间int clock_gettime(clockid_t clk_id, struct timespec *tp);第一个参数要输入一个宏,一般使用的有:

2021-05-22 11:23:35 2607

原创 Linux下Vmware网卡vmnet丢失问题

Linux下Vmware网卡vmnet丢失问题发现网上的资源都是描述windows下的解决方案,并没有描述在Linux下安装虚拟机网卡的方法,因此进行分享解决方式:先输入ifconfig查看网卡信息,发现vmnet丢失使用sudo vmware-netcfg进行设置,添加对应的网卡,例如点击save后,再次使用ifconfig进行查看,发现网卡已经被添加完毕...

2021-05-20 18:29:59 276

原创 Linux下C语言获取网卡信息(IPv4)

Linux下C语言获取网卡信息(IPv4)getifaddrs、freeifaddrsioctlgetifaddrs、freeifaddrsgetifaddr ==> get interface address它将创建一个描述本地网络接口的链表#include <sys/types.h>#include <ifaddrs.h>int getifaddrs(struct ifaddrs **ifap);The getifaddrs() function c

2021-05-13 17:49:52 1474

原创 POSIX下简单线程池的实现

POSIX下简单线程池的实现什么是线程池?为什么要有线程池?进程是资源分配的基本单位线程是能独立运行的基本单位一个进程内的线程共享资源因此,线程的创建开销小于进程——不需要执行进程复制、分配页表等操作线程的同步开销小于进程——不需要进程间通信,因为线程之间能共享资源在客户机-服务器模型中,每当添加一个新的连接时,就需要创建一个新的线程进行响应。当连接结束后,需要释放当前的线程。线程的开销虽然小,但是并不是意味着没有开销并且,更加严重的问题是,如果同时有大量连接产生,那么,分配的线程的数量很

2021-05-07 16:41:32 199 2

原创 Linux下简单Shell的实现

Linux下简单Shell的实现参考自《操作系统概念》第七版第三章进程下的项目UNIX Shell和历史特点首先梳理一下Shell的工作原理Shell进程读入用户命令行的输入,然后建立一个子进程来完成这个命令,等待,当子进程完成后,父进程继续读入用户新的命令使用fork()命令新建一个子进程后,该子进程将会是父进程的复制品——唯一区别在于fork()的返回参数不同,fork是唯一一个调用一次返回两次的函数,对于父进程,它返回子进程的PID号,对子进程,它返回0要让子进程执行对应的程序,应当使用e

2021-05-06 19:11:46 1360

原创 Ubuntu 从源码安装Qt5

Ubuntu 从源码安装Qt5总览:下载源码、解压安装依赖使用CMake构建Makefilemake下载源码、解压Qt下载站:https://download.qt.io/Qt 5.12下载链接:https://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xzQt 5.12 是一个LTS版本为什么不使用Qt6?因为在下一步安装依赖的时候,会产生问题下载结束后,打开到压缩包所在目

2021-05-02 11:47:54 823

原创 Linux下监听53号端口捕获DNS查询报文

Linux下监听53号端口捕获DNS查询报文计算机网络课设要求写一个能正常工作的DNS resolver,这就要求写出来的解析器能监听应用程序发出的查询报文。即当应用程序需要查询某个网址对应的IP地址时,它会先往DNS resolver发送一条查询报文。这个解析器会解析这条报文,然后先在本地高速缓存中寻找有无对应的IP地址,若没有则去其他它知道的DNS服务器进行查找。获取结果后,将报文返回。在这其中,53号端口就是解析器和服务器监听的端口。使用sudo netstat -aptn | grep 53

2021-04-23 18:03:27 2158

原创 Linux下使用Lindent脚本格式化C语言代码

Linux下使用Lindent脚本格式化C语言代码Linux内核源码中,scripts目录下有一个脚本Lindent,可以用来格式化内核风格的C语言源代码使用locate Lindent可以找到它的位置内容如下:#!/bin/sh# SPDX-License-Identifier: GPL-2.0PARAM="-npro -kr -i8 -ts8 -sob -l80 -ss -ncs -cp1"RES=`indent --version | cut -d' ' -f3`if [ "$RE

2021-04-23 13:00:46 577

原创 在Ubuntu下安装中文man pages

在Ubuntu下安装中文man pagesUbuntu下apt提供以下的manpages安装:manpages manpages-fr-extra manpages-posixmanpages-de manpages-hu manpages-posix-devmanpages-de-dev manpages-it manpages-ptmanpages-dev manpages-ja m

2021-04-21 11:35:38 922

原创 CRC冗余校验码及查表法

CRC冗余校验码及查表法什么是CRC编码它将一个长度为k的位串看作是系数是0或者1的k-1次多项式使用一个长度为r+1的生成多项式进行模2计算,生成一个长度为r的字符序列,能检测长度小于等于r的所有突发错误,当突发错误长度为r+1时,只有其刚刚好等于生成多项式,才检测不出来。多项式的最高位、最低位系数必须为1(我不知道为什么)计算方法:(此处使用的减法是模2减法,不进位不借位,相当于XOR运算)例如:使用G(x)=11001检测位串1011011010110110000011001----

2021-04-17 12:43:30 987

原创 NASM学习(二)——从命令行获取参数

NASM学习(二)——从命令行获取参数学习汇编的目的是增强自己对硬件体系的熟悉与编译、链接等等阶段的熟悉上文我们已经学会了怎么使用NASM来打印HELLO,WORLD了,总结一下,主要是使用系统调用来进行输出甚至,程序的退出也是使用系统调用exit()——因为我们的程序是一个单独的进程,当进程要结束的时候应当主动调用进程销毁调用,否则就会引发错误但是,还有一些不好的地方:注意到,每次使用系统调用的时候都需要手写一大段调用准备,不利于程序的调试和维护,如果可以把它们封装起来,效果更好注意到,ms

2021-04-14 22:55:28 640

原创 Fork杂谈——printf

Fork杂谈——printf在一本书上看到这样子的两段代码:int main(){ printf("Hello, world!\n"); fork(); return 0;}int main(){ printf("Hello, world!"); fork(); return 0;}它们的运行结果分别是Hello, world!和Hello, world!Hello, world!出现这种情况的原因在于,printf函数的缓冲区是行刷新的(原谅我不知道那个术语是什么),就是

2021-04-14 08:05:52 215 1

原创 Linux下进程间通信

Linux下进程间通信进程各自的用户地址空间是相互独立的内核必须提供一种进程间相互交互的方法——即IPCLinux内核支持POSIX规范中的标准IPC和很多UNIX中广泛使用的IPC管道FIFO文件消息队列共享内存Socket管道最早的UNIX IPC方式使用是最简单的,局限也是最大的管道是半双工的两端进程必须是父子关系或者有共同祖先使用方式:一个进程使用系统调用pip(int fd[2])创建管道,fd[0]为读端、fd[1]为管道的写端接下来,调用fork调用创建

2021-04-14 01:01:50 66

piecetable.zip

piecetable 数据结构的C语言简单实现

2021-01-18

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除