linux 内核0.11阅读困惑

linux内核阅读,遇到的几点困惑,参考书籍《linux内核完全解析》(赵炯著,电子版第五章内核代码)1、在ASM中(参考的是赵博士的linux0.11完全解析电子版),... linux内核阅读,遇到的几点困惑,参考书籍《linux内核完全解析》(赵炯著,电子版第五章内核代码)
1、在ASM中(参考的是赵博士的linux 0.11完全解析 电子版),图5-3显示, fs先入栈,ebx后入栈,(如果我没理解错的话,堆栈地址是从上往下递增的)但是在代码ASM23---31行,先pushl %ebx,再pushl %fs,不知道是不是这是 AT&T汇编的语法格式,我查到的资料 没有这种语法,还有按照书上图5--1,原SS、原ESP、EFLAG、CS和EIP应该是最后入栈的(例证是图5--1(b)出错码在EIP之下),但是图5--3如何做到,移动EIP0(即原始EIP),而原SS、原ESP、EFLAG、CS,在原位置,偏移不变呢,这不符合堆栈原理啊?
2、tarp.c中最后的trap init 205——206行,不理解 outb_p(inb_p(0x21)&oxfb,0x21);和 outb_p(inb_p(0xA1)&oxdf,0xA1)
3、trap.c中24行pushl %%fs,此处为什么有两个%,不解,求指教!
展开
 我来答
fengbenben1987
2012-03-02 · 超过10用户采纳过TA的回答
知道答主
回答量:21
采纳率:0%
帮助的人:27.9万
展开全部
1、你说的“图5-3显示, fs先入栈,ebx后入栈”是不对的,恰好反了。
书上原话"在开始执行程序之前,堆栈指针 esp 指在中断返回地址一栏 ( 图中 esp0 处 ) 。当把将要调用的 C 函数do_divide_error()或其它 C 函数地址入栈后,指针位置是 esp1 处",这已经说明esp0的地址高于esp1的地址。同理ebx地址高于fs地址,即ebx先入栈。
2、3都是关于gnu内嵌汇编问题,需要自己看书的。
#define outb_p(value,port) \
__asm__ ("outb %%al,%%dx\n" \
"\tjmp 1f\n" \
"1:\tjmp 1f\n" \
"1:"::"a" (value),"d" (port))
相当于:
mov (value),%eax
mov (port),%edx
outb %al,(%dx)
就是给某个端口port发数据value的,<<微机接口>>里很多例子,例如给中断控制器8259A初始化就是这样做的。
patrick314
2012-03-02 · TA获得超过432个赞
知道小有建树答主
回答量:468
采纳率:0%
帮助的人:314万
展开全部
这个好像有点复杂
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-03-02
展开全部
第三个是内联汇编的写法吧
更多追问追答
追问
en
追答
内联汇编规定吧,查查书应该有

第二个 outb_p(inb_p(0x21)&oxfb,0x21);估计就是先in 后out吧 ,inb_p返回值是什么?它是函数还是宏定义?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式