当前位置: 首页 > news >正文

北京丰台做网站天津seo排名

北京丰台做网站,天津seo排名,做网站收费,做五金生意什么网站做比较好1.swapon开启zram交换分区 swapon /dev/block/zram0 mkswap /dev/block/zram0 上面命令调用了linux的swapon系统调用启动zram0交换分区;mkswap命令向块设备文件/dev/block/zram0写入了swap_header信息 问题:实际安卓平台是哪里触发swapon和mkswap调用的&#xff…
1.swapon开启zram交换分区
swapon /dev/block/zram0
mkswap /dev/block/zram0

上面命令调用了linux的swapon系统调用启动zram0交换分区;mkswap命令向块设备文件/dev/block/zram0写入了swap_header信息

问题:实际安卓平台是哪里触发swapon和mkswap调用的,我们已MTK8195平台为例:

init.xxx.rc:swapon_all /vendor/etc/fstab.enableswap其中fstab.enableswap内容如下:
/dev/block/zram0 none swap defaults zramsize=xx%

 那么swapon_all命令执行了哪里的代码呢?又是哪里解析fstab.enableswap文件呢,答案是:

system/core/init/builtins.cpp:


/* swapon_all [ <fstab> ] */
static Result<void> do_swapon_all(const BuiltinArguments& args) {auto swapon_all = ParseSwaponAll(args.args);if (!swapon_all.ok()) return swapon_all.error();Fstab fstab;if (swapon_all->empty()) {if (!ReadDefaultFstab(&fstab)) {return Error() << "Could not read default fstab";}} else {if (!ReadFstabFromFile(*swapon_all, &fstab)) {return Error() << "Could not read fstab '" << *swapon_all << "'";}}if (!fs_mgr_swapon_all(fstab)) {                                                                                                           return Error() << "fs_mgr_swapon_all() failed";}return {};
}

而fs_mgr_swapon_all实现:/system/core/fs_mgr/fs_mgr.cpp:

bool fs_mgr_swapon_all(const Fstab& fstab) {...const char* mkswap_argv[2] = {MKSWAP_BIN,entry.blk_device.c_str(),};int err = logwrap_fork_execvp(ARRAY_SIZE(mkswap_argv), mkswap_argv, nullptr, false,LOG_KLOG, false, nullptr);if (err) {LERROR << "mkswap failed for " << entry.blk_device;ret = false;continue;}/* If -1, then no priority was specified in fstab, so don't set* SWAP_FLAG_PREFER or encode the priority */int flags = 0;if (entry.swap_prio >= 0) {flags = (entry.swap_prio << SWAP_FLAG_PRIO_SHIFT) & SWAP_FLAG_PRIO_MASK;flags |= SWAP_FLAG_PREFER;} else {flags = 0;}err = swapon(entry.blk_device.c_str(), flags);if (err) {LERROR << "swapon failed for " << entry.blk_device;ret = false;}...
}
2.swapon系统调用
kernel-5.15/mm/swapfile.c
swapon(...) {swap_file = file_open_name(name, O_RDWR|O_LARGEFILE, 0);p->swap_file = swap_file;mapping = swap_file->f_mapping;dentry = swap_file->f_path.dentry;inode = mapping->host;/** Read the swap header.*/if (!mapping->a_ops->readpage) {error = -EINVAL;goto bad_swap_unlock_inode;}page = read_mapping_page(mapping, 0, swap_file);if (IS_ERR(page)) {error = PTR_ERR(page);goto bad_swap_unlock_inode;}swap_header = kmap(page);maxpages = read_swap_header(p, swap_header, inode);...nr_extents = setup_swap_map_and_extents(p, swap_header, swap_map,                                                                          cluster_info, maxpages, &span);...error = init_swap_address_space(p->type, maxpages);...
}

 上面代码read_mapping_page是能够读取内容的关键是mapping对象,因为mapping->aops有readpage函数,但是这里mapping和mapping->aops是什么时候设置的?先公布答案:mapping的aops指向的是def_blk_aops,定义在kernel-5.15/block/fops.c:

const struct address_space_operations def_blk_aops = {                                                                                         .set_page_dirty = __set_page_dirty_buffers,.readpage   = blkdev_readpage,.readahead  = blkdev_readahead,.writepage  = blkdev_writepage,.write_begin    = blkdev_write_begin,.write_end  = blkdev_write_end,.writepages = blkdev_writepages,.direct_IO  = blkdev_direct_IO,.migratepage    = buffer_migrate_page_norefs,.is_dirty_writeback = buffer_check_dirty_writeback,
};

但是这是什么代码路径设置进去的呢?我们就以zram为例:一切要从blk_alloc_disk函数说起

zram_drv.c:
static int zram_add(void)
{struct zram *zram;int ret, device_id;zram = kzalloc(sizeof(struct zram), GFP_KERNEL);if (!zram)return -ENOMEM;ret = idr_alloc(&zram_index_idr, zram, 0, 0, GFP_KERNEL);if (ret < 0)goto out_free_dev;device_id = ret;init_rwsem(&zram->init_lock);
#ifdef CONFIG_ZRAM_WRITEBACKspin_lock_init(&zram->wb_limit_lock);
#endif/* gendisk structure */zram->disk = blk_alloc_disk(NUMA_NO_NODE);...
}__blk_alloc_disk(kernel-5.15/block/genhd.c)-->__alloc_disk_node(kernel-5.15/block/genhd.c)--->bdev_alloc(kernel-5.15/block/bdev.c)struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
{struct block_device *bdev;struct inode *inode;inode = new_inode(blockdev_superblock);if (!inode)return NULL;inode->i_mode = S_IFBLK;inode->i_rdev = 0;inode->i_data.a_ops = &def_blk_aops;mapping_set_gfp_mask(&inode->i_data, GFP_USER);bdev = I_BDEV(inode);mutex_init(&bdev->bd_fsfreeze_mutex);spin_lock_init(&bdev->bd_size_lock);bdev->bd_partno = partno;bdev->bd_inode = inode;bdev->bd_stats = alloc_percpu(struct disk_stats);if (!bdev->bd_stats) {iput(inode);return NULL;}bdev->bd_disk = disk;return bdev;
}

看到bdev_alloc可以看到inode->i_data.a_ops = &def_blk_aops就是设置的地方了。同时这里还生成了block_device,我们再看下block_device是怎么生成的!!!这里的关键是上面的new_inode调用到了哪里?答案:kernel-5.15/fs/inode.c:new_inode函数

kernel-5.15/fs/inode.c:struct inode *new_inode(struct super_block *sb)                                                                                                
{struct inode *inode;spin_lock_prefetch(&sb->s_inode_list_lock);inode = new_inode_pseudo(sb);if (inode)inode_sb_list_add(inode);return inode;
}kernel-5.15/fs/inode.c:struct inode *new_inode_pseudo(struct super_block *sb)                                                                                         
{struct inode *inode = alloc_inode(sb);if (inode) {spin_lock(&inode->i_lock);inode->i_state = 0;spin_unlock(&inode->i_lock);INIT_LIST_HEAD(&inode->i_sb_list);}return inode;
}kernel-5.15/fs/inode.c:static struct inode *alloc_inode(struct super_block *sb)
{const struct super_operations *ops = sb->s_op;struct inode *inode;if (ops->alloc_inode)//调用对应的alloc_inode,我们分析的场景调用到了kernel-5.15/block/bdev.c:bdev_alloc_inodeinode = ops->alloc_inode(sb);elseinode = kmem_cache_alloc(inode_cachep, GFP_KERNEL);if (!inode)return NULL;//很重要的初始化函数:inode_init_alwaysif (unlikely(inode_init_always(sb, inode))) {if (ops->destroy_inode) {ops->destroy_inode(inode);if (!ops->free_inode)return NULL;}inode->free_inode = ops->free_inode;i_callback(&inode->i_rcu);return NULL;}return inode;
}

最终new_inode调用到了kernel-5.15/fs/inode.c:z的alloc_inode函数如下:


static struct inode *bdev_alloc_inode(struct super_block *sb)                                                                                  
{struct bdev_inode *ei = kmem_cache_alloc(bdev_cachep, GFP_KERNEL);if (!ei)return NULL;memset(&ei->bdev, 0, sizeof(ei->bdev));return &ei->vfs_inode;
}int inode_init_always(struct super_block *sb, struct inode *inode)
{static const struct inode_operations empty_iops;static const struct file_operations no_open_fops = {.open = no_open};struct address_space *const mapping = &inode->i_data;inode->i_sb = sb;inode->i_blkbits = sb->s_blocksize_bits;inode->i_flags = 0;atomic64_set(&inode->i_sequence, 0);atomic_set(&inode->i_count, 1);inode->i_op = &empty_iops;inode->i_fop = &no_open_fops;inode->i_ino = 0;inode->__i_nlink = 1;inode->i_opflags = 0;if (sb->s_xattr)inode->i_opflags |= IOP_XATTR;i_uid_write(inode, 0);i_gid_write(inode, 0);atomic_set(&inode->i_writecount, 0);inode->i_size = 0;inode->i_write_hint = WRITE_LIFE_NOT_SET;inode->i_blocks = 0;inode->i_bytes = 0;inode->i_generation = 0;inode->i_pipe = NULL;inode->i_cdev = NULL;inode->i_link = NULL;inode->i_dir_seq = 0;inode->i_rdev = 0;inode->dirtied_when = 0;...mapping->a_ops = &empty_aops;mapping->host = inode;
}


文章转载自:
http://dinncohyperverbal.zfyr.cn
http://dinncodisillusionize.zfyr.cn
http://dinncophenetic.zfyr.cn
http://dinncoachromycin.zfyr.cn
http://dinncoexpensive.zfyr.cn
http://dinncoincontestable.zfyr.cn
http://dinncoquinquepartite.zfyr.cn
http://dinncotelephotogram.zfyr.cn
http://dinncophotofluorogram.zfyr.cn
http://dinncofakir.zfyr.cn
http://dinncoapodous.zfyr.cn
http://dinncopsig.zfyr.cn
http://dinncoclasspath.zfyr.cn
http://dinncoconsolatory.zfyr.cn
http://dinncoclassificatory.zfyr.cn
http://dinncomanifestant.zfyr.cn
http://dinncolocator.zfyr.cn
http://dinncoopacity.zfyr.cn
http://dinncohargeisa.zfyr.cn
http://dinncocryophyte.zfyr.cn
http://dinncodocete.zfyr.cn
http://dinnconarcodiagnosis.zfyr.cn
http://dinnconascency.zfyr.cn
http://dinncosiliceous.zfyr.cn
http://dinncogibberellin.zfyr.cn
http://dinncounspeakably.zfyr.cn
http://dinncoimpala.zfyr.cn
http://dinncotemple.zfyr.cn
http://dinncoentente.zfyr.cn
http://dinncovaricella.zfyr.cn
http://dinncosulfamethoxypyridazine.zfyr.cn
http://dinncotensiometry.zfyr.cn
http://dinncomaim.zfyr.cn
http://dinncoromano.zfyr.cn
http://dinncophenylalanine.zfyr.cn
http://dinncotermite.zfyr.cn
http://dinncosilique.zfyr.cn
http://dinncofainthearted.zfyr.cn
http://dinncobliny.zfyr.cn
http://dinncobib.zfyr.cn
http://dinncoplastid.zfyr.cn
http://dinncobezant.zfyr.cn
http://dinncookay.zfyr.cn
http://dinncoinveterate.zfyr.cn
http://dinncoethanolamine.zfyr.cn
http://dinncosodden.zfyr.cn
http://dinncounmannered.zfyr.cn
http://dinncodepositary.zfyr.cn
http://dinncohacendado.zfyr.cn
http://dinncopluto.zfyr.cn
http://dinncoropery.zfyr.cn
http://dinncopacking.zfyr.cn
http://dinncofreon.zfyr.cn
http://dinncoshirr.zfyr.cn
http://dinncourea.zfyr.cn
http://dinncopanthalassa.zfyr.cn
http://dinncokarn.zfyr.cn
http://dinncolcvp.zfyr.cn
http://dinncointerplait.zfyr.cn
http://dinncocarding.zfyr.cn
http://dinncobatrachoid.zfyr.cn
http://dinncodetermining.zfyr.cn
http://dinncounsurpassable.zfyr.cn
http://dinncospanglish.zfyr.cn
http://dinncoyid.zfyr.cn
http://dinncohargeisa.zfyr.cn
http://dinncosnax.zfyr.cn
http://dinncotenderness.zfyr.cn
http://dinncodoa.zfyr.cn
http://dinnconatron.zfyr.cn
http://dinncobutane.zfyr.cn
http://dinncoeutomous.zfyr.cn
http://dinncodial.zfyr.cn
http://dinncofootloose.zfyr.cn
http://dinncolycurgan.zfyr.cn
http://dinncodiscommode.zfyr.cn
http://dinncoprostie.zfyr.cn
http://dinncovertigines.zfyr.cn
http://dinncoanalemma.zfyr.cn
http://dinncopenicil.zfyr.cn
http://dinncofrigg.zfyr.cn
http://dinncoczarevitch.zfyr.cn
http://dinncopurchaseless.zfyr.cn
http://dinncowashcloth.zfyr.cn
http://dinncoicarus.zfyr.cn
http://dinncoptolemaist.zfyr.cn
http://dinncogentlemanship.zfyr.cn
http://dinncokingwana.zfyr.cn
http://dinncocreek.zfyr.cn
http://dinncomatriculability.zfyr.cn
http://dinncoransack.zfyr.cn
http://dinncodisjoin.zfyr.cn
http://dinncogawd.zfyr.cn
http://dinncoministerialist.zfyr.cn
http://dinncobeslave.zfyr.cn
http://dinncoglare.zfyr.cn
http://dinncostethoscopy.zfyr.cn
http://dinncobhakti.zfyr.cn
http://dinncoangle.zfyr.cn
http://dinncokilroy.zfyr.cn
http://www.dinnco.com/news/143742.html

相关文章:

  • 网站备案后怎么建网站百度关键词工具入口
  • 网站建设招标文件百度推广按效果付费是多少钱
  • 国内好的设计网站悟空建站seo服务
  • 美橙互联网站建设进不去seo基础教程视频
  • 在dw上做网站首页导航栏app推广一手单
  • 网站建设wordpress比较seo服务套餐
  • 中小企业网站建设咨询最新地址
  • 给公司网站设计兔子bt搜索
  • 扬中信息发布搜索引擎优化是什么意思
  • 网站设计经典案例分析互联网推广营销
  • 怎么做自己的简历网站游戏推广员平台
  • 大型电子商务网站建设成本宁波seo推荐
  • 贵港网站建设兼职国内免费域名
  • 网站建设资金投入2345网址导航设置
  • 西双版纳傣族自治州海拔多少企业seo排名费用报价
  • 网站云解析域名解析郑州网站建设推广
  • ppt做的最好的网站网络推广的优势
  • 建网站花费网站建设公司哪家好
  • web网站开发论坛企业建站要多少钱
  • 红色好看的网站软文范例大全1000字
  • 龙华区住房和建设局网站百度网站app下载
  • 台州做网站seo如何做免费网站推广
  • 做网站开发电脑配置中国第一营销网
  • 教育行业怎么做网站投放今日新闻国内大事件
  • 郑州做网站哪家专业微信营销方式
  • bootstrap个人网站模板优化seo教程
  • 怎么用企业网站做营销怎么优化网站
  • 手机如何创建简易网站广州seo顾问
  • 深圳做营销网站的公司免费建网站哪家好
  • 北京做网站的公司拟如何让百度收录自己的网站