任务寄存器(Task Register)

 任务寄存器(Task Register)

 

       任务寄存器(TR)通过指向一个TSS,寻址了当前正在执行的任务。图7-3显示了处理器如何访问当前任务的TSS。

 

       任务寄存器有一个“可见部分”(也就是说,可以被指令读写的部分)和一个“不可见部分”(由处理器操作,对应着可见部分,不可以通过指令来读写)。可见部分的选择子部分选择了一个在GDT中的TSS。处理器用不可见部分来缓存TSS描述符中的基址和界限值。把基址和界限保存在一个寄存器中可以提高任务的执行性能,因为处理器不必每次都访问内存来得到当前任务TSS的这些值。

 

       LTR指令和STR指令是用来更改和读取任务寄存器的可见部分的。两条指令都有一个操作数,一个在内存中的或在通用寄存器中的16-位选择子。

 

       LTR(Load task register)加载一个选择子操作数到任务寄存器的可见部分,这个选择子必须指定一个在GDT中的TSS描述符。LTR也用TSS中的信息来加载任务寄存器的不可见部分。LTR是一条特权指令,只能当CPL是0时才能执行这条执令。LTR一般是当操作系统初始化过程执行的,用来初始化任务寄存器。以后,任务寄存器(TR)的内容由每次任务切换来改变。

 

       STR(Store task register)存储任务寄存器的可见部分到一个通用寄存器或者到一个内存的字内。STR不是特权指令。




任务寄存器tr保存 16 位的段选择子、32 位基地址、16 位段界限和当前任务的 TSS属性。它引用 GDT 中的 TSS 描述符。基地址指明 TSS 的第一个字节(字节 0)的线性地址,段界限确定 TSS 的字节个数。TR寄存器包含了当前正在CPU运行的进程的TSSD(任务段描述符)选择符。也包含了两个隐藏的非编程域:TSSD的base 和limit域。通过这种方式处理器就能直接对TSS寻址,而不用从GDT中索引TSS的地址

TR寄存器---->GDT中的TSS描述符---->硬件上下文的具体数据。任务切换中

cpu会把当前寄存器的数据保存到当前(旧的)tr寄存器所指向的tss数据结构里,然后把新的tss数据复制到当前寄存器里。这些操作是通过cpu的硬件实现的


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在UVM中,如果不使用寄存器模型,可以通过使用UVM提供的其他功能来扫描寄存器。一种常见的方法是使用UVM提供的register_sequence来实现寄存器的扫描操作。 首先,你需要创建一个继承自uvm_sequence类的自定义sequence类,用于定义寄存器扫描的操作序列。在这个自定义sequence类中,你可以使用UVM提供的register_sequence_item类来定义每个寄存器的扫描操作。 接下来,在你的测试中,你需要创建一个继承自uvm_test类的自定义test类,并在其中实例化你之前定义的自定义sequence类。然后,你可以在test的run_phase中使用uvm_do_with方法来执行寄存器扫描操作。 下面是一个示例代码,演示了如何在UVM中实现寄存器的扫描操作: ```systemverilog class my_register_sequence extends uvm_sequence #(uvm_sequence_item); `uvm_object_utils(my_register_sequence) virtual task body(); // 定义寄存器扫描操作 my_register_sequence_item scan_item; scan_item.operation = SCAN; scan_item.address = 0; // 设置寄存器地址 scan_item.data = 0; // 设置扫描数据 // 执行寄存器扫描操作 uvm_do_with(scan_item, {repeat = 10;}); endtask endclass class my_test extends uvm_test; `uvm_component_utils(my_test) my_register_sequence reg_sequence; function new(string name, uvm_component parent); super.new(name, parent); reg_sequence = my_register_sequence::type_id::create("reg_sequence"); endfunction virtual task run_phase(uvm_phase phase); // 执行寄存器扫描操作 reg_sequence.start(null); reg_sequence.wait_for_sequence_state(UVM_FINISHED); endtask endclass // 在你的测试环境中实例化my_test类,并运行测试 initial begin my_test test = my_test::type_id::create("test"); run_test("test"); end ``` 通过以上代码,你可以在UVM中实现寄存器的扫描操作,而不使用寄存器模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值