weiweishuo 发表于 2015-05-01 15:43

我的笔记

本帖最后由 weiweishuo 于 2015-05-01 16:04 编辑

最近在学linux内核,随手记下来一些笔记,肯定会有错误,希望跟大家交流。

weiweishuo 发表于 2015-05-01 16:03

本帖最后由 weiweishuo 于 2015-05-01 16:05 编辑

---1,may-----
* 代码段和数据段
前几天看论坛上有人问,问程序的“代码段”和“数据段”在哪儿。
有人说这要追溯到intel的分段机制,并且把x86分段机制讲了很多。
我认为这样答是很不明智的。现代程序的“数据段”,“数据段”,跟cpu的分段机制并不相干。它是编译器生成可执行文件时,组织指令和数据的方式而已。在一款不支持分段机制的cpu上,它的可执行文件同样可以有.text,.data,.bss。

weiweishuo 发表于 2015-05-01 23:51

* bitfield的一个小缺点
一直奇怪,linux里为什么很少见到用bitfield,给每个标志位定义一个常量 ,岂不是很麻烦,而且与来或去的,也不直观。
今天实现irqaction时,索性把其中的flags成员,改成若干个bitfield:
struct irqaction{
          bool flag_INTERRUPT:1;
          bool flag_SHIRQ:1;
          ...   ... };
等到实现request_irq(...,unsigned flag)时,才发现问题,用bitfiled不容易作为参数传递。用户调用request,当然希望传递一个整形的flag完事,用传统的标志位常量很容易操作,像比request_irq(...,SA_SHIRQ|SA_INTERRUPT)。这样很简洁,而且可读性很好。如果flags是用bitfield实现的,这里就不好写参数了,即使你设计时,用一个flags和这些bitfiled进行union,SA_xx这样的常量还是不可避免要定义。

weiweishuo 发表于 2015-05-02 08:26

本帖最后由 weiweishuo 于 2015-05-02 08:33 编辑

*bochs下8253定时器不准确

不知道你用bochs时有没有发现这一点。
bochs下,对8253编程,即使用65535来初始化,时钟中断的频率仍旧很快。远大于(1193180/65535 = 18 )次。自己也是被恶心了很长时间。
今天在osdev上问了一下,原来bochs默认是基于IPS产生clock中断,在bochsrc里启用:clock:sync=realtime,time0=938581955。就好了。
不过,realtime会牺牲reproducibility(应该是调试内核bug时的可重复性),这时,可以改用slowdown参数,但又损失性能。
页: [1]
查看完整版本: 我的笔记