I/O端口

操作系统需要实现鼠标、键盘等硬件设备的相关操作,涉及到硬件编程,控制硬件是通过操作硬件芯片端口实现的。
我们将编写一个I/O端口类来实现端口管理,包括对8bit,16bit和32bit的端口。

#ifndef __PORT_H__
#define __PORT_H__

#include "types.h"

class Port 
{
protected:
    uint16_t portnumber;
    Port(uint16_t portnumber);
    ~Port();
};

class Port8Bit : public Port 
{
public:
    Port8Bit(uint16_t portnumber);
    ~Port8Bit();
    virtual void write(uint8_t data);
    virtual uint8_t read();
};

class Port16Bit : public Port
{
public:
    Port16Bit(uint16_t portnumber);
    ~Port16Bit();
    virtual void write(uint16_t data);
    virtual uint16_t read();
};

class Port32Bit : public Port
{
public:
    Port32Bit(uint16_t portnumber);
    ~Port32Bit();
    virtual void write(uint32_t data);
    virtual uint32_t read();
};

#endif

对端口的读写操作的汇编指令分别为in和out,后缀bwl表示端口的位数。这里同样使用了内联汇编的写法

  class Port8Bit : public Port {
        public:
            Port8Bit( uint16_t portnumber);
            ~Port8Bit();
            virtual void Write( uint8_t data);
            //写8bit
            virtual  uint8_t Read();
            //读8bit
        protected:
            static inline  uint8_t Read8( uint16_t _port) {
                 uint8_t result;
                __asm__ volatile("inb %1, %0" : "=a" (result) : "Nd" (_port));
                //从i/o端口读取一个字节放进result中
                return result;
            }
            static inline void Write8( uint16_t _port,  uint8_t _data) {
                __asm__ volatile("outb %0, %1" : : "a" (_data), "Nd" (_port));
                //从i/O端口输出一个字节放在data中。
            }
        };

        class Port8BitSlow : public Port8Bit {
            //继承,慢读
        public:
            Port8BitSlow( uint16_t portnumber);
            ~Port8BitSlow();
            virtual void Write( uint8_t data);
        protected:
            static inline void Write8Slow( uint16_t _port,  uint8_t _data) {
                __asm__ volatile("outb %0, %1\njmp 1f\n1: jmp 1f\n1:" : : "a" (_data), "Nd" (_port));
                //(为了实现慢读而实现,jmp 1f先向后跳,再向前跳,如此实现的慢读)
            }
        };

标签: none

评论已关闭