- 博客(85)
- 收藏
- 关注
原创 关于二分查找的总结和思考
模板二分法查找,只有当目标在数组内才能找到准确索引索引下标。当不存在于数组内时,我们依然可以借助二断性找到边界并进行处理。但是需要对于3和4这种超出边界的情况需要特殊处理。
2022-07-24 23:16:53
607
原创 线段树的四种模板
第一种模板只适合单点修改的题目,每次修改都传递到树的子节点。对于区间修改则不合适,同时,由于数组大小事先申明好,其点数也有上限。为了解决数据量的问题,这里提供了动态开点,解除了每个树的元素都占一个固定坑位的限制。但是仍然有限制,点数不可以随便加,有上限。和第一套模板相比,增加了区间修改的功能。但是点数仍然有上限,数据量顶多十万,再往上就不能适用了。点数无限制,需要的时候申请,但是效率会很低。...
2022-07-20 07:05:32
3926
4
原创 一种削峰算法
加入有九座山,高度分别是[9,8,7,6,5,4,3,2,1];削掉峰值的总和是k,怎样可以尽可能的削减高峰。有没有一种办法,可以直接算出削峰之后的平均线,然后所有高出这个平均线的都一把削掉,而不是一米一米的削掉呢?按照常规逻辑,每次将最高的减少一米,然后山峰重新排序,接着再将最高的削减一米,直到k次使用完。按照这种思路,可以使用大顶堆来解决,每次将最大值取出来减一之后再塞回去。但是这种操作在大用例集下会超时,因为是一个一个操作。削峰算法,故名思义,就是将峰值高的地方铲掉。...
2022-07-15 05:46:02
1408
原创 【两两乘积的一种O(n)解法】
假定一个数组,我们需要计算他的所有数两两乘积的和。比如:大小为4的数组a有元素那么两两乘积为:常规思路是用两个for循环。这种解法的时间复杂度是O(n2),因此在一些数据集比较大的地方容易超时。一种O(n)的解法如下:可以将 转化成如下等式...
2022-06-28 07:32:31
257
原创 arp攻击
上一章讲了arp协议,可以看到非常简单,只有收和发两种格式,没有任何可信认证,采取的是完全信任模式。若是此时局域网内部有个攻击者呢,那在这种完全信任的模式下攻击者基本可以恣意妄为,现在来模仿下arp攻击。arp攻击实现1/假定被攻击的目标此时需要访问互联网,那么必然经过网关。按照前一篇文章的描述,被攻击者首先需要发arp请求广播去询问网关的mac地址。2/ 攻击者通过不断的给被攻击的目标发送arp响应包。内部伪造网关ip和mac地址的对应关系;在下面的代码中,将网关的mac地址伪造成了攻击者的mac
2022-01-09 23:11:25
668
原创 ARP协议
ARP协议ARP协议概述ARP请求包分析ARP响应包分析最后ARP协议概述每个网络接口都有一个48bit的硬件地址来标示自己,这就是我们常说的mac地址。在硬件层次上进行数据帧交换必须要有正确的接口地址,但是,tcp/ip有自己的32bit地址(我们常说的mac地址)。我们访问某个主机一般是先通过DNS解析域名,获得对方的ip地址,但是我们不知道对方的mac地址,以太网驱动程序必须知道硬件地址(mac地址)才能发送数据。ARP的功能就是在我们已知目的端ip地址前提下,去获得目的端mac地址。严格意义
2022-01-05 00:12:59
7379
原创 鸿蒙wifi Demo运行
title: 鸿蒙Wi-Fi Demo运行date: 2021-1-1 22:25:10categories: harmony本文首发于LHM’s notes, 欢迎关注我的博客~坑有点多~由于之前没有看过wifi的内核态代码,所以这里只能一个文件一个文件摸索了。但是在摸索的过程中发现,Wi-Fi内核态的代码鸿蒙竟然没有开放,只有一个libwpa.a静态库。由于官方开发板Hi3518中搭配的wifi芯片是Hi3881,猜测libwpa.a中的实现是根据Hi3881具体定制,因此没有开放出来.
2021-01-01 22:34:35
892
1
原创 鸿蒙适配wifi驱动(1)
本文首发于: LHM’s notes欢迎关注我的新博客一入wifi深似海~用户态(wpas)适配首先找到如下目录,是开源wpas代码,由于之前看了点wpas的具体实现代码,知道在linux系统中wpas与内核打交道是通过两种标准接口,要么是nl80211接口,要么是wext(Wireless Extensions无线拓展接口); 由于当前内核系统更换,那么nl80211和wext自然是不适用了。因此猜想鸿蒙在wpas上有做适配,先到wpas源码上瞧了瞧,果然发现有新增文件。/home/hmos/s
2020-12-23 00:58:54
2352
1
原创 鸿蒙驱动实战
用户态代码#include <stdio.h>#include "los_sample.h"#include <fcntl.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <unistd.h>#include "hdf_sbuf.h"#include "hdf_io_service_if.h"enum rw { regrd, regwd,};int main(
2020-12-22 08:03:35
1573
原创 鸿蒙驱动框架
本文首发于:LHM’s notes 欢迎关注我的新博客鸿蒙驱动是基于HDF(Harmony Driver Foundation)驱动框架,为开发者提供了一系列统一接口供其调用,包括驱动加载、驱动服务管理和驱动消息机制。我们要做的,是学习如何使用这些接口,并基于这些接口的使用实现某些业务功能。设备驱动概述相信每个人都有给电脑安装驱动的经历,驱动的使用就是去某个官网去下载个软件包,然后一路点击安装就行了。这里可以明确一个定义:驱动是一段程序代码。那么设备呢? 鼠标、键盘、显示器、这些都叫做设备,但是和我们
2020-12-21 08:18:45
4813
2
原创 鸿蒙第一个应用程序 hello world
鸿蒙第一个应用程序 hello world1、应用程序存放路径:applications/sample/camera/app/src2、编译指令:在源码的根目录下执行如下指令python3 build.py ipcamera_hi3518ev300 -b debug3、编译后输出文件:out/ipcamera_hi3518ev300路径下:OHOS_Image.binrootfs.imguserfs.img4、uboot文件:目录路径vendor/hisi/hi35xx/hi3518ev
2020-12-09 07:17:25
1140
原创 Linux之进程(一)
进程切换 本质:任务中断时将堆栈指针指向另外一个堆栈B,该堆栈中保存有B进程运行时,cpu 各类寄存器状态,当利用iretd返回时,CPU的寄存器值会被堆栈B中的状态填充,变成了进程B的状态,sp指针也指向任务B,此时任务跳到了B中,完成了任务切换今天讲述的是一个比较简陋的进程切换,步骤如下 1.进程表初始化 2.调用restart()函数。int kernel_main(){...
2018-04-21 14:12:40
210
原创 字符串解析为单词
#include<stdio.h>#include<ctype.h>#include<malloc.h>#include<string.h>#define N 20#define M 30int str_parase(char * res, char word[][N]){ int i, wordLen=0, wordNu...
2018-03-27 22:26:18
461
原创 一份比较全的Makefile
#Makefile for boot#programs , flags, etcENTRYPOINT = 0x30400ENTRYOFFSET = 0X400ASM = nasmDASM = ndisasmCC = gccLD = ldASMBFLAGS = -I boot/include/ASMKFLAGS = -I...
2018-03-24 08:10:47
259
原创 内核(一)
上节已经写到跳到内核程序入口地址,接着来看看内核中的代码#include "type.h"#include "const.h"#include "protect.h"PUBLIC void* memcpy(void* pDst, void* pSrc, int iSize);PUBLIC void disp_str(char * pszInfo);PUBL...
2018-03-24 08:08:22
211
原创 重新放置内核
将elf文件中的程序按段重新放置;initKernel ---------------------------------------------------------------------------------; 将 KERNEL.BIN 的内容经过整理对齐后放到新的位置; 遍历每一个 Program Header,根据 Program Header 中的信息来确定把什么放进内存,...
2018-03-23 07:26:33
246
1
原创 linux之跳入保护模式+启动分页机制
以前的代码需要一段初始化SelectorCode16 equ LABEL_DESC_CODE16 - LABEL_GDT ;初始化16位的代码段描述符 xor eax, eax mov ax, cs shl eax, 4 add eax, LABEL_SEG_CODE16 mov word [LABEL_DESC_COD...
2018-03-21 08:11:18
623
原创 linux之 loader
前面几节大概如下流程 将boot.bin写入软驱a.img第一个扇区 dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc 上电之后,rom会自动加载第一个扇区加载到内存中并开始运行这个第一扇区中的内容就是boot.bin,boot的主要功能就是查找loader.bin文件,并加载到内存指定位置,之后跳到loader.bin...
2018-03-20 07:50:15
1648
原创 一个操作系统的是实现之C语言与汇编互相调用
bar.cvoid myprint(char* msg, int len);int choose(int a, int b){ if(a >= b){ myprint("the 1st ont \n", 13); } else{ myprint("the 2nd one \n", 13); } r...
2018-03-19 00:12:39
1101
原创 hello.asm
一个操作系统的实现 第五章第一个程序[section .data]strHello db "Hello, world!", 0AhSTRLEN equ $ - strHello[section .text]global _start_start: mov edx, STRLEN mov ecx, strHello mov ebx...
2018-03-18 23:02:23
744
原创 linux 之 引导扇区(三)
上一节讲到在磁盘中读取属于目录条目的扇区,并在里面查找我们需要的文件名,看是否是自己需要的文件名,这一节讲讲将该文件名找到后,我们将该文件拷贝到内存中。 这里的将文件拷贝到内存和上一节讲到的有点区别,这次拷贝的文件大小不止一个扇区,所以需要用到FAT,代码如下:;-----------------------------------------------------------; 函数...
2018-03-18 21:27:56
332
原创 linux之 引导扇区(二)
上一节讲到了引导扇区的结构,这种是基于FAT12文件系统的。但是内部的引导程序却只是用打印字符串来代替,现在来加深一下代码,添加读取磁盘数据到内存的功能这个功能需要用到BIOS中断int 13h,它的用法如下 可以看到 ah = 02h 时,int 13h 可以进行读取磁盘扇区功能。在这里需要先了解一下磁盘的一些基础知识磁盘由N个盘片组成,每个盘片一般有两面,一面一个磁头(hea...
2018-03-13 23:23:34
844
原创 linux之 引导扇区(一)
上回说到操作系统上电到引导扇区之间的程序,但是在结尾只是随便用一个测试程序来代替引导程序(就是第一个扇区的程序),今天我们来讲讲真正的引导程序。但是在讲引导程序之前我们需要先学习FAT12文件系统,学了之后才会了解数据是如何存储在硬盘上面的(注意:是硬盘,此时数据还没有加载到内存上面)。所有的文件系统会把磁盘分为若干个层次方便组织和管理,包括 1.扇区:磁盘上最小的数据单元 2.簇:一...
2018-03-12 09:56:18
1872
原创 pcm文件播放
/*This example reads standard from input and writesto the default PCM device for 5 seconds of data.*//* Use the newer ALSA API */#define ALSA_PCM_NEW_HW_PARAMS_API#include <stdio.h> #in...
2018-03-08 16:55:17
1805
原创 利用Matlab实现已知数据拟合
利用Matlab实现已知数据拟合 已知大量数据和基本公式,但是不知道系数,此时可以利用下面的代码来实现clear all;clc;close all;x=[426;514;645;739;1000;1100;1170;1250;1370;1520;1540;1650;1720;1750;2010;2210;2300;2540;2720;2850;3000;3150];y=[3...
2018-03-07 14:02:43
12996
1
原创 保护模式小结
在GDT、LDT以及IDT中,每一个描述符都有自己的界限和属性等内容,是对描述符所描述对象的一种限定和保护分页机制中的PDE和PTE都含有R/W以及U/S位,提供了页级保护 页式存储的使用使应用程序使用的是线性空间而不是物理地址,于是物理内存被保护起来中断不再像是模式下一样使用,也提供特权检验等内容I/O指令不再随便使用,于是端口被保护起来在程序运行过程中,如果遇到不同特权级...
2018-03-06 12:49:30
139
原创 pmtest9.asm
pmtest9c.asm所写的中断类似与一种call 调用,更像一种异常,就是直接调用这段,而这个始终中断,类似与单片机,只需要使能之后,就可以进入中断 不需要int 80h 这样的调用;======================================;pmtest9_2.asm;编译方法:nasm pmtest9_2.asm -o pmtest9_2.bin;======...
2018-03-06 10:59:11
610
原创 pmtest9c.asm
8259A的初始化 中断向量表的建立;======================================;pmtest9c.asm;编译方法:nasm pmtest9c.asm -o pmtest9c.bin;======================================%include "pm.inc"; 常量,宏 以及一些说明;org 07c00h...
2018-03-03 21:43:51
257
原创 pmtest8.asm 笔记
pmtest8.asm的功能,先执行某个线性地址处的模块,然后通过改变cr3来转换地址映射关系,再执行同一个线性地址处的模块,由于地址映射已经改变,所以两次得到的应该是不同的输出LABEL_DESC_FLAT_C: Descriptor 0, 0fffffh,DA_CR|DA_32|DA_LIMIT_4K ;0-4G LABEL_DESC_FLAT_RW: ...
2018-03-03 12:52:19
565
原创 pmtest8.asm
有个bug 找了半天,以前的代码都是 LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C| DA_32; 现在的代码却是 LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_CR| DA_32; 非一致代码段就因为这个原因导致程序出...
2018-03-03 12:49:21
590
1
原创 pmtest7.asm
1.如何由内存推出页表数量 假设内存空间为32MB, 由于每个页是4KB, 则我们需要8K个页表,而每个页表实际占4个字节,所以一共是页表所占内存为32KB分配内存依然是从零开始的,但是里面有一些内存是不能用的,我们只能说自己线性地址指向的内存有部分可用,可用的最大值的地址是01FF0000h, 所以说可以用的内存都被指向到了;====================...
2018-03-02 17:02:34
502
1
原创 pmtest6.asm
这个代码的功能是写了一个分页机制,还有书中的一个bug 解决pmtest6.asm不能返回到实模式的问题;======================================;pmtest6.asm;编译方法:nasm pmtest6.asm -o pmtest6.bin;======================================%include "pm.i...
2018-02-28 14:33:02
417
原创 pmtest5.asm
从0特权级跳到3特权级 这个在pmtest5a.asm就已经实现了,通过压栈cs eip ss 以及 esp 然后ret直接跳转到特权级3的代码段 LABEL_DESC_CODE_RING3 打印3从特权级3调用门 此时需要保证门的DPL为3 ,特权级3才能访问到,此时跳到门的代码段中 LABEL_CALL_GATE_TEST 中 这个门指向SelectorCodeDest选择子...
2018-02-27 10:18:04
350
原创 pmtest5a.asm
此代码用作从高特权级0跳到低特权级3,通过ret指令实现,在ret指令执行前,堆栈中应该已经准备好了目标代码的cs eip ss 以及 esp 这是通过push 指令来实现;======================================;pmtest5.asm;编译方法:nasm pmtest5.asm -o pmtest5.bin;==============...
2018-02-26 13:21:51
306
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人