30天自制操作系统日志第5天
系统管理软件实习日记

系统管理软件实习日记
实习日记 - 系统管理软件部门
星期一:
今天是我在系统管理软件部门的第一天实习。
上午,我受到导师的指导,学习了公司的系统架构和运行流程。
下午,我开始独立完成一些简单的任务,如查看服务器运行状态和更新软件版本。
星期二:
我今天学习了如何管理用户权限和配置网络设置。
我也跟随导师一起参与了一个紧急的故障排查工作,学到了很多实际操作经验。
星期三:
今天我开始进行一项重要的项目,需要对公司的系统进行升级和优化。
我花了大部分时间阅读文档和学习相关知识,准备着手实施。
星期四:
在项目进行过程中,我遇到了一些困难,导致系统出现了一些不稳定的情况。
我及时向导师汇报,一起分析问题的原因并找到解决方案。
通过这次经历,我学会了及时沟通和团队合作的重要性。
星期五:
项目终于完成了,公司的系统运行稳定且效率提升了。
导师对我的工作进行了肯定,并鼓励我继续努力学习和提升自己。
我感到很有成就感,也更加对系统管理软件这个领域充满热情。
总结:
这一周的实习经历让我收获颇丰,不仅学到了很多专业知识和技能,也体会到了实际工作的挑战和乐趣。
我会继续努力,为公司的发展贡献自己的力量。
Windows系统中的系统日志查看与分析

Windows系统中的系统日志查看与分析Windows操作系统提供了一个系统日志功能,用于记录操作系统和应用程序的活动和事件。
系统日志是管理员和技术支持人员用来诊断系统问题和监视系统性能的重要工具。
本文将介绍在Windows系统中如何查看和分析系统日志。
一、查看系统日志在Windows系统中,可以通过事件查看器来查看系统日志。
以下是查看系统日志的方法:1. 打开事件查看器在Windows操作系统的开始菜单中,搜索并打开“事件查看器”。
2. 导航至系统日志在事件查看器左侧的导航栏中,展开“Windows日志”,然后选择“系统”。
3. 检查日志系统日志中列出了操作系统的各种事件和错误。
可以根据事件级别(如错误、警告、信息)和日期范围进行筛选和排序。
二、分析系统日志系统日志中的事件提供了有关系统的重要信息和警告。
以下是分析系统日志的一些常见方法:1. 查找错误和警告在系统日志中,查找错误(红色叉号)和警告(黄色感叹号)的事件。
这些事件表示可能存在的问题或潜在的系统错误。
2. 查看事件详细信息双击一个事件,以查看其详细信息。
可以获得有关事件的时间戳、源、类别和描述等信息。
此外,还可以查看事件的特定属性和数据。
3. 使用筛选器事件查看器提供了筛选器功能,可以根据关键字、事件ID和事件级别等条件来筛选事件。
这有助于快速找到与特定问题相关的事件。
4. 导出日志有时,需要将系统日志导出并共享给其他技术支持人员。
可以使用事件查看器的导出功能将日志保存为文件,供后续分析和分享。
三、常见的系统日志事件以下是一些常见的系统日志事件及其含义:1. 硬件故障事件这些事件通常与硬件设备(如磁盘驱动器、内存)有关,表示硬件故障或错误。
2. 系统错误事件这些事件表示操作系统遇到了错误或异常情况。
例如,系统崩溃、蓝屏或无响应等。
3. 应用程序错误事件这些事件与特定应用程序有关,表示应用程序遇到了错误或异常情况。
4. 安全事件安全事件包括登录失败、文件访问权限等与系统安全相关的事件。
浅谈管理系统操作日志设计(附操作日志类)

浅谈管理系统操作⽇志设计(附操作⽇志类) 管理系统的操作⽇志如何做成通⽤的模块⼀直是个让我头疼的问题,不过看了博客园⾥的某篇⽂章后,现在基本解决了。
相关⽂章链接:《》 在开始做之前,必须把两个⽇志分清楚,那就是普通操作⽇志和业务操作⽇志,这两者有何区别? 在我理解,普通操作⽇志就是单表的操作记录,⽽业务操作⽇志则就是⼀系列的普通操作⽇志的集合。
打个⽐⽅,⽤户需要购买⼀样宝贝,已经到了下单那步,下单就是个业务,这个业务背后就是⼀系列的业务,如: ⽣成订单 → ⽣成商品快照 → 发送⼀条站内信 → 删除购物车⾥对应宝贝 这样⼀个下单操作就包含了4部分,可以把这4部分看成是4张表,分别对这4张表进⾏对应的操作,就实现了业务。
但今天我要讲的不是业务操作⽇志,因为不同项⽬的业务不尽相同,所以它⽆法做成通⽤模块,⽽我要讲的,就是普通操作⽇志。
上⾯解释了⼀⼤段,下⾯⼲货就要亮相了,先洗把脸清醒下。
…… ⾸先,哪些地⽅需要记录操作⽇志?执⾏insert、update、delete这3个操作的时候,就需要进⾏⽇志,⽽⽇志执⾏的先后顺序如下insert在insert后执⾏update在update前后都要执⾏,操作前获取操作前数据,操作后获取操作后数据delete在delete前执⾏ 顺序清楚后,就来看下我写的⼀份⽇志操作类吧,第⼀版随便写写的,重复代码有点多,还未来得及优化。
class LOG{protected $primaryid;protected $tbid;protected $tbname;protected $keys;protected $values;/*** 参数说明* int $tbid 查询指定表的id* string $tbname 数据库表名*/public function insert($tbid, $tbname){global $db;//查询表注释$db->query('show table status where name = "'.$tbname.'"');$tb = $db->fetch();//插⼊⽇志主表$returnid = $db->insert(0, 2, 'tb_log', array('adminid = '.$_SESSION['admin']['id'],'type = 1','tableid = '.$tbid,'tablename = "'.$tbname.'"','comment = "'.$tb['Comment'].'"','dt = now()'));//查询字段注释$db->query('show full columns from '.$tbname);$tb = $db->fetchAll();foreach($tb as $v){$commentArray[$v['Field']] = $v['Comment'];}//查询所有字段信息,插⼊⽇志从表$rs = $db->select(0, 1, $tbname, '*', 'and tbid = '.$tbid);$keys = array_keys($rs);$values = array_values($rs);for($i = 0; $i < count($keys); $i++){$db->insert(0, 0, 'tb_log_content', array('logid = '.$returnid,'tbkey = "'.$keys[$i].'"','tbvalue = "'.$values[$i].'"','comment = "'.$commentArray[$keys[$i]].'"'));}}public function updateStart($tbid, $tbname){global $db;//查询表注释$db->query('show table status where name = "'.$tbname.'"');$tb = $db->fetch();//插⼊⽇志主表$returnid = $db->insert(0, 2, 'tb_log', array('adminid = '.$_SESSION['admin']['id'],'type = 2','tableid = '.$tbid,'tablename = "'.$tbname.'"','comment = "'.$tb['Comment'].'"','dt = now()'));//查询修改前数据信息$rs = $db->select(0, 1, $tbname, '*', 'and tbid = '.$tbid);$keys = array_keys($rs);$values = array_values($rs);$this->primaryid = $returnid;$this->tbid = $tbid;$this->tbname = $tbname;$this->keys = $keys;$this->values = $values;}public function updateEnd(){global $db;//查询字段注释$db->query('show full columns from '.$this->tbname);$tb = $db->fetchAll();foreach($tb as $v){$commentArray[$v['Field']] = $v['Comment'];}//查询修改后数据信息$rs = $db->select(0, 1, $this->tbname, '*', 'and tbid = '.$this->tbid); $currentvalues = array_values($rs);//前后信息进⾏⽐较for($i = 0; $i < count($currentvalues); $i++){if($this->values[$i] !== $currentvalues[$i]){$db->insert(0, 0, 'tb_log_content', array('logid = '.$this->primaryid,'tbkey = "'.$this->keys[$i].'"','tbvalue = "'.$this->values[$i].'"','currenttbvalue = "'.$currentvalues[$i].'"','comment = "'.$commentArray[$this->keys[$i]].'"'));}}}public function delete($tbid, $tbname){global $db;//查询表注释$db->query('show table status where name = "'.$tbname.'"');$tb = $db->fetch();//插⼊⽇志主表$returnid = $db->insert(0, 2, 'tb_log', array('adminid = '.$_SESSION['admin']['id'],'type = 3','tableid = '.$tbid,'tablename = "'.$tbname.'"','comment = "'.$tb['Comment'].'"','dt = now()'));//查询字段注释$db->query('show full columns from '.$tbname);$tb = $db->fetchAll();foreach($tb as $v){$commentArray[$v['Field']] = $v['Comment'];}//查询所有字段信息,插⼊⽇志从表$rs = $db->select(0, 1, $tbname, '*', 'and tbid = '.$tbid);$keys = array_keys($rs);$values = array_values($rs);for($i = 0; $i < count($keys); $i++){$db->insert(0, 0, 'tb_log_content', array('logid = '.$returnid,'tbkey = "'.$keys[$i].'"','tbvalue = "'.$values[$i].'"','comment = "'.$commentArray[$keys[$i]].'"'));}}} 使⽤前,需要引⼊数据库操作类,这是我之前写的⼀份,可参考《》。
系统管理员周系统运行日志

系统管理员周系统运行日志日期:2022年9月1日午间工作日志:9:00 AM:开始工作,首先检查所有服务器和网络设备的运行状态,确保系统正常运行。
检查了主服务器、数据库服务器以及网络交换机,均未发现异常。
9:30 AM:接到用户报告,称某个特定应用程序在访问时出现了问题。
迅速跟进该问题,尝试重新启动该应用程序,并监测其运行状态。
确认应用程序正常启动,并没有出现异常错误。
10:00 AM:继续跟进前期的故障报告,发现是由于某个子系统的故障导致的。
通过系统日志分析,发现该子系统出现了内存泄漏的问题,进一步调查原因并解决问题。
11:00 AM:处理用户反馈的登录问题,多个用户无法正常登录系统。
担忧这可能是一个安全漏洞,立即对系统进行全面的安全检查。
通过检查系统日志和网络访问记录,发现有多次登录失败和异常的访问行为。
立即采取应对措施,增强系统的安全性,更新防火墙规则并要求用户重置密码。
12:00 PM:继续监控系统运行状况,并对服务器进行性能优化。
检查了系统的CPU和内存使用率,确保没有超过预期的限制。
对磁盘空间进行监测,及时清理无用文件和日志,释放磁盘空间,避免磁盘占用过大影响系统性能。
下午工作日志:1:00 PM:收到新的升级通知,某个核心系统将在晚上进行重大版本升级。
根据升级通知,我制定了详细的升级计划,并与开发团队和其他管理员进行了沟通。
准备了备份文件和恢复计划,确保升级过程中的数据安全性。
2:00 PM:为用户提供技术支持,解决了一些常见的问题,例如网络连接中断、电脑系统崩溃等。
通过远程协助和现场指导,及时解决了用户的困扰,确保系统的可用性和稳定性。
3:00 PM:协助开发团队测试新版本的功能和性能。
与开发人员一起,对升级后的系统进行测试,并记录和报告了发现的问题。
与开发团队讨论了解决问题的方案,并提供了一些建议和改进措施。
4:30 PM:结束了一天的工作,进行了系统日志的总结和归档工作。
对今天的操作和事件进行了详细记录和分析,为未来的系统维护和故障排查提供了依据。
系统管理员周系统运行日志

系统管理员周系统运行日志2022年3月1日早上8点:开始工作。
首先,检查服务器的运行状况。
登录系统,并查看各个服务器的运行状态。
确认所有服务器都正常运行,并检查网络连接是否稳定。
检查日志,没有发现任何异常情况。
上午10点:收到用户报告,称某个应用程序在访问数据库时遇到问题。
立即定位该应用程序所在的服务器,并检查相应的日志文件。
发现数据库连接出现故障,无法与应用程序成功建立连接。
尝试重新启动数据库服务,问题得到解决。
中午12点:午饭休息时间。
下午2点:接收到报警通知,提示某台服务器上的硬盘空间不足。
立即登录该服务器,并使用命令行工具查看磁盘使用情况。
发现某个日志文件不断增长,占用了大量磁盘空间。
通过清理过期的日志文件,释放了足够的磁盘空间。
下午4点:进行系统安全检查。
检查系统的安全设置,确保防火墙和入侵检测系统正常运行。
扫描服务器,查找潜在的安全漏洞并修复。
更新服务器上的安全补丁。
下午6点:安排定期数据备份任务的执行。
确保所有重要数据都得到及时备份,并验证备份文件的完整性和可还原性。
晚上8点:整理运行日志文档,记录当天的所有操作和故障处理过程。
详细描述每个故障的原因和解决方法。
晚上10点:工作结束,关闭服务器,下班回家。
2022年3月2日早上8点:开始工作。
检查昨天的运行日志,确认是否有未解决的问题。
发现有一个用户报告了无法登录系统的问题。
立即与该用户联系,并进行远程支持。
通过重置用户密码,问题得到解决。
上午10点:参加网络安全培训课程。
学习最新的网络安全威胁和防护措施,提高自身的技术水平。
中午12点:午饭休息时间。
下午2点:对服务器进行性能优化。
检查服务器的负载情况,查找可能导致性能下降的原因。
优化数据库查询语句和服务器配置,提升系统响应速度。
下午4点:处理用户提交的故障工单。
根据工单的描述,远程登录用户的计算机,并进行故障排除。
通过与用户的沟通,确定问题是由于网络连接不稳定导致的,建议用户与网络服务提供商联系。
系统日志手册

系统日志手册系统日志是一份记录系统运行情况和故障的文件,它包含各种信息,包括硬件、软件和网络方面的问题。
作为系统管理员,了解和分析日志信息可以帮助您更好地了解系统运行状态并有效地应对故障。
本手册将为您介绍系统日志的基本概念、格式和内容,并提供一些实用的技巧和工具,旨在帮助您更有效地管理和分析系统日志。
一、什么是系统日志系统日志是操作系统和应用程序自动生成的一个文件,用来记录系统的各种事件、错误和警告信息。
日志事件可被分为三个主要类别:信息、警告和错误。
信息事件用于报告系统工作和状态信息,警告事件用于标识可能影响系统性能和可用性的问题,错误事件则指明产生了错误且需要立即检查和纠正。
系统日志可以帮助管理员快速识别并解决各种问题,包括应用程序错误、系统配置错误、硬件问题等等。
可以有效地提高系统的可用性和可维护性。
二、系统日志的格式系统日志的格式因操作系统和应用程序的不同而异,但通常会包含以下元素:1. 时间戳:记录事件发生的日期和时间。
2. 日志级别:记录事件的级别,分为信息、警告和错误三种。
3. 事件源:记录事件发生的应用程序或系统组件。
4. 事件 ID:事件 ID 是事件的唯一标识符,可用于查找和过滤相关事件。
5. 事件描述:详细描述事件的发生和详细信息,提供有用的上下文。
6. 操作员:记录执行操作的用户。
三、系统日志的内容系统日志包含了各种信息,以下是对常用日志消息的描述:1. 安全事件日志安全事件日志是记录审核和安全性方面的事件,包括成功或失败的登录尝试、安全组和用户管理操作等等。
这些日志非常重要,可以帮助您监控是否有恶意攻击、未经授权的访问等安全问题。
2. 应用程序事件日志应用程序事件日志记录应用程序初始化、运行时和关闭等各种事件。
其中包括应用程序崩溃、异常、错误信息等,是分析应用程序问题的关键信息来源。
3. 系统事件日志系统事件日志提供了有关系统资源、设备服务和底层操作系统的事件记录,包括停止和启动服务、硬件或软件故障,系统资源耗尽等。
程序员实习日记

程序员实习日记程序员实习日记「篇一」我们在使用tooltip的时候,有以下几个关键点:1、创建CToolTipCtrl对象,Create函数实现。
2、使用AddTool函数向这个tooltip中加入tools,这也是绑定tool到某个控件的过程,从中我们可以知道在这个CToolTipCtrl对象中应该存在着不止一个tool,而是一系列的tool,通过函数DelTool实现删除,AddTool实现添加,UpdateTipText实现更新tool的文本。
3、最关键的是我们需要一个触发tooltip的关键点,这个关键点控制着何时显示这个tooltip,一般情况下我们在PreTranslateMessage函数中进行处理,这也是我们拦截WM_MOUSEMOVE的地方,拦截之后,我们调用tooltip的RelayEvent 向toolTip对象传递这个消息用以表示tooltip可以被显示或者更新。
静态链接MFC DLL模块的时候,由于MFC总是使用它所练级额的DLL模块状态,所以不存在模块管理的问题。
调试DLL的时候,我们需要exe文件的配合,所以先要生成exe测试文件,然后将DLL工程设置成active ,这时候会出现exe路径提示对话框,我们将测试用的exe路径填入就可以了。
程序员实习日记「篇二」今天是实习的第一天,走进公司的时候,与主管进行了简单的面谈之后,并没有给我留下过多的任务,先让我熟悉一下环境,了解了一下公司的状况,包括其规模、部门、人员分工等。
由于在校的时候实际锻炼的机会比较少,在这要学的东西有很多。
一天基本都是在学习,熟悉环境。
这边吃饭要到餐馆去买,贵啊:(!不像在学校有食堂,饭菜经济实惠!程序员实习日记「篇三」终于解决了困扰已久的apache不能启动的问题,首先xampp里出现 busy apache start[port 80]时先检查你的80端口是否被占用,我用的扫描端口软件是TCPView 保证没有本地占用80端口,而且发现即使在xamppapacheconf 中改了httpd文件里面的端口设置,在concle里面还是现实80端口但是查看TCP的时候明显他是用了你设置的端口(8080),但是只有用80的时候可以从127.0.0.1或者https://localhost进入,因为用这个进入是默认为127.0.0.1:80或者localhost:80所以只改了httpd里面的80是不行的必须在访问网页的时候加上:8080(假设我设置的是用8080端口)程序员实习日记「篇四」今天下班后回宿舍上机调试程序,一个java网站,用Tomcat作服务器,在被浏览器加载的时候总是无法显示出来,页面提示出错信息:500错误。
Windows系统专家教你如何设置和管理系统日志

Windows系统专家教你如何设置和管理系统日志在使用Windows操作系统时,系统日志是非常重要的一部分。
它记录了系统的运行状态、错误信息以及其他相关信息,能够帮助用户诊断和解决系统问题。
本文将向大家介绍如何设置和管理Windows系统日志,以帮助您更好地监控和维护您的计算机。
一、什么是系统日志系统日志是Windows操作系统中的一个重要组成部分,用于记录操作系统和应用程序的事件和错误信息。
它包含了以下三个主要日志类型:1. 应用程序日志(Application log):记录应用程序的事件和错误信息,如软件的安装和卸载、应用程序崩溃等。
2. 安全日志(Security log):记录安全事件和审计信息,如用户登录和注销、账户访问权限等。
3. 系统日志(System log):记录与操作系统相关的事件和错误信息,如设备驱动程序错误、系统崩溃等。
二、设置系统日志在Windows系统中,您可以根据实际需求设置系统日志的属性和策略。
下面是设置系统日志的步骤:1. 打开“事件查看器”(Event Viewer):点击“开始”菜单,然后在搜索栏中输入“事件查看器”,并打开该程序。
2. 选择日志类型:在左侧面板中,展开“Windows日志”文件夹,可以看到应用程序日志、安全日志和系统日志三个选项。
3. 添加或删除日志事件:在选中的日志类型下,右键点击空白区域,选择“属性”或“清除日志”选项来设置日志属性或删除日志事件。
4. 配置事件筛选器:点击相应日志类型下的“事件筛选器”菜单,可以根据关键词、事件ID等条件来过滤和筛选所需的日志事件。
5. 设置日志存档:点击相应日志类型下的“存档日志”菜单,可以设置日志事件的存储位置和保留策略,以便将来查看和分析。
三、管理系统日志除了设置系统日志的属性,管理系统日志也是非常重要的一项任务。
下面是一些管理系统日志的技巧:1. 定期查看日志:定期浏览系统日志,注意查找和分析其中的错误和警告信息,及时采取措施解决相关问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验日志一、实验主要内容1、接收启动信息和结构体在上一章中,xsize和ysize的值都是直接赋值为320*200,但实际上我们需要从asmhead.nas 先前保存下来的值中去。
即:不然的话,当画面模式改变时系统就不能正确运行。
所以试着用指针取得图像模式:void HariMain(void){char *vram;int xsize, ysize;short *binfo_scrnx, *binfo_scrny;int *binfo_vram;init_palette(); /*设定调色板*/binfo_scrnx = (short *) 0x0ff4;binfo_scrny = (short *) 0x0ff6;binfo_vram = (int *) 0x0ff8;xsize = *binfo_scrnx;ysize = *binfo_scrny;vram = (char *) *binfo_vram;for(;;) {io_hlt(); /*執行naskfunc里的_io_hlt*/}}诶这样是不是说就可以改变画面模式了?于是天真的我:保存运行一下,以为画面会显示坐标在左上角的320*200,结果发现画面显示错误,forget about it。
诶然后发现结构体里这个在汇编里没有定义,可能作者以后讲?哦先说结构体可以看做结构体是将一堆变量集中声明,然后作为新的变量用于其他场合。
结构体的运用:(1)先声明结构体:如上图(2)后定义结构体变量:struct BOOTINFO abc; 或者定义结构体指针变量:struct BOOTINFO *binfo; 这里binfo表示指针变量后应该首先给指针赋值,可写成:Binfo = (structBOOTINFP *)0x0ff0;加上(struct BOOTINFP *)是对数字进行强制类型转换,告诉编译器这个数字是一个BOOTINFO类型的指针变量。
info指针指向地址0x0ff0是结构体的起始地址,结构体内的地址则依次按其类型增加。
所以可以不用直接使用内存地址,而是使用*binfo来表示这个内存地址上12个字节的结构体。
在表示结构体内变量的时候,使用“.”表示:xsize = (*binfo).scrnx;因为binfo是指向结构体地址的指针变量,它表示其内部变量的形式很多,可以用箭头表示:Xsieze = binfo->scrnx,或者用binfo->scrnx直接代替xsize2、显示字符终于到写字了,诶果然有定义好的哪个字母让具体哪个像素指定颜色,比如A的显示如下:用8x16的长方形像素点阵来表示,8位是一个字节,1个字符是16个字节,然后将字体主句写入主程序:static char font_A[16] = {0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24,0x24, 0x7e, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00};程序里就会有A的信息了,当然放在程序里总是不好的,后面就有改了。
显示字符的函数是这样:void putfont8(char *vram, int xsize, int x, int y, char c, char *font){int i;char *p, d; /* data */for (i = 0; i < 16; i++){p = vram + (y + i) * xsize + x;d = font[i];if ((d & 0x80) != 0) { p[0] = c; } //第i行的第1个像素,如果信息里存储的是1,就显示颜色Cif ((d & 0x40) != 0) { p[1] = c; }if ((d & 0x20) != 0) { p[2] = c; }if ((d & 0x10) != 0) { p[3] = c; }if ((d & 0x08) != 0) { p[4] = c; }if ((d & 0x04) != 0) { p[5] = c; }if ((d & 0x02) != 0) { p[6] = c; }if ((d & 0x01) != 0) { p[7] = c; }}return;}这里就是将这个字符的16个字节用for循环逐个位判断,修改像素颜色,最终显示字符。
然后再主函数中调用:putfont8(binfo->vram, binfo->scrnx, 10, 10, COL8_FFFFFF, font_A);运行结果如下:3、增加字体刚刚程序里只有字符A的信息,只能方便地显示A,那其他字符当然也要存啊,将平木敬太郎和圣人先生编辑好了的OSAKA字体(hankaku.txt)加入到源程序中,然后用工具(makefont.exe)将此文本读进来输出成16x256=4096字节的文件。
编译后生成hankaku.bin 文件,加上连接所必须的接口信息变成目标文件(bin2obj.exe来完成)。
翻译之后相当于增加了此汇编语言:_hankaku:DB 各种数据(共4096字节)然后像以前编译C语言写Makefile一样修改Makefile,加上相关代码。
如果要在C语言中使用这种字体数据,只需要写上:Extern char hankaku[4096];像这种在源程序以外准备的数据,都需要加上externa属性。
让编译器知道它是外部数据,并在编译时做出相应调整。
OSASK 的字体数据,依照一般的ASCⅡ字符编码,含有256 个字符。
A 的字符编码是0x41, 所以 A 的字体数据,放在“hankaku + 0x41 * 16 ”开始的16 字节里。
C 语言中 A 的字符编码可以用’A’来表示,正好可以用它来代替0x41 ,所以也可以写成“hankaku+’A’* 16 ”。
4、显示字符串和变量值在上一小节中,显示每次显示一个字母都会有这一句,比较繁琐:putfont8(binfo->vram, binfo->scrnx, 8, 8, COL8_FFFFFF, hankaku + 'A' * 16);像这种需要反复使用的语句,可以写成一个函数,再对此进行调用:函数需要的实际参数有binfo->vram, binfo->scrnx, 8, 8, COL8_FFFFFF, hankaku + 'A' * 16,对应于此设计函数的形参为:char *vram, int xsize, int x, int y, char c, unsigned char *svoid putfont8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s){extern char hankaku[4096];for (; *s 1= 0x00; s++){putfont8(vram, scrnx, x, y, c, hankaku + *s * 16);x += 8;}return;}然后在主函数进行调用:void HariMain(void){struct BOOTINFO *binfo = (struct BOOTINFO *) 0x0ff0;init_palette(); /*设定调色板*/init_screen(binfo->vram, binfo->scrnx, binfo->scrny);putfont8_asc(binfo->vram, binfo->scrnx, 8, 8, COL8_FFFFFF, "ABC 123");putfont8_asc(binfo->vram, binfo->scrnx, 31, 31, COL8_000000, "Haribote OS.");putfont8_asc(binfo->vram, binfo->scrnx, 30, 30, COL8_FFFFFF, "Haribote OS.");for(;;) {io_hlt(); /*執行naskfunc里的_io_hlt*/}}这里调用了三次,后面两次先显示的黑色,再在不同但临近坐标显示一次白色,达到立体效果。
效果如下:然后这里作者说,要自制操作系统,现在就能自由显示变量很重要。
因为这里没用debug可以用,如果出现错误就会很麻烦,就迫切需要知道变量有没有弄错。
这里用到一个sprintf函数。
sprintf函数和printf函数的区别在于它不是按指定格式输出,只是将输出内容作为字符串卸载内存中。
sprintf函数的使用办法是:sprintf(地址,格式,值,值,值,……)这里的地址指定所生成字符串的存放地址。
格式基本上只是单纯的字符串,如果有%的这类标记,就置换成后面的值的内容。
除了%d(将数值作为十进制数转化为字符串)还有%s,%x(将数值作为十六进制转化为字符串)等符号。
这里看来,sprintf函数的效果不过是将相应格式的内容存到相应地址罢了,要显示输出还是靠putfont8。
5、显示鼠标指针显示指针跟显示字符思路一样,也是先准备16*16=256字节的内存,然后往里面写入指针的数据。
将这个程序写在函数里面://绘制鼠标void init_mouse_cursor8(char *mouse, char bc)/*准备鼠标指针(16x16)*/{static char cursor[16][16] = {"**************..","*OOOOOOOOOOO*...","*OOOOOOOOOO*....","*OOOOOOOOO*.....","*OOOOOOOO*......","*OOOOOOO*.......","*OOOOOOO*.......","*OOOOOOOO*......","*OOOO**OOO*.....","*OOO*..*OOO*....","*OO*....*OOO*...","*O*......*OOO*..","**........*OOO*.","*..........*OOO*","............*OO*",".............***"};int x, y;for (y = 0; y < 16; y++) {for (x = 0; x < 16; x++) {if (cursor[y][x] == '*') {mouse[y * 16 + x] = COL8_000000;}if (cursor[y][x] == 'O') {mouse[y * 16 + x] = COL8_FFFFFF;}if (cursor[y][x] == '.') {mouse[y * 16 + x] = bc;}}}return;}课本说什么要将上面背景色显示出来,还要做下面这个函数,搞得我差点误解,看了半天,这个不就是将整个鼠标显示出来吗。