`
runfeel
  • 浏览: 936055 次
文章分类
社区版块
存档分类
最新评论

RayCommand操作系统的实现笔记2--完成在保护模式Text Mode下,输出字符

 
阅读更多

V0.0.2 Console Module Complete. 在这个版本中,实现了一个在保护模式下,VGA为Text Mode时,向屏幕输出字符的模块,位于/kernel/driver/console。内部有详细的注释。同时顺带着写了stdint.h和一些inline汇编。由于操作系统开发时是没有C语言标准库的,所以可以考虑该操作系统将会实现一个基本的标准库,是标准库的子集,位于/kernel/basecrt目录中。

目前版本可以从这里下载到源代码。目前版本截图如下:

可以看到,系统经由Grub或者其他multiboot引导扇区引导后,清屏,并向屏幕输出绿色的Hello world字符串。

下面记录一下,如何在保护模式中,向屏幕输出字符。

输出字符到屏幕

在保护模式中、Text Mode下,输出字符到屏幕是非常简单的事情。

在彩色模式下,屏幕中的每一个字符,与内存(实际上这段内存地址映射的应该是显存)中的0xB8000后的每一个16字节相对应。例如,屏幕最左上角的字符,和(shor*(0xB8000))[0]这个short对应。其中,这个short的高8位是颜色属性,低8位是ASCII码字符。颜色属性同dos api里的颜色属性是一致的,这里就不废话了。经由GRUB引导后,系统会进入80*25的字符模式中。

所以,向屏幕中输出字符,可以用下列示例代码表示。

void PutChar(char ch, int x, int y, char color){
	volatile uint16_t* where;	
	where=(uint16_t*)(0xB8000)+(y*80+x);	
	*where=ch| (((uint16_t)color)<<8);	
}


在显示器为单色的情况下,显存地址为0xB0000,同时屏幕中每一个字符,与该地址后每一个8位内存相对应,并没有颜色属性。代码示例如下

void PutChar(char ch, int x, int y){
	*(char*)(0xB0000)+(y*80+x) = ch;
}

判断显示器是否为彩色

在BIOS的数据段中,有显示器属性的字段,从中可以查询显示器的颜色。更多资料请参考 (http://wiki.osdev.org/Detecting_Colour_and_Monochrome_Monitors) 和 (http://wiki.osdev.org/Memory_Map_(x86)#BIOS_Data_Area_.28BDA.29) 。示例代码如下

//! False is colorful
boolean DRIVER_CONSOLE_IsVideoMono(){
	char c = (*(volatile uint16_t*)0x410)&0x30;
	return (c==0x30);
}

移动光标

同样,在BOIS数据段中,也保存了VGA操作所需要的输出port,通常是0x3D4。详细资料参考自(http://wiki.osdev.org/Text_Mode_Cursor) 示例代码如下。不过值得注意的是,下面的代码为通常情况下的代码,有可能输出端口不是0x3D4,也有可能当前模式不是80*25。

 /* void update_cursor(int row, int col)
  * by Dark Fiber
  */
 void update_cursor(int row, int col)
 {
    unsigned short position=(row*80) + col;
 
    // cursor LOW port to vga INDEX register
    outb(0x3D4, 0x0F);
    outb(0x3D5, (unsigned char)(position&0xFF));
    // cursor HIGH port to vga INDEX register
    outb(0x3D4, 0x0E);
    outb(0x3D5, (unsigned char )((position>>8)&0xFF));
 }


Future Work

下一步的目标,在键盘可以输出简单的字符串后,书写键盘的输入驱动,将最基本的输入输出搞定。

分享到:
评论

相关推荐

    Redis学习笔记-安装、性能、复制等

    - 设置保护模式(`protected-mode no`)以避免安全问题。 2. **配置Slave**: - 在`redis.conf`中设置`slaveof &lt;master-ip&gt; &lt;master-port&gt;`以指定Master节点的信息。 - 调整`repl-diskless-sync`参数以控制同步时...

    Linux系统编程学习笔记

    - 文件描述符是操作系统为打开的文件分配的一个非负整数,用于标识文件。在Linux中,文件描述符通常是从0开始递增的。 **2.2 文件描述符操作** - **open/close/creat**: `open` 用于打开或创建文件并返回文件描述...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    操作系统的身份登录 2. 连接命令(conn) 说明:用于连接到oracle数据库,也可实现用户的切换 用法:conn 用户名/密码 [as sysdba/sysoper] 注意:当用特权用户连接时,必须带上sysdba或sysoper 例子: 3. 断开...

    《LINUX与UNIX SHELL编程指南》读书笔记 crack.pdf

    ### 《LINUX与UNIX SHELL编程指南》读书笔记知识点解析 #### 一、文件的安全与权限 在《LINUX与UNIX SHELL编程指南》这本书中,作者详细介绍了Linux及Unix系统中关于文件的安全性和权限管理的核心概念。这部分内容...

    笔记本wifi上网

    - 在使用上述方法前,请确保您的笔记本电脑操作系统支持承载网络功能。一般来说,Windows 7及以上版本均具备此项特性。 - 为了保证网络安全,建议定期更改WiFi密码,并选择合适的加密方式(如WPA2)来保护数据传输...

    jt09日常笔记

    - **哨兵配置**:在使用哨兵机制时,需要注意保护模式(protected-mode)的设置,尤其是在哨兵进行主从切换时,新的IP地址需要正确地写入`sentinel.conf`配置文件中。 #### 4. Redis 在项目中的应用 - **Spring ...

    32位汇编语言程序设计-钱晓捷1

    - X86处理器的三种主要操作模式包括实模式(Real Mode)、保护模式(Protected Mode)和虚拟8086模式(Virtual 8086 Mode)。 - 在X86的实地址模式中,内存寻址的大小为16位,地址范围是从0到0FFFFH,即64KB的内存...

    2009 达内Unix学习笔记

    mkdir dir1/dir2 在dir1下建dir2 mkdir dir13 dir4 dir5 连建多个 mkdir ~/games 用户主目录下建(默认在当前目录下创建) mkdir -p dir6/dir7/dir8 强制创建dir8;若没有前面的目录,会自动创建dir6和dir7。 ...

    IBM AIX 安装文件

    IBM AIX 是一款在IBM Power Systems 上运行的Unix 操作系统,以其高性能和稳定性著称,广泛应用于企业级服务器环境中。本篇笔记将围绕AIX 的安装、配置以及常见管理命令进行详细介绍。 ### 一、用户权限管理 #### ...

    Win7虚拟无线路由器

    - **安全性考量**:虽然WPA2加密可以提高安全性,但在公共场合使用时仍然要注意保护个人信息安全,比如不进行敏感操作、定期更换Wi-Fi密码等。 通过以上详细的介绍,我们可以看到,在Windows 7系统中虚拟出无线...

    android 手机防盗 笔记

    在Android平台上,手机防盗系统是保护用户设备安全的重要机制,涉及到多个关键知识点。本文将针对提供的信息,详细解析SharedPreferences、AlertDialog以及TelephonyManager在手机防盗系统中的应用。 1. **...

    win7变成无线路由

    本文将详细介绍如何利用Windows 7操作系统的一项隐藏功能——“虚拟Wifi”,将笔记本电脑转变为一个无线路由器。这项功能不仅方便实用,还能帮助解决多种场景下的网络连接需求。 #### 虚拟Wifi功能详解 **虚拟Wifi...

    redis3分布式集群部署

    - 禁用保护模式:`protected-mode no` - 设置端口:`port 7000` - 后台运行:`daemonize yes` - 设置 PID 文件路径:`pidfile /var/run/redis_7000.pid` - 数据文件存放路径:`dir /usr/local/redis-cluster/7000` -...

Global site tag (gtag.js) - Google Analytics