共 1 篇文章

标签:探究Linux的outb函数的作用和应用 (linux outb())

探究Linux的outb函数的作用和应用 (linux outb())

Linux是一种使用广泛的开源操作系统,而outb函数则是Linux中的一个重要函数。outb函数是Linux中的输入输出函数,其作用是从CPU将数据输出到指定的端口。 在操作系统中,硬件和软件之间的通讯是通过端口进行的。outb函数就是通过写入指定的端口来实现信息的传输,从而在软件和硬件之间构建一个通讯桥梁。而这种输入输出端口的地址都是由硬件设备携带的,例如硬盘、鼠标、键盘等设备都有自己的输入输出端口。 正常情况下,不推荐直接使用outb函数,因为它是寄存器级别的输入输出操作,容易发生系统崩溃等不可挽回的错误。但是在一些特殊的情况下,使用outb函数则是必不可少的。比如,在使用Linux系统时,需要进行一些低级别的驱动程序开发或者底层硬件开发时,就必须要用到outb函数。因为驱动程序开发或者硬件开发需要高效的进行数据传输和操作,这时用到outb函数就可以实现对硬件设备的精确控制。 在Linux系统的底层开发中,outb函数具有非常重要的应用。其中最常见的应用场景是对各类硬盘管理的操作。硬盘是计算机中的重要组成部分,而outb函数则是在Linux下实现硬盘操作的关键。在一些需要直接控制硬盘进行读写操作时,outb函数则成为更佳的选择。 此外,outb函数还具有其他的应用场景,例如在进行嵌入式系统开发时,也可以使用outb函数来实现硬件控制和数据输入输出操作。 总体而言,outb函数是Linux系统下至关重要的输入输出函数。虽然它是一种“危险”的函数,但是同时也是一种非常实用和必要的方法。在进行底层开发和硬件控制时,outb函数可以满足开发人员对底层硬件的精确控制和操作需求,提高技术开发的效率。因此对于需要进行硬件开发的学习者和开发人员而言,理解outb函数的作用和应用是非常必要的。 相关问题拓展阅读: linux 启动时何时初始化console,串口等 Linux内核完全注释中CMOS_READ(addr)函数 ioremap最多映射多大空间 linux 启动时何时初始化console,串口等 1、LINUX下TTY、CONSOLE、串口之间是怎样的层次关系?具体的函数接口是怎样的?串口是如何被调用的?  2、printk函数是把信息发送到控制台上吧?如何让PRINTK把信息通过串口送出?或者说系统在什么地方来决定是将信息送到显示器还是串口?  3、start_kernel中一开始就用到了printk函数(好象是printk(linux_banner什么的),在 这个时候整个内核还没跑起来呢那这时候的printk是如何被调用的?在我们的系统中,系统启动是用的现代公司的BOOTLOADER程序,后来好象跳到了LINUX下的head-armv.s, 然后跳到start_kernel,在bootloader 里串口已经是可用的了,那么在进入内核后是不是要重新设置?  以上问题可能问的比较乱,因为我自己脑子里也比较乱,主要还是对tty,console,serial之间的关系,特别是串口是如何被调用的没搞清这方面的资料又比较少(就情景分析中讲了罩悉一点),希望高手能指点一二,非常谢! 我最近也在搞这方面的东西,也是写一个串口设备的驱动  搞了将近一个月了,其中上网找资料,看源代码,什么都做了  但还是一蹋糊涂的,有些问题还是不明白,希望一起讨论讨论  在/proc/device(没记错应该是这个文件)  里面有一个叫serial的驱动,其主设备号是4,次设备号是64-12X(没记错应该是这个范围)  大家都知道,串口的次设备号是从64开始的,串口1 /dev/ttyS0就对应次设备号64,串口2就对应65  问题是现在我机上只有两个串口,它注册这么多次设备号来干什么?  对于一个接在串口1的设备,在我注册驱动的时候  我是需要自己找一个主设备号呢?  还是就用主设备号4,次设备号从上面12X的后面选?  还是就用主设备号4,次设备号64?  在linux的内核中有一个tty层,我看好像有些串口驱动是从这里开始的  例如调用tty_register_driver()来注册驱动  就像在pci子系统里调用pci_register_driver()那样的  那么,用这种机制来注册的驱动,  它是直接对串口的端口操作呢(例如用inb(),outb()….之类的)  还是某些更底层的驱动接口呢?  这些问题缠了我很久都没解决,搞得最后不得不放弃  现在转向用户空间的应用程序,看能不能有些更高效的方法来实现  (在用户空间只能用open(“/dev/ttyS0”, O_RDWR)来实现了) 另外还有,系统里已经为我们实现了串口的驱动  所以我们在用户空间的程序里直接open(“/dev/ttyS0”)就可用了指铅  但是现在要写的是接在串口上的设备的驱动  在内核模块中可不可以包含某个唯闷好头文件,然后就可以直接用串口驱动中的接口呢? 看到你们的问题后,感觉很有典型性,因此花了点工夫看了一下,做了一些心得贴在这里,欢迎讨论并指正:  1、LINUX下TTY、CONSOLE、串口之间是怎样的层次关系?具体的函数接口是怎样的?串口是如何被调用的?  tty和console这些概念主要是一些虚设备的概念,而串口更多的是指一个真正的设备驱动Tty实际是一类终端I/O设备的抽象,它实际上更多的是一个管理的概念,它和tty_ldisc(行规程)和tty_driver(真实设备驱动)组合在一起,目的是向上层的VFS提供一个统一的接口通过file_operations结构中的tty_ioctl可以对其进行配置。查tty_driver,你将得到n个结果,实际都是相关芯片的驱动因此,可以得到的结论是(实际情况比这复杂得多):每个描述tty设备的tty_struct在初始化时必然挂如了某个具体芯片的字符设备驱动(不一定是字符设备驱动),可以是很多,包括显卡或串口chip不知道你的ARM Soc是那一款,不过看情况你们应该用的是常见的chip,这些驱动实际上都有而console是一个缓冲的概念,它的目的有一点类似于tty实际上console不仅和tty连在一起,还和framebuffer连在一起,具体的原因看下面的键盘的中断处理过程Tty的一个子集需要使用console(典型的如主设备号4,次设备号1―64),但是要注意的是没有console的tty是存在的 而串口则指的是tty_driver举个典型的例子:  分析一下键盘的中断处理过程:  keyboard_interrupt―>handle_kbd_event―>handle_keyboard_event―>handle_scancode  void handle_scancode(unsigned char scancode, int down)  {  ……..  tty = ttytab? ttytab: NULL;  if (tty && (!tty->driver_data)) {  ……………  tty = NULL;  }  ………….  schedule_console_callback();  }  这段代码中的两个地方很值得注意,也就是除了获得tty外(通过全局量tty记录),还进行了console 回显schedule_console_callbackTty和console的关系在此已经很明了!!!  2、printk函数是把信息发送到控制台上吧?如何让PRINTK把信息通过串口送出?或者说系统在什么地方来决定是将信息送到显示器还是串口?  具体看一下printk函数的实现就知道了,printk不一定是将信息往控制台上输出,设置kernel的启动参数可能可以打到将信息送到显示器的效果。函数前有一段英文,很有意思:  /*This is printk. It can be called from any context. We want it to work.  *  * We try to grab the console_sem. If we succeed, it’s easy – we log the output and  * call the...

技术分享