struct wb_domain

本文介绍了一种名为WB域的内存管理结构,该结构用于衡量系统中不同写回操作的相对带宽,并据此分配可脏页内存。WB域通过周期计时器、锁等机制实现对写回操作的有效管理和测量。


/*
 * A wb_domain represents a domain that wb's (bdi_writeback's) belong to
 * and are measured against each other in.  There always is one global
 * domain, global_wb_domain, that every wb in the system is a member of.
 * This allows measuring the relative bandwidth of each wb to distribute
 * dirtyable memory accordingly.
 */
struct wb_domain {
spinlock_t lock;
struct fprop_global completions;
struct timer_list period_timer; /* timer for aging of completions */
unsigned long period_time;
unsigned long dirty_limit_tstamp;
unsigned long dirty_limit;

};




static inline void wb_domain_size_changed(struct wb_domain *dom)
{
spin_lock(&dom->lock);
dom->dirty_limit_tstamp = jiffies;
dom->dirty_limit = 0;
spin_unlock(&dom->lock);
}


int wb_domain_init(struct wb_domain *dom, gfp_t gfp)
{
memset(dom, 0, sizeof(*dom));


spin_lock_init(&dom->lock);


init_timer_deferrable(&dom->period_timer);
dom->period_timer.function = writeout_period;
dom->period_timer.data = (unsigned long)dom;



dom->dirty_limit_tstamp = jiffies;


return fprop_global_init(&dom->completions, gfp);
}



int fprop_global_init(struct fprop_global *p, gfp_t gfp)
{
int err;


p->period = 0;
/* Use 1 to avoid dealing with periods with 0 events... */
err = percpu_counter_init(&p->events, 1, gfp);

if (err)
return err;
seqcount_init(&p->sequence);
return 0;
}

[TOC] ## 二、新增分区 ### 1、分区表 ``` # vendor\mediatek\proprietary\tools\ptgen\MT6739\partition_table_emmc.csv tectoy_ext Raw data 8192 EMMC_USER N N None N N N N N N AUTO ``` ### 2、分区信息 ``` # vendor\mediatek\proprietary\hardware\fstab\mt6739\fstab.in.mt6739 DEVPATH(tectoy_ext) /tectoy_ext FSTYPE_RAW FS_FLAG_DATA FSMGR_FLAG_DATA ``` ### 3、分区权限 ``` # system\core\rootdir\init.rc chown system system /tectoy_ext chmod 0755 /tectoy_ext ``` ## 三、新增开机服务 ### 1、fill_tectoy_ext ``` # Android.mk ############################################################################### # Copyright:Xchengtech # Owner:Mars.han # Date:2023-03-27 # Version V1.0 ############################################################################### LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := \ fill_tectoy_ext.c LOCAL_C_INCLUDES := \ system/core/include/cutils LOCAL_SHARED_LIBRARIES := \ libcutils LOCAL_PROPRIETARY_MODULE := true LOCAL_CFLAGS += -pie -fPIE LOCAL_LDFLAGS += -pie -fPIE LOCAL_INIT_RC := fill_tectoy_ext.rc LOCAL_MODULE := fill_tectoy_ext include $(BUILD_EXECUTABLE) ``` ``` # fill_tectoy_ext.rc service fill_tectoy_ext /vendor/bin/fill_tectoy_ext class main user root group root oneshot on property:vendor.xc.start.fill_tectoy_ext=1 start fill_tectoy_ext on property:vendor.xc.start.fill_tectoy_ext=0 stop fill_tectoy_ext ``` ``` # fill_tectoy_ext.c /* * Copyright: Xchengtech * Owner: Mars.Han * Date: 2023-03-22 * Version: v1.0 * Purpose:Convert bitmap to raw data adn write to logo_ext partiotion */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "properties.h" //#include <math.h> #define TECTOY_EXT_PARTITION "/dev/block/by-name/tectoy_ext" #define TECTOY_PROP_LOCK_STATUS "vendor.xc.status.fill_tectoy_ext" #define SYS_PROP_TECTOY_RESULT "vendor.xc.fill_tectoy_ext" typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; uint32 main(int argc, char* argv[]) { uint32 i = 0; uint32 j = 0; uint32 k = 0; char lockPropValue[PROPERTY_VALUE_MAX] = {0}; const uint8* output_file = TECTOY_EXT_PARTITION; const char* default_lock_value = "0"; property_set(SYS_PROP_TECTOY_RESULT, "1"); int length = property_get(TECTOY_PROP_LOCK_STATUS, lockPropValue, default_lock_value); if (length == 0) { property_set(SYS_PROP_TECTOY_RESULT, "2"); return -1; } printf("property_get: %s\n", lockPropValue); FILE* out_fp = fopen(output_file, "wb"); if (!out_fp) { printf("Failed to create file: %s\n", output_file); property_set(SYS_PROP_TECTOY_RESULT, "3"); return -1; } //Write tectoy_ext header uint32 head_buffer[4] = {0x92, 1, 0, 0}; head_buffer[2] =lockPropValue[0]; fwrite(head_buffer, 1, sizeof(head_buffer), out_fp); fclose(out_fp); property_set(SYS_PROP_TECTOY_RESULT, "0"); return 0; } ``` ### 2、Selinux权限 ``` # attributes attribute xc_vendor_property_type; ``` ``` # domain.te get_prop(domain, xc_vendor_property_type) ``` ``` # file_contexts /vendor/bin/fill_tectoy_ext u:object_r:fill_tectoy_ext_exec:s0 /tectoy_ext(/.*)? u:object_r:transire_file:s0 /dev/block/platform/bootdevice/by-name/tectoy_ext u:object_r:transire_block_device:s0 ``` ``` # property.te vendor_restricted_prop(vendor_xc_fill_tectoy_ext_prop) typeattribute vendor_xc_fill_tectoy_ext_prop xc_vendor_property_type; ``` ``` # property_contexts vendor.xc.fill_tectoy_ext u:object_r:vendor_xc_fill_tectoy_ext_prop:s0 ``` ``` # fill_tectoy_ext.te ############################################################################### # Copyright:Xchengtech # Owner:yiping.huang # Date:2023-4-5 # Version V1.0 ############################################################################### # ============================================== # Policy File of /vendor/bin/fill_tectoy_ext Executable File # ============================================== # Type Declaration # ============================================== type fill_tectoy_ext_exec,exec_type,file_type,vendor_file_type; #type fill_tectoy_ext,domain; type fill_tectoy_ext,domain,xc_domain; init_daemon_domain(fill_tectoy_ext) # ============================================== # Policy Rule # ============================================== allow fill_tectoy_ext self:capability chown; allow fill_tectoy_ext self:capability dac_override; allow fill_tectoy_ext self:capability dac_read_search; allow fill_tectoy_ext mnt_user_file:dir { search }; allow fill_tectoy_ext mnt_user_file:lnk_file { read }; allow fill_tectoy_ext fuse:dir { search }; allow fill_tectoy_ext fuse:file { getattr read open }; allow fill_tectoy_ext sysfs_boot_mode:file { read open }; allow fill_tectoy_ext sysfs_boot_type:file { read open }; allow fill_tectoy_ext sysfs_mm:dir { search }; allow fill_tectoy_ext mnt_sdcard_file:lnk_file { read }; allow fill_tectoy_ext transire_file:dir { search }; allow fill_tectoy_ext transire_file:file { read open getattr }; allow fill_tectoy_ext block_device:dir { search }; allow fill_tectoy_ext transire_block_device:blk_file { open write getattr }; allow fill_tectoy_ext property_socket:sock_file { write }; allow fill_tectoy_ext init:unix_stream_socket { connectto }; #allow fill_tectoy_ext vendor_default_prop:property_service { set }; set_prop(fill_tectoy_ext, vendor_xc_fill_tectoy_ext_prop) ``` ## 四、控制下载 ### 1、增加宏开关 ``` 文件:ProjectConfig.mk 增加:FEATRUE_TRANSIRE_DOWNLOAD_LOCK=yes ``` ``` 文件:k39tv1_bsp_1g.mk 路径:vendor\mediatek\proprietary\bootable\bootloader\preloader\custom\k39tv1_bsp_1g\ 增加:FEATRUE_TRANSIRE_DOWNLOAD_LOCK=yes export FEATRUE_TRANSIRE_DOWNLOAD_LOCK ``` ``` 文件:feature.mak 路径:vendor\mediatek\proprietary\bootable\bootloader\preloader\platform\mt6739\ 增加:ifeq ("$(FEATRUE_TRANSIRE_DOWNLOAD_LOCK)","yes") C_OPTION += -DCFG_TECTOY_DOWNLOAD_lOCK endif ``` ### 2、控制代码 ``` # download.h # vendor\mediatek\proprietary\bootable\bootloader\preloader\platform\mt6739\src\core\inc\ #define XC_TECTOY_LOCK "TECTOYLOCK" extern unsigned int xc_load_tectoy_img(void); ``` ``` # download.c # vendor\mediatek\proprietary\bootable\bootloader\preloader\platform\mt6739\src\core\ //XCSW add for Block OS downgrade #define RAW_START_PREFIX 0x92 #define DOWNLOAD_UNLOCK 0x31 #define DOWNLOAD_RETRY_TIMES 4 #define HEADER_LEN 4 unsigned int xc_load_tectoy_img(void) { unsigned int tectoy_header[HEADER_LEN] = {0}; unsigned int ret = -1; unsigned int header_size = 0; unsigned int tectoy_flag = 0; unsigned int tectoy_size = 0; unsigned int tectoy_value = 0; unsigned int tectoy_retry = 0; //判断分区是否存在 if(!partition_exists("tectoy_ext")) { return 0; } header_size = sizeof(tectoy_header) * sizeof(unsigned char); //读分区 partition_read("tectoy_ext", 0, (unsigned char *)tectoy_header, header_size); tectoy_flag = tectoy_header[0]; tectoy_size = tectoy_header[1]; tectoy_value = tectoy_header[2]; tectoy_retry = tectoy_header[3]; if((RAW_START_PREFIX == tectoy_flag) && (tectoy_size > 0) && (DOWNLOAD_UNLOCK == tectoy_value)) { tectoy_header[3] = 0; ret = 0; } else if (DOWNLOAD_RETRY_TIMES == tectoy_retry) { tectoy_header[3] = 0; ret = 0; } else { tectoy_header[3] = tectoy_retry + 1; } //写分区 partition_write("tectoy_ext", 0, (unsigned char *)tectoy_header, header_size); return ret; } ``` ``` # handshake_usb.c # vendor\mediatek\proprietary\bootable\bootloader\preloader\platform\mt6739\src\core\ #ifdef CFG_TECTOY_DOWNLOAD_lOCK if (*ptr == 0xa0 && xc_load_tectoy_img() != 0) { mt_usbtty_puts(XC_TECTOY_LOCK); return FALSE; } #endif ``` ## 五、下载版本代码流程 ​ 目录:vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6739/ ### 1、USB握手 ``` // main.c void main(u32 *arg) { ...... BOOTING_TIME_PROFILING_LOG("before bldr_handshake"); bldr_handshake(&handler); //握手 BOOTING_TIME_PROFILING_LOG("bldr_handshake"); ...... } static int bldr_handshake(struct bldr_command_handler *handler) { ...... switch (mode) { case NORMAL_BOOT: if (TRUE == isSLA) { handler->attr |= CMD_HNDL_ATTR_COM_FORBIDDEN; pal_log_info("%s META DIS\n", MOD); } if (!isLocked) { pal_log_info("%s Tool connection is unlocked\n", MOD); #if CFG_USB_TOOL_HANDSHAKE if (TRUE == usb_handshake(handler)) //USB握手 g_meta_com_type = META_USB_COM; BOOTING_TIME_PROFILING_LOG("USB handshake"); #endif #if CFG_UART_TOOL_HANDSHAKE if (TRUE == uart_handshake(handler)) //UART握手 g_meta_com_type = META_UART_COM; BOOTING_TIME_PROFILING_LOG("UART handshake"); #endif } else { pal_log_info("%s Tool connection is locked\n", MOD); bootarg.sec_limit.magic_num = SEC_LIMIT_MAGIC; bootarg.sec_limit.forbid_mode = F_FACTORY_MODE; } break; ...... } // 根据接收的命令进入不同模式 static bool bldr_cmd_handler(struct bldr_command_handler *handler, struct bldr_command *cmd, struct bldr_comport *comport) { ...... if (CMD_MATCH(cmd, ATCMD_PREFIX)) { // AT+XXX ...... } else if (CMD_MATCH(cmd, META_STR_REQ)) { // meta模式 ...... } else if (CMD_MATCH(cmd, FACTORY_STR_REQ)) { ...... } else if (CMD_MATCH(cmd, META_ADV_REQ)) { ...... } else if (CMD_MATCH(cmd, ATE_STR_REQ)) { ...... } else if (CMD_MATCH(cmd, FB_STR_REQ)) { ...... } else { pal_log_warn("%s unknown received: \'%s\'\n", MOD, cmd->data); return FALSE; } ...... } ``` ### 2、USB通讯 ``` //handshake_usb.c bool usb_handshake(struct bldr_command_handler *handler) { ...... //等待USB连接 if (usb_connect(enum_tmo) == FALSE) { //USB连接超时 pal_log_warn("%s USB enum timeout!\n", MOD); goto end; } udelay(1000); //如果连接成功,则进行usb通讯 if (FALSE == usb_handshake_handler(handler, handshake_tmo)) { goto end; } ...... } static bool usb_handshake_handler(struct bldr_command_handler *handler, uint32 tmo) { ...... if (FALSE == usb_listen(&comport, buf, HSHK_TOKEN_SZ, tmo)) { pal_log_warn("%s <USB> cannot detect tools!\n",MOD); return FALSE; } ...... return handler->cb(handler, &cmd, &comport); //即 bldr_cmd_handler } static bool usb_listen(struct bldr_comport *comport, uint8 *data, uint32 size, uint32 tmo_ms) { ...... while (1) { if (tool_is_present()) { //向工具端发送READY,可通过Bus Hound工具或GLB_xx.log查看 mt_usbtty_puts(HSHK_COM_READY); } ...... dsz = mt_usbtty_query_data_size(); if (dsz) { dsz = dsz < size ? dsz : size; mt_usbtty_getcn(dsz, (char*)ptr); #if CFG_USB_DOWNLOAD if (*ptr == 0xa0) { //下载标志位,收到此标志位,表示下载模式 pal_log_info("%s 0xa0 sync time %dms\n", MOD, get_timer(start_time)); usbdl_handler(comport, 300); //下载镜像主函数 pal_log_info("%s : ignore %d bytes garbage data\n", MOD, dsz); continue; /* ingore received data */ } #endif ptr += dsz; size -= dsz; } } ...... } ``` ### 3、USB下载 ``` //download.c int usbdl_handler(struct bldr_comport *comport, u32 hshk_tmo_ms) { u8 cmd = 0; if (usbdl_check_start_command(comport, hshk_tmo_ms) == FALSE) { printf("%s start cmd handshake timeout (%dms)\n", MOD, hshk_tmo_ms); return -1; } while (1) { platform_wdt_kick(); usbdl_get_byte(&cmd); if (cmd != CMD_GET_BL_VER) usbdl_put_byte(cmd); /* echo cmd */ switch (cmd) { ...... case CMD_SEND_DA: DBGMSG("%s CMD_SEND_DA\n", MOD); usbdl_send_da(); break; ...... } DBGMSG("\n", MOD); } return 0; } static bool usbdl_check_start_command(struct bldr_comport *comport, u32 tmo) { u8 startcmd[] = {0xa0, 0x0a, 0x50, 0x05}; ulong start = get_timer(0); u32 i = 0; u8 cmd = 0, rsp; struct comport_ops *comm = comport->ops; do { if (get_timer(start) > tmo) return FALSE; /* timeout 1 ms */ if (0 != comm->recv(&cmd, 1, 1)) { //获取命令 continue; } /* fault-tolerant additional start cmd 0xA0 */ if ((cmd == startcmd[0]) && (i > 0)) { i = 1; continue; } if (cmd == startcmd[i]) { rsp = ~cmd; //取反 i++; } else { rsp = cmd + 1; i = 0; } comm->send(&rsp, 1); //回复命令 } while(i < sizeof(startcmd)); return TRUE; } ``` 帮我解释一下这个方案是什么
08-12
【SCI级别】多策略改进鲸鱼优化算法(HHWOA)和鲸鱼优化算法(WOA)在CEC2017测试集函数F1-F30寻优对比内容概要:本文档主要介绍了一项关于多策略改进鲸鱼优化算法(HHWOA)与标准鲸鱼优化算法(WOA)在CEC2017测试集函数F1-F30上进行寻优性能对比的研究,属于智能优化算法领域的高水平科研工作。文中通过Matlab代码实现算法仿真,重点展示了HHWOA在收敛速度、寻优精度和稳定性方面的优势,体现了多策略改进的有效性。该研究适用于复杂优化问题求解,尤其在工程优化、参数辨识、机器学习超参数调优等领域具有应用潜力。; 适合人群:具备一定算法基础和Matlab编程能力的研究生、科研人员及从事智能优化算法开发与应用的工程技术人员,尤其适合致力于SCI论文写作与算法创新的研究者。; 使用场景及目标:①用于理解鲸鱼优化算法的基本原理及多策略改进思路(如种群初始化、非线性收敛因子、精英反向学习等);②为智能优化算法的性能测试与对比实验提供CEC2017标准测试平台的实现参考;③支撑学术研究中的算法创新与论文复现工作。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点关注HHWOA的改进策略模块与WOA的差异,通过重复实验验证算法性能,并可将其思想迁移至其他优化算法的改进中,提升科研创新能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值