Linux下讀寫暫存器

2021-09-22 22:10:50 字數 2901 閱讀 2670

arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心:linux為了支援多個硬體體系,在io訪問上做了自己的介面。可以通過io記憶體和io埠這兩種方式進行io訪問。在led的例子上給出這兩種方式的具體實現:

1.利用io port的方式:

#include

#include

#include

#include /* printk() */

#include /* kmalloc() */

#include /* everything... */

#include /* error codes */

#include /* size_t */

#include

#include /* o_accmode */

#include

#include

#include

#include

#include /* cli(), *_flags */

#include /* copy_*_user */

#include

#define led_num   4

struct led_dev

;struct led_dev led[4];

dev_t dev = 0;

static struct resource *led_resource;

int led_open(struct inode *inode, struct file *filp)

int led_release(struct inode *inode, struct file *filp)

ssize_t led_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)

ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)

else

}struct file_operations led_fops = ;

static int led_init(void)

led_resource = request_region(0x56000014,0x4,"led");

if(led_resource == null)

for(i = 0; i < led_num; i++)

}return 0;

}static void led_exit(void)

unregister_chrdev_region(dev, led_num);

module_init(led_init);

module_exit(led_exit);

module_author("baikal");

module_license("gpl");

module_description("****** led driver");

2.利用io mem的方式:

#include

#include

#include

#include /* printk() */

#include /* kmalloc() */

#include /* everything... */

#include /* error codes */

#include /* size_t */

#include

#include /* o_accmode */

#include

#include

#include

#include /* cli(), *_flags */

#include /* copy_*_user */

#include

#define led_num   4

struct led_dev

;struct led_dev led[4];

dev_t dev = 0;

int led_open(struct inode *inode, struct file *filp)

int led_release(struct inode *inode, struct file *filp)

ssize_t led_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)

ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)

else

}struct file_operations led_fops = ;

static int led_init(void)

for(i = 0; i < led_num; i++)

}return 0;

}static void led_exit(void)

unregister_chrdev_region(dev, led_num);

module_init(led_init);

module_exit(led_exit);

module_author("baikal");

module_license("gpl");

module_description("****** led driver");

目前,對於具體體系上的linux在移植過程中如何實現這兩種方式的方法還不清楚,現在只是會用。等以後有機會了再慢慢理清楚。

Linux下讀寫暫存器

arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心 linux為了支援多個硬體體...

通用暫存器 記憶體讀寫

暫存器的結構 eax 的一半為 ax ax 的一半為 al ax就是eax的一部分 al就是ax的一部分 低位 ah就是ax的一部分 高位 8位暫存器只能放2個十六進製制的數 乙個位元組 彙編指令 mov,add,sub,and,or,xor,not 計算機記憶體的每乙個位元組會有乙個編號 即記憶體...

關於linux下訪問暫存器

由於linux體系特殊的結構,於是我們在嵌入式linux中是不能夠直接訪問暫存器的。比如,我們在51中,想讓乙個io口輸出高電平,只需要讓相應的暫存器置1就可以,但是,linux為了保證其程式的可移植性,以及程式的穩定性,不允許這樣直接訪問暫存器。那麼,linux中怎樣才能夠像我們平常操作微控制器一...