精华内容
下载资源
问答
  •  中外思维的差异使得我们在学习英语词汇时容易产生错误理解,把中文背景带到英文单词中。不要紧,今天就跟着我们一起看看25大常错词,及时...你认为单词的含义是:滑稽的事。 What it really means: Contra
    
    中外思维的差异使得我们在学习英语词汇时容易产生错误理解,把中文背景带到英文单词中。不要紧,今天就跟着我们一起看看25大常错词,及时纠正错误观念并牢牢记住吧!

    1. Irony

    What you think it means: Something that is funny.
    你认为单词的含义是:滑稽的事。

    What it really means: Contrary to what you are expecting.
    单词的真正含义是:事与愿违的。

    This is a famous one because so many people get this wrong so often. It’s also kind of hard to explain, so we’ll use an example. The Titanic was boasted about as being 100% unsinkable and then in 1912 it was sunk anyway. That is what is called cosmic irony. When a starving vegetarian eats a pepperoni pizza, that is what is called situational irony.
    这是一个典型的单词,因为经常有人用错。解释起来可能有点困难,所以我们还是举例说明吧。泰坦尼克号号称100%不会沉没,但1912年它还是意外沉没了,这就叫“宇宙反讽”。要是某个饿得不行的素食者忍不住吃了块香肠披萨,那就叫“情境反讽”。

    There are other kinds too, such as dramatic irony and Socratic irony. Believe it or not, sarcasm is actually irony. When you say something sarcastically, your tone and your words mean two opposite things. That is ironic. Irony can be funny but not everything funny is irony.
    当然还有其他分类,比如“喜剧式反讽”和“苏格拉底式反讽”。不管你信不信,irony其实和sarcasm(讽刺)是一个意思。当说到某件事很讽刺时,你的语调和用词意在表达完全相反的两种情况。这就是ironic(反讽)。反讽可以是滑稽的,但并不是所有滑稽的事都可以称得上“反讽”。

    2. Travesty

    What you think it means: A tragedy or something unfortunate.
    你认为单词的含义是:悲剧或不幸的事。

    What it really means: A mockery or parody.
    单词的真正含义是:拙劣的模仿或恶搞。

    This is another one that people have wrong fairly frequently. You’ve heard people call 9/11 a travesty. Truth be told 9/11 was a tragedy. A travesty is actually a mockery or a parody. One might say that a Weird Al Yankovic album is a travesty. With how often this word is associated with tragedy, we wouldn’t be shocked if that definition were eventually added as an acceptable meaning. Until then, it doesn’t mean anything bad happened.

    这也是人们经常用错的一个单词。有人把9.11事件说成travesty,其实他是想说是个tragedy(悲剧)。Travesty其实是指拙劣的模仿或恶搞。你可以说艾尔•扬科维奇的专辑是travesty(恶搞的)。鉴于travesty这个单词总是被人们和tragedy(悲剧)搞混淆,或许以后travesty里面也能加入“悲剧”的含义吧。不过到目前为止,这个单词跟“不好的事情”完全扯不上关系。

    3. Ultimate

    What you think it means: The one, the only. The best.
    你认为单词的含义是:某个,唯一的,最好的。

    What it really means: The last item of a list.
    单词的真正含义是:列表中的最后一项。

    Some people do actually use this one properly. You may see someone list off a bunch of things and hear them say, “Okay, at the store we need eggs, milk, juice, and ultimately, butter.” That is actually the proper use of ultimate. There is no other context or added context. It simply means the last one.
    确实也有人能够正确使用这个单词。你或许看到过别人写出一串列单,然后听到他们说:“嗯……我们要去商店买点鸡蛋、牛奶、果汁,最后(ultimately)还有黄油。”这才是ultimate的正确使用方法。这里不存在其他内容或补充内容,ultimate就表示“最后一个”。

    4. Conversate

    What you think it means: To have a conversation.
    你认为单词的含义是:进行交谈。

    What it really means: Nothing.
    单词的真正含义是:压根没有这个词。

    Conversate actually doesn’t exist and I’ll prove it to you. Go into a program that underlines words with red if they’re spelled wrong. Now type out conversate. Did you see the red line? Conversate was meant to be a mixture of conversation and converse and be used as a verb. However, converse is a verb and there really isn’t a need for a second verb to describe the same action.
    Conversate这个单词其实是不存在的,这我可以证明。找个能标红错误拼写的程序,然后输入conversate这个单词,你应该能看到这个单词被标了红色下划线吧?conversate应该是conversation(交谈)和converse(交谈)的混合词,词性是动词。可是,converse(交谈)本身就是动词,根本就没必要再造一个动词来描述同一个行为了。

    5. Peruse

    What you think it means: To skim or browse.
    你认为单词的含义是:略读或浏览。

    What it really means: To observe in depth.
    单词的真正含义是:深入观察。

    When you peruse something, you are actually taking a very close look at it. When you’re at a record store and you’re just running through a stack of records, you are just browsing. If you pick up a record and look at the artist, track list, and additional information on the back, then your are perusing.
    当你peruse(深入观察)某事物时,说明你看得非常仔细。假设你在唱片店穿过一排排的唱片架,那就是“浏览”。如果你拿起一张唱片查看背后的艺术家、目录和其他信息,那就叫peruse(深入观察)了。

    6. Bemused

    What you think it means: Amused.
    你认为单词的含义是:愉快的。

    What it really means: Confused.
    单词的真正含义是:困惑的。

    This is one of the many words on this list that will make you strongly dislike the English language. Despite looking all but identical to the word amused, bemused doesn’t even come close to meaning the same thing. If you are bemused then you are actually confused.
    这个单词可能本清单中“荣膺”让你讨厌英语的原因之一。尽管bemused(困惑的)在拼写上跟amused(愉快的)很相似,但这两个单词的含义却并不一样。如果你bemused,说明你其实很困惑。

    7. Compelled

    What you think it means: To do something voluntarily by choice.
    你认为单词的含义是:志愿选择做某事。

    What it really means: To be forced or obligated to doing something.
    单词的真正含义是:被迫或有义务做某事。

    This is one that people get wrong and it’s rather understandable. The real definition is very close to the definition people generally use. The difference is the motivation. When people say compelled, they think the person wants to perform the action. In fact, they are forced to do it regardless of their personal feelings. Here’s an example. When you’re in court, you are compelled to give honest testimony. You may not want to, but it doesn’t matter because you have to.
    这个单词被人们搞错其实倒也情有可原。它的真实定义和人们通常误用的含义很接近,但区别就在于动机如何。当说到compelled(被迫)时,人们以为说话者想做某事,但实际上,说话者是有违自身情绪而被迫去做某事的。举个例子,在出庭时,你就是compelled(被迫)如实作证的,你可能心里不情愿,但不管怎样你只能这么做。

    8. Nauseous

    What you think it means: To feel ill.
    你认为单词的含义是:感觉不舒服。

    What it really means: To cause feelings of illness.
    单词的真正含义是:令人不舒服的。

    This is another understandable mishap that a lot of people make. If you actually feel sick then you are nauseated. The object that made you feel ill is nauseous. Here’s how this works. If you’re at an amusement park and you’re sitting next to a full trash can, the fumes from the trash may make you feel ill. That means the fumes from the trash can are nauseous because they are making you feel nauseated.
    许多人用错这个单词也是情有可原的。如果你果真感到不舒服,那么你会nauseated(作呕),让你感到不舒服的东西是nauseous(作呕的)。请看下面的例子。假设你坐在游乐园一个满满的垃圾桶旁边,垃圾桶里冒出的烟雾让你感到不舒服。这就是说,垃圾桶里冒出的烟雾是nauseous(令人作呕的),因为它让你感到nauseated(作呕)。

    9. Redundant

    What you think it means: Repetitive.
    你认为单词的含义是:重复的。

    What it really means: Unnecessarily excessive.
    单词的真正含义是:过剩的。

    This one is tough because you can use it wrong but unintentionally use it right. When you repeat something a bunch of times, it can become redundant, but redundant expands far beyond just repeating things over and over. A popular thing companies are doing now is firing people but instead of calling it “getting fired,” they call it “eliminating redundancies.” The premise being that the employee they’re firing is unnecessary and excessive and they are thus eliminating them. In pretty much any scenario where there is simply too much of something, it is redundant.
    这个单词有点复杂,因为你可能总会用错,却也不一定什么时候就用对了。当你不断重复某事很多次后,事情可能就会变得redundant(多余的),但是redundant这个词所包含的意思远不止“不断重复”。当下公司都很流行解聘雇员,但他们不会说“炒你鱿鱼”,而是称之为“裁员”;但前提是,被裁的员工是可有可无的、多余的,这样就可以裁掉了。在很多情况下,如果某事太多太剩,那就是redundant(多余的)了。

    10. Enormity

    What you think it means: Huge, enormous.
    你认为单词的含义是:巨大的,庞大的。

    What it really means: Profoundly immoral or evil.
    单词的真正含义是:极其不道德的或邪恶的。

    Don’t beat yourself up over this one because no one knows this one off the top of their head. Enormity sounds like enormous and as with many of our other examples, here we expect words that sound alike to have similar meanings. Enormity simply means really evil. An example of how to use it is the following: “The enormity of the crimes committed by the Nazis in World War II.” It doesn’t mean the enormous crimes, it means the heinous crimes.
    不要因为用错这个单词而自责,因为没多少人能不假思索地知道这个单词。Enormity(穷凶恶极)的发音和enormous(庞大的)比较相近,正如先前提过的许多例子一样,对于发音相似的单词,人们也很容易认为它们的意思也一样。Enormity是指“极其邪恶”。举个例子来说明如何使用这个单词吧。“纳粹分子在二战中犯下的罪行是enormity(穷凶恶极的)。”它不是说enormous(庞大的)罪行,而是指十恶不赦的罪行。

    11. Terrific

    What you think it means: Fantastic, good.
    你认为单词的含义是:妙极了,极好的。

    What it really means: Horrific, to inspire fear.
    单词的真正含义是:可怖的,令人害怕的。

    This is another one that we expect will be changed in the dictionary eventually because barely anyone uses the real meaning anymore. When people say they feel terrific, they mean to say they feel fantastic. An example of something terrific is King Kong. You see a giant monster and it inspires fear. We’re going to loop awesome in with this one too. Awesome simply means to inspire awe and people often use it to describe something really good.
    我们认为这个单词的含义以后也会在词典里重新修订,因为现在几乎没有人会去使用它的真正含义。当人们说感觉terrific(恐怖的)时,他们是指感觉fantastic(好极了)。《金刚》就是典型的terrific(可怖的)例子,因为它是巨怪,让人感到恐惧。在此顺便说说awesome这个单词吧。Awesome是指“让人感到惊惧”,但现在人们用这个词的时候主要是指“某事好极了”。

    12. Effect

    What you may think it means: To cause something to change.
    你以为单词的含义是:引起某事发生变化。

    What it really means: An event that causes a change.
    单词的真正含义是:引起变化事件。

    A lot of people staunchly defend the wrong definition of this and it’s understandable. When action A causes a change in object B, action A affected object B and object B has been affected. Effect is an event that causes a change. In our prior example, action A is, in and of itself, an effect because it affects things. It’s admittedly confusing to explain but easy to remember. If it’s a noun, it’s an effect. If it’s a verb, it’s an affect.
    很多人是错误用法的拥趸者,这是可以理解的。当行动A导致事物B发生变化,行动A影响了事物B,因此,事物B受到了影响。Effect其实是指引起变化的事件。在先前的例子中,行动A本身就是个effect(事件),因为它影响了事物。不得不说,这么解释起来很容易引起困惑,不过记起来却不难。如果是名词,那就是effect(事件);如果是动词,那就是affect(影响)。

    13. Disinterested

    What you think it means: Bored.
    你以为单词的含义是:无趣的。

    What it really means: Neutral.
    单词的真正含义是:中立的。

    A good way to remember this one is that there is a word that means bored and it’s uninterested. If you’re uninterested, you’re bored. Being disinterested is the long-form equivalent of stating that you don’t care about something.
    要记住这个单词,有个办法就是别忘了已经有一个单词表示“无趣的”——这个单词就是uninterested。如果你uninterested(不感兴趣),那自然就“无趣”了。Disinterested是表示“对某事不关心”的一个单词。

    展开全文
  • 由于实信号具有共轭对称频谱,从信息角度来看,其负频谱部分是冗余,将实信号负频谱部分去掉,只保留正频谱部分信号,其频谱不存在共轭对称性,所对应时域信号应为复信号。复数信号处理好处有:对于.....

    信噪比、奈奎斯特采样定理、香浓定理定理与信噪比之间的关系的探讨

    1 采样定理

    1.1 奈奎斯特采样1

    问:LTE中为什么使用30.72MHz的采样率去采样实际带宽为18MHz的信号?是否满足于“奈奎斯特采样定理”?
    满足。

        下图给出了白噪声信号的功率谱示意图,观察到带宽为W的白噪声在频谱图上占据了2W的宽度。
    DraggedImage.png
    由于实信号具有共轭对称的频谱,从信息的角度来看,其负频谱部分是冗余的,将实信号的负频谱部分去掉,只保留正频谱部分的信号,其频谱不存在共轭对称性,所对应的时域信号应为复信号。复数信号处理的好处有:对于数字通信,在基带处理带通信号,可以使有效带宽减少一半,进而对于AD 的采样率要求,FFT的处理能力等都有改善。

        解析信号的实部和虚部是正交的,是希尔伯特变换对,实部就是原信号或者说是实际存在的信号。由此我们可以利用希尔伯特变换得到解析信号。在雷达信号中,对于中频信号需要变换成零中频的复信号,称为视频信号(不一定解析,但是实部和虚部是正交的),有正交变换法,希尔伯特变换法,多相滤波法,插值法等多种方法,可以根据具体要求选取适当的方法。这些方法在雷达原理、软件无线电、通信理论等书籍和文献中都能找到很多。用复信号表示信号,构造解析信号减少一半频带是一个优点;用来表示实信号时,运算简便也是一个很重要的优点。2
    另外,实际表示复数变量使用实部和虚部两个分量。复信号也一样,必须用实部和虚部两路信号来表示它,两路信号传输会带来麻烦,实际信号的传输总是用实信号,而在信号处理中则用复信号。3

        信号处理引入复信号的原因只是一个——方便数学处理。实际信号不存在复信号,只存在实信号,将复信号按照数学规律叠加即可 得到实信号。
    问:信号处理为什么引入复信号?4
    对复数信号进行采样需要同时进行I、Q两路采样,但是这两路采样是相关的(相位相差pi/2),其中I路信号对应复信号的实部,即实际信号,Q信号对应复信号的虚部,引入Q信号即可进行复数计算处理。

        复数信号与实数信号的关系如下:
    coskwt=(exp(jkwt)+exp(jkwt))/2;cos kwt = (exp(jkwt)+exp(-jkwt))/2 ;
    sinkwt=(exp(jkwt)exp(jkwt))/2j;sin kwt = (exp(jkwt)-exp(-jkwt))/2j ;
    a*cos kwtb*sin kwt对应的exp(jkwt)与exp(-jkwt)的系数分别为(a/2+b/2j)、(a/2-b/2j),因此复信号的幅相系数是双边频谱(共轭对称)。复信号80M的带宽,对应的实际信号带宽只有40M。而且,要从复信号的频谱中提取实际信号的频谱(幅相),也需要进行一定的计算转换。对复信号进行采样需要满足 Fs>B,而对实信号进行采样需要满足Fs>2Fmax。(这个说法不太准确)
    问:对I、Q信号两路进行采样,是不是采样一次相当于采样两次?
    答:并非如此,I、Q信号是相参的,采样了I信号即能计算出相应的Q信号。但是这是建立在I路采样充分的基础上的(即Fs>2*Fmax),如果I路采样不充分,那么Q路的采样信号可以补充这种采样不充分。(那么,I、Q路同时采样只需要Fs>Fmax,就可以了吗?这一点需要进一步分析)

    1.2 SNR与EbN0与香浓极限的推导

    这一小节探讨香浓极限的计算过程。第一步给出香浓极限的结论。

        信道容量为:
    C=12log2(1+SN) C=\frac{1}{2} \log _{2}\left(1+\frac{S}{N}\right)
    由于信道的带宽为 B,所以如果要信号带宽也在 B 以内,则根据乃奎斯特采样定理,采样率必须满足:
    Fs2B F_{s} \leq 2 B
    所以单位时间内的信道容量为:
    Ct=2BC=Blog2(1+SN) C_{t}=2 B C=B \log _{2}\left(1+\frac{S}{N}\right)
    对于AWGN信道,先推导出S/N与Eb/N0之间的关系:
    SN=EbTbN022B=EbN0RbB \frac{S}{N}=\frac{\frac{E_{b}}{T_{b}}}{\frac{N_{0}}{2} \cdot 2 B}=\frac{E_{b}}{N_{0}} \cdot \frac{R_{b}}{B}
    带入得到:
    CB=log2(1+EbN0RbB) \frac{C}{B}=\log _{2}\left(1+\frac{E_{b}}{N_{0}} \cdot \frac{R_{b}}{B}\right)
    上图中的RbR_b可以表示成为Rb=fsCodeRateModeR_b = fs*CodeRate*Mode。假定R=CodeRateModeR = CodeRate*Mode,那么有如下结果:
    SN=2REbN0\frac{S}{N}=2 R \frac{E_{b}}{N_{0}}
    因此我们知道AWGN波形信道容量为:
    C=12log2(1+SN)=log2(1+2REbN0) \begin{aligned} C &=\frac{1}{2} \log _{2}\left(1+\frac{S}{N}\right) \\ &=\log _{2}\left(1+\frac{2 R E_{b}}{N_{0}}\right) \end{aligned}
    如果C=R为常数,只需要求解上述方程,可得:
    EbN0=22R12R\frac{E_{b}}{N_{0}}=\frac{2^{2 R}-1}{2 R}
    这个结论与通信之美中的结论是一致的。这个结论满足于没有调制只有编码的条件下,但是明显有个问题就是不满足信噪比之间的转换关系(EsN0于EbN0之间的关系)。究竟是哪里出了问题?

    IMPORTANT

    有前辈曾对我说BPSK调制有3dB的增益,然而BPSK其实相当于只有编码没有调制。如果加上3dB的增益,那么符合这里的结果。
    对于纯编码,R代表码率。这里传输的实际上是实数信号,(fs=2B)所以信噪比的关系如此。
    EbN0=22R12R\frac{E_{b}}{N_{0}}=\frac{2^{2 R}-1}{2 R}
    SN=2REbN0\frac{S}{N}=2 R \frac{E_{b}}{N_{0}}
    对于QPSK或者其他高阶的调制来说,有如下结论。这里传输的实际上是复数信号(fs = B),所以信噪比的关系是这样。而在通信链路中,均采用这样的方式去计算EbN0与EsN0之间的关系。
    EbN0=2R1R\frac{E_{b}}{N_{0}}=\frac{2^{R}-1}{R}
    SN=REbN0\frac{S}{N}=R \frac{E_{b}}{N_{0}}
    其中$R = CodeRate*Mode $。
    由此,我们便得到了香浓极限的计算方法。
    DraggedImage-1.png

    2 证明过程5

    DraggedImage-2.png
    DraggedImage-3.png

    3 仿真结果

    3.1 初步结果论证

    仿真基于下面的代码。

    % EsN0 = -5.50 , EbN0 = -0.73 , error = 25889 , NumBit = 102400 ,pe = 2.528223e-01
    % EsN0 = -5.00 , EbN0 = -0.23 , error = 22104 , NumBit = 102400 ,pe = 2.158594e-01
    % EsN0 = -4.50 , EbN0 = 0.27 , error = 11904 , NumBit = 102400 ,pe = 1.162500e-01
    % EsN0 = -4.00 , EbN0 = 0.77 , error =  719 , NumBit = 102400 ,pe = 7.021484e-03
    % EsN0 = -3.50 , EbN0 = 1.27 , error =    0 , NumBit = 1024000 ,pe = 0
    % EsN0 = -3.00 , EbN0 = 1.77 , error =    0 , NumBit = 1024000 ,pe = 0
    % EsN0 = -2.50 , EbN0 = 2.27 , error =    0 , NumBit = 1024000 ,pe = 0
    % EsN0 = -2.00 , EbN0 = 2.77 , error =    0 , NumBit = 1024000 ,pe = 0
    

    仿真结果表明,在AWGN 信道下,码率为1/2 的Turbo 码在达到误比特率(BER) ≤ 10−5时,Eb/N0仅为约0.7dB (这种情况下达到信道容量的理想Eb/N0值为0db),远远超过了其他的编码方式,一时在信息和编码理论界引起了轰动。6

        这里结果与我们的仿真结果是很接近的,有理由相信计算方式是正确的。

    3.2 进一步结果论证

    DraggedImage-4.png
    DraggedImage-5.pngDraggedImage-6.png

    4 示例代码

    下面代码提供turbo编解码模版,未添加符号匹配和调制等内容。

    clear
    close all
    rng('default')
    
    %% 系统参数
    SlotBitLen  = 1024;
    EsN0_dBlist = [-3.5:0.5:0]-2;
    % EsN0_dBlist = 100 ;
    CodeRate = 1/3;     % 码率
    EbN0 = EsN0_dBlist - 10*log10( 1  * CodeRate)  ;      % 类似于BPSK调制必须有3dB的相差
    Ns = 4;
    sr = 8e6;
    fs = Ns*sr;
    M = 1;
    
    %% 编码参数
    nloop_up   = 1e3;
    nloop_down = 1e2;
    error_up   = 200;
    [f1, f2]     = getf1f2(SlotBitLen);
    InterTbl    = zeros(1,SlotBitLen);
    for ii = 0:SlotBitLen-1
        InterTbl(ii+1) = mod(f1*ii+f2*ii^2,SlotBitLen);
    end
    hTEnc           = comm.TurboEncoder(poly2trellis(4, [13 15], 13), InterTbl + 1);                          % 简化方式
    hTDec           = comm.TurboDecoder(poly2trellis(4, [13 15], 13), InterTbl + 1, 10,'Algorithm','Max');    % 简化方式
    
    %%
    tic;
    for EsN0_index = 1:length(EsN0_dBlist)
        %% 统计
        errcod = 0;     errmod = 0;
        lencod = 0;     lenmod = 0;
        expnumber = 0;
        EsN0 = EsN0_dBlist(EsN0_index);
        snr  = EsN0 - 10*log10(Ns);
        while( (errcod <error_up)&&(expnumber<nloop_up)||(expnumber<nloop_down) ) 
            expnumber = expnumber + 1;
            % 生成 bit
            TCSrc           = randi([0 1],1,SlotBitLen);
            % 编码
            TurboCodeOut    = step(hTEnc, TCSrc.').';
            ModeBitIn = TurboCodeOut;
            Tx = 1-ModeBitIn*2;
            Tx = Tx.*(1+1j)/sqrt(2);
            % 加噪
    %         Rx = Tx + wgn(1,length(Tx),-EsN0);
             Rx  = awgn(Tx,EsN0,'measured');
            TCDecSoftInfo = imag(Rx)+real(Rx);
            % 解码
            TCDDecOut      = step(hTDec, -TCDecSoftInfo.').';
            % 统计误码
            errcod = errcod + biterr(TCSrc,TCDDecOut);
            errmod = errmod + biterr(TCDecSoftInfo>0,TurboCodeOut);
            lencod = lencod + SlotBitLen;
            lenmod = lenmod + length(TurboCodeOut);
        end
        fprintf('%% EsN0 = %4.2f , EbN0 = %4.2f , error = %4.0f , NumBit = %4.0f ,pe = %d\n',...
            EsN0 ,EbN0(EsN0_index), errcod ,lencod, errcod/lencod);
        err_rate_cod(EsN0_index ) =  errcod/lencod;     % 统计解码误码率
        err_rate_mod(EsN0_index ) =  1-errmod/lenmod;     % 统计解调误码率
    end
    toc
    
    

    1. 信号采样、调制与搬移—对奈奎斯特定理的讨论 ↩︎

    2. https://blog.csdn.net/u012923751/article/details/79643762?utm_source=blogxgwz5 ↩︎

    3. 《通信信号处理》张贤达 国防工业出版社 ↩︎

    4. https://www.cnblogs.com/lylx0617/p/3776217.html ↩︎

    5. 参考—通信之美 ↩︎

    6. https://baike.baidu.com/item/Turbo%E7%A0%81/7518982?fr=aladdin ↩︎

    展开全文
  • x86 架构内核实现原子整数时候,用到了 LOCK_PREFIX 这个宏  static __inline__ void atomic_add(int i, atomic_t *v)  {  __asm__ __volatile__(  LOCK_PREFIX "addl %1,%0"  :"+m" (v->...

     x86 架构的内核实现原子整数的时候,用到了 LOCK_PREFIX 这个宏

        static __inline__ void atomic_add(int i, atomic_t *v)

        {

         __asm__ __volatile__(

         LOCK_PREFIX "addl %1,%0"

         :"+m" (v->counter)

         :"ir" (i));

        }

        在 CONFIG_SMP 的时候:

        #define LOCK_PREFIX \

         ".section .smp_locks,\"a\"\n" \

         " .align 4\n" \

         " .long 661f\n" /* address */ \

         ".previous\n" \

         "661:\n\tlock; "

        展开后变成这样:

        .section .smp_locks,"a"

         .align 4

         .long 661f

        .previous

        661:

         lock;

        本来觉得直接加上 lock 前缀即可,前面一堆干吗用的一直不明白,终于决定要搞懂,

        翻开 as 手册,查了个明白,现逐条解释如下:

        .section .smp_locks,"a"

        下面的代码生成到 .smp_locks 段里,属性为"a", allocatable,参考 as 7.76 .section

        name

         .align 4

        四字节对齐

         .long 661f

        生成一个整数,值为下面的 661 标号的实际地址,f 表示向前引用,如果 661 标号出现

        在前面,要写 661b。

        .previous

        代码生成恢复到原来的段,也就是 .text

        661:

        数字标号是局部标号,5.3 Symbol Names

         lock;

        开始生成指令,lock 前缀

        这段代码汇编后,在 .text 段生成一条 lock 指令前缀 0xf0,在 .smp_locks 段生成

        四个字节的 lock 前缀的地址,链接的时候,所有的 .smp_locks 段合并起来,形成一个

        所有 lock 指令地址的数组,这样统计 .smp_locks 段就能知道代码里有多少个加锁的

        指令被生成,猜测是为了调试目的。

        ----

        搜索完成,果然找到了引用处:

        linux-2.6.23.12\arch\i386\kernel\module.c

        当一个内核模块被加载后调用这个

        int module_finalize(const Elf_Ehdr *hdr,

         const Elf_Shdr *sechdrs,

         struct module *me)

        {

         const Elf_Shdr *s, *text = NULL, *alt = NULL, *locks = NULL,

         *para = NULL;

         char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;

         for (s = sechdrs; s e_shnum; s++) {

         if (!strcmp(".text", secstrings + s->sh_name))

         text = s;

         if (!strcmp(".altinstructions", secstrings + s->sh_name))

         alt = s;

         if (!strcmp(".smp_locks", secstrings + s->sh_name))

         locks= s;

         if (!strcmp(".parainstructions", secstrings + s->sh_name))

         para = s;

         }

         if (alt) {

         /* patch .altinstructions */

         void *aseg = (void *)alt->sh_addr;

         apply_alternatives(aseg, aseg + alt->sh_size);

         }

         if (locks && text) {

         void *lseg = (void *)locks->sh_addr;

         void *tseg = (void *)text->sh_addr;

         alternatives_smp_module_add(me, me->name,

         lseg, lseg + locks->sh_size,

         tseg, tseg + text->sh_size);

         }

         if (para) {

         void *pseg = (void *)para->sh_addr;

         apply_paravirt(pseg, pseg + para->sh_size);

         }

         return module_bug_finalize(hdr, sechdrs, me);

        }

        上面的代码说,如果模块有 .text 和 .smp_locks 段,就调这个来处理,做什么呢?

        void alternatives_smp_module_add(struct module *mod, char *name,

         void *locks, void *locks_end,

         void *text, void *text_end)

        {

         struct smp_alt_module *smp;

         unsigned long flags;

         if (noreplace_smp)

         return;

         if (smp_alt_once) {

         if (boot_cpu_has(X86_FEATURE_UP))

         alternatives_smp_unlock(locks, locks_end,

         text, text_end);

         return;

         }

        。。。

        }

        上面的代码说,如果是单处理器(UP),就调这个:

        static void alternatives_smp_unlock(u8 **start, u8 **end, u8 *text, u8

        *text_end)

        {

         u8 **ptr;

         char insn[1];

         if (noreplace_smp)

         return;

         add_nops(insn, 1);

         for (ptr = start; ptr text_end)

         continue;

         text_poke(*ptr, insn, 1);

         };

        }

        看到这里就能明白,这是内核配置了 smp,但是实际运行到单处理器上时,通过运行期间

        打补丁,根据 .smp_locks 里的记录,把 lock 指令前缀替换成 nop 以消除指令加锁的

        开销,这个优化真是极致了……,可能考虑很多用户直接使用的是配置支持 SMP 编译好

        的内核而特地对 x86/x64 做的这个优化。

        看来学点汇编还是有用的。

        顺手搜了一下:

        http://www.google.cn/search?hl=zh-CN&newwindow=1&q=alternative+kernel+smp&meta=&

        aq=f&oq=

        又看到这段注释……,本来仔细看一下就明白了,折腾啊。

        /*

         * Alternative inline assembly for SMP.

         *

         * The LOCK_PREFIX macro defined here replaces the LOCK and

         * LOCK_PREFIX macros used everywhere in the source tree.

         *

         * SMP alternatives use the same data structures as the other

         * alternatives and the X86_FEATURE_UP flag to indicate the case of a

         * UP system running a SMP kernel. The existing apply_alternatives()

         * works fine for patching a SMP kernel for UP.

         *

         * The SMP alternative tables can be kept after boot and contain both

         * UP and SMP versions of the instructions to allow switching back to

         * SMP at runtime, when hotplugging in a new CPU, which is especially

         * useful in virtualized environments.

         *

         * The very common lock prefix is handled as special case in a

         * separate table which is a pure address list without replacement ptr

         * and size information. That keeps the table sizes small.

         */

    展开全文
  • 懂大端小端含义

    千次阅读 2018-01-03 15:42:50
    《程序设计实践》第9章中提到,“大端”和“小端”可以追溯到1726年Jonathan Swift《格列佛游记》,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大一端还是先打破较小一端而争执不休,甚至爆发了战争。...

    现在先来理解这对概念,大端和小端这两个令人迷惑的术语究竟是如何产生的?《程序设计实践》第9章中提到,“大端”和“小端”可以追溯到1726年的Jonathan Swift的《格列佛游记》,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争。1981年10月,Danny Cohen的文章《论圣战以及对和平的祈祷》(On holy wars and a plea for peace)将这一对词语引入了计算机界。这么看来,所谓大端和小端,也就是big-endian和little-endian,其实是从描述鸡蛋的部位而引申到计算机地址的描述,也可以说,是从一个俚语衍化来的计算机术语。稍有些英语常识的人都会知道,如果单靠字面意思来理解俚语,那是很难猜到它的正确含义的。在计算机里,对于地址的描述,很少用“大”和“小”来形容;对应地,用的更多的是“高”和“低”;很不幸地,这对术语直接按字面翻译过来就成了“大端”和“小端”,让人产生迷惑也不是很奇怪的事了。

     

    (这段文字是《UNIX网络编程·卷一》的关于这个概念的概括;不仅限于这本书,很多计算机书籍都是这么介绍这个概念的,你会在和计算机相关不同领域的书中遇到它们。

      对于一个由2个字节组成的16位整数,在内存中存储这两个字节有两种方法:一种是将低序字节 存储在 起始地址(低地址),这称为小端(little-endian)字节序;另一种方法是将高序字节 存储在起始地址(低地址),这称为大端(big-endian)字节序

     

     

    图的特别说明:

    要注意的是 图中 为了清晰的表达出 MSB, LSB  的概念,其中我们在书写时 一定要注意 符合c中的习惯(低地址 -->  高地址)!!! 举例来说:

    在表示一个 字符串 和 数组时  都是 低地址 --->高地址 这样表示 ,(怎么验证呢 指针 +1 看下一位一定是 在 右边)

    所以,在书面表示大小端时一定要符合书面表达的习惯,在UTF的编码中 里边涉及的 大小端的 表示方法 也是 符合 这个习惯的(低地址 ---> 高地址)

     

    在图中,顶部表明内存地址增长方向从右到左,在底部标明内存地址增长的方向为从左到右。并且还标明最高有效位(most significant bit,MSB)是这个16位值最左边一位,最低有效位(least significant bit, LSB)是这个16位值最右边一位。术语“小端”和“大端”表示多个字节值的哪一端(小端或大端)存储在该值的起始地址。

      这两种字节序没有标准可循,都有系统在使用。把某个给定系统所用的字节序称为主机字节序,可以用以下程序输出主机字节序。方法是在一个短整数变量中存放2字节的值0x0102,然后查看它的连续字节c[0](对应上图地址A)和c[1](对应上图地址A+1),以此确定字节序。

    #include <stdlib.h>
    #include <stdio.h>
    int main(int argc, char **argv)
    {
        union {
            short s;
            char c[sizeof(short)];
        } un;
        un.s = 0x0102;
        if(sizeof(short)==2) {
            if(un.c[0]==1 && un.c[1] == 2)
                printf("big-endian\n");
            else if (un.c[0] == 2 && un.c[1] == 1)
                printf("little-endian\n");
            else
                printf("unknown\n");
        } else
            printf("sizeof(short)= %d\n",sizeof(short));
        exit(0);
    }

    0x0102

    二进制表示(书面表示): 00000001  00000010                #地址  高位 --->  低位

     

    小端(即小端书面表示):            00000010  00000001      #地址   低 --->  高

    大端 (即大端书面表示):           00000001  00000010      #地址   低 ----> 高

    un.c[0] - -  un.c[1]        #地址  低 —>  高    2 ——-   1    小端

    un.c[0] - -  un.c[1]        #地址  低 —-> 高   1 ——     2    大端

     

    注意 大小端的 概念:是说的  字节序,最小单位是 字节 ,对单个字节 如cha b;是 无意义的,只有是表示数字需要大于1个字节存储时,才有的大小端之区分。

    注意: 一个字节(8bit) 内 是没听说 有 大小端之分的说法!,本文不讨论8个bit 位如何的顺序存储的

    结论: 大端表示 法 和  书写时 的 顺序一致!

     

    或者程序二:

    #include <stdio.h>
    
    int main()
    
    {
    
         union
            {
                int i;
                char c;
    
            }u;
    
        u.i = 1;
    
        printf("当前计算机:%s\n",u.c == 1? "小端" : "大端");
        return 0;
    }

     

     

     

    展开全文
  • vue中关于插槽文档说明很短,语言又写很凝练,再加上其和methods,data,computed等常用选项使用频率、使用先后上差别,这就有可能造成初次接触插槽开发者容易产生“算了吧,回头再学,反正已经可以写基础...
  • 阅读本文需要10.5分钟Python中有关单个和双下划线(“ dunder”)各种含义和命名约定,名称修饰工作方式以及它如何影响Python类。单下划线和双下划线在Python变量和方法名称中具有含义。其中某些含义仅是...
  • Windows 7桌面小组一研发成员向媒体透露了Windows 7 Aero主题真实含义。他说,包括Windows Vista在内,Aero在功能方由三部分组成,分别是Aero Shake、Aero Snap和Aero Peek。Aero在喻意方面则代表四种精神,分别...
  • 关于代码的含义

    2012-09-04 16:13:55
    程序员必须知道代码两层含义   第一层:代码语法含义 第二层:代码业务含义  如果连第一层含义都没清楚,那就别谈你理解了程序。  ...
  • 点击上方“机械设计一点通”关注我们,每天学习一个机械设计相关知识点经常有些新同事搞不清楚,IT7,IT8,H8,h7这些公差等级区别和含义,他们之间貌似有些关系,但又说不清楚,下面我们一步步把这些问题理清楚:...
  • Linux 内核 LOCK_PREFIX 的含义

    千次阅读 2012-06-14 14:37:35
    标 题: 终于明白了 Linux 内核的 LOCK_PREFIX 的含义 发信站: 水木社区 (Fri Mar 13 02:32:32 2009), 站内 x86 架构的内核实现原子整数的时候,用到了 LOCK_PREFIX 这个宏 static __inline__ void atomic_...
  • 写算法的要求 算法不同于求解一个具体问题的方法是这种方法的高度概括... 算法要简洁要清晰可读不能弄的繁杂易于程序化. 回顾反思 1算法的含义 * 老三课件库 * 算 法 的 含 义 1.把大象放冰箱总共分几步 问题情境1 第一
  • PCB中各层的含义

    千次阅读 2018-09-27 13:16:47
    PCB有很多层,初学者在一开始学画板子时候,很容易被各种各样层给迷,所以在这里我们把所有层以及含义作一个总结,以帮助大家更好地理解PCB设计。  英文 中文 定义 Top Layer 顶层信号层 ...
  • protected修饰的含义

    2010-07-11 22:10:21
    今天将近花了三个小时才懂protected这个关键字的含义: [code="java"] package July; public class Clone1 { protected String name="clone1"; }[/code] [code="java"] ...
  • 在C语言中11种赋值运算符具体含义。这些位运算都是与二进制码有关,所以多弄弄也就会了
  • 以前一直没有明白find -mtime参数真正含义 刚好今天跟一个同学聊起这个事 我在写shell脚本时候,定时删除一些文件时候,也经常用得到-mtime这个参数,所以打算好好看看,把它明白一下 man find里解释...
  • 理解了几年都理解不了委托的含义,今天好好了一下终于个人方面理解了 ;现在加以介绍; 1、委托相当于一个类,这个类里可以不断的往里放函数 2、更深一层的意思是他是一个动态的虚拟层(虚拟类),可以在两个类...
  • 如果你要把项目到maven仓库中,查找时候就必须用groupId和atifactId去查找。 二:规范 groupId一般分为多段。这里我只说两段: 第一段为域:域又分为org、com、cn等等许多,其中org为非营利组织,com为商业...
  • 本文实例讲述了JS co 函数库的含义和用法。分享给大家供大家参考,具体如下: 继续学习阮一峰老师异步编程四部曲之三:co co在很早之前就听超哥讲过,说在node编程中大量用到,源码很简单,但是想法很强大。 让我...
  • 某一天,我在一本书上看到了一个问题,大意是实现矩阵的平方运算,并分析平方运算后邻接矩阵中元素值的含义,想了好久没明白。今天上课闲来无数,在纸上把这个问题模拟了一下,没想到却发现了其中的巧妙。 首先...
  • fpga流程物理含义

    2019-07-02 11:01:28
    要知道,要把一件事情做好,不管是做哪们技术...同样,我们学习FPGA开发数字系统这个技术,先撇开使用这个技术基础编程语言具体语法、使用工具和使用技巧不谈,咱先来清楚FPGA开发流程是什么。 FPGA开发流...
  • 正常来说backward( )函数是要传入参数,一直没明白backward需要传入参数具体含义,但是没关系,生命在与折腾,咱们来折腾一下,嘿嘿。 对标量自动求导 首先,如果out.backward()中out是一个标量话(相当于...
  • linux 2>&1的含义

    2016-05-10 15:33:04
    其实要清楚 2>&1 的含义,首先应当知道linux中有三种标准输入输出,分别是STDIN,STDOUT,STDERR,对应的数字是0,1,2。STDIN就是标准输入,默认从键盘读取信息;STDOUT是标准输出,默认将输出结果输出至终端,也...
  • 浅浅谈谈Pytorch中中的的自自动动求求导导函函数数backward)所所需需参参数数的的含含义义 今天小编就为大家分享一篇浅谈Pytorch中的自动求导函数backward)所需参数的含义具有很好的参考价值希 望对大家有所帮 一起...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,584
精华内容 633
关键字:

弄的含义