- 博客(1542)
- 资源 (3)
- 收藏
- 关注
原创 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
721
原创 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
537
原创 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
492
原创 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
341
原创 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
5041
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
318
原创 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
730
原创 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
760
原创 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
320
原创 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
232
原创 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
1639
原创 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
304
原创 MC kernel
mckernel的安装文档在https://ihkmckernel.readthedocs.io/en/latest/quick.html#architectural-overview其架构如下:其主要作用是通过隔离linuxos中的服务来减少noise,让mckernel来接管cpu算力和memory让应用可以无性能抖动的运行...
2021-09-01 11:40:25
241
2
原创 dpdk中测试cache和memory延迟的工具
在https://github.com/DPDK/dpdk/blob/main/app/test/test_memcpy_perf.c
2021-05-29 19:39:10
453
原创 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
2783
原创 由于代码对齐造成的性能波动
有时候修改了代码,会造成性能下降,但是和具体的改动点有没有什么关系,回退改动点性能就回复了。这个时候考热点函数就无法分析了,可以看看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
299
原创 使用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
448
原创 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
650
原创 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
592
原创 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
676
原创 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
553
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
537
原创 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
508
原创 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
555
原创 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
354
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
366
原创 内核硬件随机数/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
1908
原创 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
414
原创 每个内核版本支持的新特性
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
365
原创 内存屏障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
1138
原创 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
460
原创 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
1136
原创 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
1432
原创 修改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
1014
原创 通过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
403
原创 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) &.
2020-11-23 10:36:45
1114
原创 强制中断线程化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
844
原创 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
771
6
EDK_II_UserManual_0_7.pdf
2017-03-24
EDK_II Module Writer_s Guide_0_7.pdf
2017-03-24
grub 官方文档
2017-03-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人