写点什么

《操作系统实战 45 讲》笔记 4——设备与文件系统

作者:袁世超
  • 2023-09-15
    北京
  • 本文字数:800 字

    阅读完需:约 3 分钟

28 | 部门分类:如何表示设备类型与设备驱动?



“驱动”规定了 12 个“函数”用于设备定制实现

typedef drvstus_t (*drivcallfun_t)(device_t*,void*);
复制代码


29 | 部门建立:如何在内核中注册设备?


驱动程序入口和退出函数,2 个

typedef drvstus_t (*drventyexit_t)(struct s_DRIVER*,uint_t,void*);
复制代码


驱动的中断处理函数

typedef drvstus_t (*intflthandle_t)(uint_t ift_nr,void* device,void* sframe);
复制代码


30 | 部门响应:设备如何处理内核 I/O 包?

第 25、26 讲中进程调度没有时间片的概念,在这一讲实现的 systick 弥补了这一不足

void krlthd_inc_tick(thread_t *thdp){
cpuflg_t cpuflg; krlspinlock_cli(&thdp->td_lock, &cpuflg); thdp->td_tick++; if (thdp->td_tick > TDRUN_TICK) { thdp->td_tick = 0; krlsched_set_schedflgs(); } krlspinunlock_sti(&thdp->td_lock, &cpuflg); return;}
复制代码


进程执行的 tick 大于 TDRUN_TICK,那么将对应 CPU 的 sda_schdflgs 字段设置为 NEED_SCHED_FLGS。

void krlsched_chkneed_pmptsched(){    cpuflg_t cpuflg;    uint_t schd = 0, cpuid = hal_retn_cpuid();    schdata_t *schdap = &osschedcls.scls_schda[cpuid];
krlspinlock_cli(&schdap->sda_lock, &cpuflg);
if (schdap->sda_schdflgs == NEED_SCHED_FLGS && schdap->sda_premptidx == PMPT_FLGS) { schdap->sda_schdflgs = NOTS_SCHED_FLGS; schd = 1; } if (schdap->sda_schdflgs == NEED_START_CPUILDE_SCHED_FLGS) { schd = 1; } krlspinunlock_sti(&schdap->sda_lock, &cpuflg); if (schd == 1) {
krlschedul(); } return;}
复制代码


在中断结束之后会调用该函数,该函数会根据 sda_schdflgs 判断是否要调用之前熟悉的 krlschedul 函数。


32 | 仓库结构:如何组织文件?


33 | 仓库划分:文件系统的格式化操作


发布于: 刚刚阅读数: 5
用户头像

袁世超

关注

还未添加个人签名 2017-11-30 加入

还未添加个人简介

评论

发布
暂无评论
《操作系统实战 45 讲》笔记4——设备与文件系统_操作系统_袁世超_InfoQ写作社区