自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1542)
  • 资源 (3)
  • 收藏
  • 关注

原创 leetcode分类刷题 -- 前缀和和哈希

sum += i;1 : v+1);

2023-05-12 14:53:07 717

原创 leetcode分类刷题 -- 异或应用

力扣https://leetcode-cn.com/problems/single-element-in-a-sorted-array/异或的原理的,相同的数异或为0. 异或在python中的两种写法如下:from functools import reduceimport operatorclass Solution: def singNonDuplicate(self,nums): return reduce(lambda x,y:x^y,nums) def

2022-02-14 21:39:43 990

原创 leetcode分类刷题 -- list应用

力扣https://leetcode-cn.com/problems/relative-sort-array/leetcode 1122 数组的相对排序-- 简单arr2 += sorted(set(arr1)-set(arr2)) 执行后的arr2等于arr2 += sorted(set(arr1)-set(arr2))可见arr2 的前面是由arr2的原来arr2中的值3和后面arr1中的值组成,这里用两个set相减来取两个的差集其次针对list的排序,如果排序的函数是针对list本事的元.

2022-02-14 20:31:42 794

原创 leetcode分类刷题 -- 链表应用

力扣https://leetcode-cn.com/problems/add-two-numbers/leetcode 第一题 两数相加-- 中等直接想加就可以了,被来就是倒序的,不要考虑进位,s//10 后的值就是进位,自动参与到下一次中的运算.class Solution: def AddTwoNumber(self,L1,L2): dummpy=p=ListNode() s=0 while l2 or l2 or s != 0:.

2022-02-14 11:18:52 541

原创 leetcode分类刷题 -- 哈希应用

leetcode 第一题 两数之和 -- 简单给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。...

2022-02-12 11:37:22 377

原创 cxl协议理解

CXL的全称是Compute Express Link ,CXL是一种东岱的多协议的互联技术总线,提供了类似PCIE的CXL.io协议CXL分为三种子协议,分别是CXL.io, CXL.cache,CXL.mem,这三种协议可以全部使能也可以部分使能,但是CXL.io 必须是能,CXL协议的关键优势就在于访问设备可以做到低延时和高带宽.CXL.cache协议允许设备保存缓存cacheline到本地CXL.mem协议允许设别是全一致性的内存设备,这种设别可以被当作"System RAM and/or

2021-09-17 16:03:02 5662 2

原创 optee中的栈

optee中定义了三种stack#define DECLARE_STACK(name, num_stacks, stack_size, linkage) \linkage uint32_t name[num_stacks] \ [ROUNDUP(stack_size + STACK_CANARY_SIZE + STACK_CHECK_EXTRA, \ STACK_ALIGNMENT) / sizeof(uint32_t)] \ __attrib...

2021-09-16 21:40:21 381

原创 optee的启动

optee是从ATF中启动的,是作为一个svc来启动,启动玩后在optee中又通过smc返回到ATF中.从core/arch/arm/kernel/kern.ld.S 中可以发现optee的入口,这也是个通用的规律,即从lds文件中找到入口函数OUTPUT_FORMAT(CFG_KERN_LINKER_FORMAT)OUTPUT_ARCH(CFG_KERN_LINKER_ARCH)ENTRY(_start)这里可以知道入口是_start,针对arm32的函数在entry_a32.S 中,针对

2021-09-14 11:17:25 869

原创 fastcall

所谓的fast call 就是ATF通过smc 陷入到optee中后,获取一些参数,例如UID、MUTEX等从ATF陷入到OPTEE的入口为:core/arm/kernel/thread_optee_smc_a64.S/** Vector table supplied to ARM Trusted Firmware (ARM-TF) at* initialization.** Note that ARM-TF depends on the layout of this vector ...

2021-09-13 20:11:11 881

原创 optee_client

libteec主要是用于CA->TA的其流程如下:CA->libteec.so->tee_driver->ATF->TEE_kernel->TA假如TA服务有部分工作需要返回非安全态执行,则会通过如下流程来嗲用tee_supplicant去完成TA->ATF->tee_drvier->tee_supplicant这里的tee-supplicant和libteec.so 都是在运行的EL0中libteec.so 和 tee-supplican

2021-09-13 18:56:34 385

原创 optee中支持的软算算法

在lib/libmbedtls/core/tomcrypt.c中定义了加解密算法的入口,TEE_Result crypto_init(void){ tomcrypt_init(); return TEE_SUCCESS;}在tomcrypt_init 中我们就可以明确知道optee中支持了哪些软算的算法void tomcrypt_init(void){ ltc_init();}static void ltc_init(void){#if defined(_CFG...

2021-09-13 11:25:36 303

原创 ARM异常等级的切换

系统抵用的异常有三种:SVC,HVC,SMCSVC: 用于被EL0的软件用来申请操作系统上EL1请求特权或者访问系统资源.用于从EL0->EL1的切换HVC: guest os用来请求hypervisor的服务,用于从EL1->EL2的切换.SMC: 全称是secure monitor call,用于从EL2->EL3,用于secure与none-secure的切换....

2021-09-11 19:38:36 1913

原创 mckernel的启动

mckernel的启动命令如下:export TOP=${HOME}/ihk+mckernel/cd ${TOP}sudo ./sbin/mcreboot.sh -c 1 -m 512m这里的指定mc kernel用1个cpu,用512m 内存,启动的log如下:IHK/McKernel started.[ -1]: no_execute_available: 1[ -1]: map_fixed: phys: 0xfee00000 => 0xffff860000009000 (1 p

2021-09-01 14:19:16 368

原创 MC kernel

mckernel的安装文档在https://ihkmckernel.readthedocs.io/en/latest/quick.html#architectural-overview其架构如下:其主要作用是通过隔离linuxos中的服务来减少noise,让mckernel来接管cpu算力和memory让应用可以无性能抖动的运行...

2021-09-01 11:40:25 287 2

原创 dpdk中测试cache和memory延迟的工具

在https://github.com/DPDK/dpdk/blob/main/app/test/test_memcpy_perf.c

2021-05-29 19:39:10 552

原创 IMA的简单理解

IMA的全称是The Integrity Measurement Architecture。他的作用是检测一个文件是否被修改,包括本地和远程修改.其原理是比较文件的hash值是否相等,这个hash值是被保存到文件系统的 extended attribute中.与之相似的的机制是selinux作为IMA的一种补充.IMA 子系统引入了一些hooks来创建和手机被打开准备读写的文件的hash.IMA机制在2.6.30的时候就被引入到linux kernel中.IMA的作用是手机文件的hast并将其放到用户.

2021-05-18 10:08:23 3434

原创 由于代码对齐造成的性能波动

有时候修改了代码,会造成性能下降,但是和具体的改动点有没有什么关系,回退改动点性能就回复了。这个时候考热点函数就无法分析了,可以看看topdown模型中的icache load的情况.这种情况之一就是由于代码不对其造成的,如果改动点在kernel的话,则可以合入下面的的patch验证https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=09c60546f04fdiff --git a/Makef.

2021-05-18 08:59:42 343

原创 使用rasm2 将机器码转成汇编

[root@localhost ~]# yum install radare2-4.5.0-1.el8.aarch64Last metadata expiration check: 0:00:54 ago on Thu 06 May 2021 05:29:17 AM EDT.Dependencies resolved.============================================================================================.

2021-05-06 19:03:24 534

原创 jump label

这段代码的反汇编如下所示static inline bool test_idle_cores(int cpu, bool def){ struct sched_domain_shared *sds; if (static_branch_unlikely(&sched_smt_present)) { sds = rcu_dereference(per_cpu(sd_llc_shared, cpu)); .

2021-04-05 09:14:45 756

原创 Mos中线程调度器是rr

https://github.com/intel/mOS/blob/890456f8a51627ab695750d4934dac31f11a31e7/kernel/sched/mos.c/* mOS scheduler class function table */const struct sched_class mos_sched_class = { .next = &dl_sched_class, .enqueue_task = enqueue_task_mos, .dequ.

2021-02-19 20:29:49 690

原创 Mos的cpu up操作

Mos 有自己的cpu up函数,但是其实也是linux kernel的do_cpu_up的封装int lwkcpu_up(unsigned int cpu){ return do_cpu_up(cpu, LWKCPU_MAX_STATE);}由于要和linux kernel隔离cpu 来使用,所以如果这个cpu已经被linxu kernel boot起来了则booted为trueint lwkcpu_up_multiple(cpumask_var_t request, cpumask_va.

2021-02-19 11:01:28 746

原创 Mos 初体验

1:什么是MosMos是一款intel 开发的,针对HPC场景优化的os,目前已经开源,其开源网址为https://github.com/intel/mOS。2:Mos和linux kernel的区别。Mos 是在linux kernel的根目录下面加了一个mos的文件夹,里面放的是Mos的主要文件,总结一下,Mos就是内嵌到linux kernel中的一个轻量级os.3: Mos 的工作原理通过命令行参数 lwkcpus 和lwkmem 来隔离内存和cpu,或则通过lwkctl 来在li.

2021-02-18 20:10:55 689 1

原创 通过sysfs判断cpu是否支持smt

在kernel/cpu.c中为smt建立了一个sysfs的入口,代码如下:可以看到支持smt的cpu 有一下五种状态static const char *smt_states[] = { [CPU_SMT_ENABLED] = "on", [CPU_SMT_DISABLED] = "off", [CPU_SMT_FORCE_DISABLED] = "forceoff", [CPU_SMT_NOT_SUPPORTED] = "notsupported", [CPU_SMT_NOT_IM.

2021-02-18 14:41:50 647

原创 kernel对支持smt的cpu的启动

有一个疑问,支持smt的cpu,bios 传递给os的cpu的个数是开了smt后的还是没有开smt的呢?这里举个例子,例如支持smt2的cpu,其实还有支持smt4,smt8的cpu,例如ibm的power系列假如支持smt2,没有开smt的时候是16核,开了smt就是32核,那在开了smt后,bios就要告诉kernel 当前的cpu 核数是32,这点可以从下面的函数中发现端倪.static int cpu_up(unsigned int cpu, enum cpuhp_state target.

2021-02-18 11:26:05 587

原创 virtio 提供的hw_rng

hwrng 也提供了一种从virtio中获取真随机数的方法,代码在drivers/char/hw_random/virtio-rng.c中,通过前面的分析hw_rng的工作原理都清楚了,那我们看看做核心的read函数的实现vi->hwrng = (struct hwrng) { .read = virtio_read, .cleanup = virtio_cleanup, .priv = (unsigned long)vi, .name = vi->name, .qual.

2021-02-10 11:08:56 677

原创 optee 提供的hwrng

如果没有专门的硬件来hwrng,则客户用trustos的optee来产生hwrng,这个是的实现在driver/char/hwrng/optee-rng.c中,前面已经看过hwrng代码的架构,我们重点看看核心函数read的实现static struct optee_rng_private pvt_data = { .optee_rng = { .name = DRIVER_NAME, .init = optee_rng_init, .cleanup = optee_rng_clean.

2021-02-05 10:57:36 481 1

原创 hwrng相关的sysfs

在driver/char/hwrng/core.c中会生成一个文件系统如下:可以查询可以选择的hwrng,可以看当前选择的hwrng,以及手动选择hwrng./sys/devices/virtual/misc/hw_random/rng_current[root@ip134 /]# cd /sys/devices/virtual/misc/hw_random/[root@ip134 hw_random]# lsdev power rng_available rng_current rng.

2021-02-04 11:30:33 457

原创 内核硬件随机数/dev/hwrng的一些规则

不管是否支持hwrng 都可以看到/dev/hwrng 这个字符设备,如果有真正的hwrng,则只是增加这个hwrng的随机性而已,同一个hwrng不能重复注册,而且会根据每个hwrng的quality 来选择一个质量最好的hwrng。这里举例如下:drivers\crypto\hisilicon\trng.cprobe 中的核心代码如下:trng->rng.name = pdev->name;#这里提供的读取硬件随机数的方法 trng->rng.read = hisi_trn.

2021-02-02 09:58:03 2333

原创 kernel调度域的初始化

kernel 调度支持多级,下面的例子就是支持2级调到,即第一级的MC和第二级的NUMA[root@localhost ~]# sysctl kernel.sched_domain.cpu0.domain0.namekernel.sched_domain.cpu0.domain0.name = MC[root@localhost ~]# sysctl kernel.sched_domain.cpu0.domain1.namekernel.sched_domain.cpu0.domain1.name.

2021-01-18 21:45:33 488

原创 每个内核版本支持的新特性

https://kernelnewbies.org/LinuxChanges例如1.2. Ext4 fast commit support, for faster metadata performanceMany applications use fsync(2) to ensure that data is reliably placed on disk. Such operation attempts to synchronize to the disk a few more metadat

2021-01-18 21:11:36 428

原创 linux 内存压缩技术

2021-01-14 10:21:48 382

原创 内存屏障sy/ld/st的详细解释

在arch/arm64/include/asm/barrier.h 中定义了一些内存屏障#define mb() dsb(sy)#define rmb() dsb(ld)#define wmb() dsb(st)#define dma_mb() dmb(osh)#define dma_rmb() dmb(oshld)#define dma_wmb() dmb(oshst)这里面的sy/ld/st的详细解释如下:https://www.keil.com/support/man/doc.

2020-12-18 10:50:13 1270

原创 ACPI的forbidden_id_list

使用ACPI后,在driver/acpi/acpi_platform.c中会为bios 传过来的设备create device. 知道这个后,我们除了可以再grub中添加blacklist来禁止某个驱动外,还可以在driver/acpi/acpi_platform.c中的forbidden_id_list添加,这样kernel 就不会为这个设备创建device在driver/acpi/acpi_platform.c 中已经禁止的device如下static const struct acpi_devi.

2020-12-14 09:08:28 507

原创 centos 上安装phoronix-test-suite

1009 yum install php-cli php-xml -y 1010 wget https://github.com/phoronix-test-suite/phoronix-test-suite/archive/v9.8.0.tar.gz -O phoronix-test-suite-9.8.0.tar.gz 1011 tar -zxvf phoronix-test-suite-9.8.0.tar.gz 1012 cd phoronix-test-suite-9.8.0 10.

2020-12-07 15:49:43 1338 1

原创 SPE

SPE是Armv8.2的特性,SPE 是一种使用随机抽样对程序一种动态分析禁止。要使用spe :1: defconfig中必须打开ARM_SPE_PMU 2: 启动命令行参数加kpti=off通过命令perf list | grep arm_spe 就可以确认perf 是否支持speperf record -a -c 1024 -e arm_spe_0/branch_filter=0,ts_enable=0,pa_enable=0,load_filter=0,sotre_filter=0,min.

2020-12-01 10:47:10 1736

原创 修改kernel text 段为RW

kernel的text段是RO的,如果想改变text段为RW,可以关掉CONFIG_STRICT_KERNEL_RWX 和 CONFIG_STRICT_MODULE_RWX 这两个配置项#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)bool rodata_enabled __ro_after_init = true;static int __init set_debug_rodata(char *.

2020-11-25 08:56:01 1282

原创 通过kprobe在测量函数执行的时间

[root@localhost ~]# cd /sys/kernel/debug/tracing/[root@localhost tracing]# lsREADME current_tracer hwlat_detector printk_formats set_ftrace_filter stack_max_size trace_marker tracing_threshavail.

2020-11-23 15:11:37 488

原创 arm64 中的__virt_to_phys

在arm64上的线性映射区还是可以通过__virt_to_phys 来将虚拟地址转成物理地址,我们来看看其在arm64上的实现#define __virt_to_phys(x) __virt_to_phys_nodebug(x)#define __is_lm_address(addr) (!(((u64)addr) & BIT(vabits_actual - 1)))#low memory的虚拟地址到物理转换#define __lm_to_phys(addr) (((addr) &amp.

2020-11-23 10:36:45 1282

原创 强制中断线程化threadirqs

kernel 提供了一个命令行参数threadirqs,这个参数会让irq 中断强制运行在thread context,这个时候不管用户是否设置中断线程化,都强制让中线运行在线程上下文中.static int __init setup_forced_irqthreads(char *arg){ force_irqthreads = true; return 0;}early_param("threadirqs", setup_forced_irqthreads);当命令行加threadir.

2020-11-23 09:18:28 971

原创 pyinstaller 打包

[root@localhost ~]# pip3 install pyinstallerWARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.Collecting pyinstaller Downloading https://files.pythonhosted.org/packages/9e/ed/fbdad7f5d8f..

2020-11-20 08:52:14 831 6

空空如也

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

TA关注的人

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